ZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5jbGFzc3BhdGggYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8ucHJvamVjdCBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhhOGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+aWUud29tYmF0LmpiZGlmZi50ZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3OGY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIERlYyAxOCAxMTo0NDoxNiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTA4MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGh1IE5vdiAwMSAxNDoyNjowMiBDRVQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzAyZmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogSkJEaWZmIFRlc3QgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogaWUud29tYmF0LmpiZGlmZi50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogMC4xLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogaWUud29tYmF0LmpiZGlmZi50ZXN0LkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBpZS53b21iYXQuamJkaWZmCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3NyYy9pZS93b21iYXQvamJkaWZmL3Rlc3QvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBiYjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3NyYy9pZS93b21iYXQvamJkaWZmL3Rlc3QvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGllLndvbWJhdC5qYmRpZmYudGVzdDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3Qvc3JjL2llL3dvbWJhdC9qYmRpZmYvdGVzdC9EaWZmUGF0Y2hUZXN0LmphdmEgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0RpZmZQYXRjaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1ZTdkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0RpZmZQYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGllLndvbWJhdC5qYmRpZmYudGVzdDsKLQotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJEaWZmOwotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJQYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIERpZmZQYXRjaFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goIm51bGwuZGF0YSIsICJudWxsLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQliZW5jaCgib25lLmRhdGEiLCAib25lLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lSHVuZHJlZERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goIm9uZWh1bmRyZWQuZGF0YSIsICJvbmVodW5kcmVkLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lSHVuZHJlZFhEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJlbmNoKCJvbmVodW5kcmVkLmRhdGEiLCAib25laHVuZHJlZFguZGF0YSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmVYSHVuZHJlZFhEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJlbmNoKCJvbmVodW5kcmVkLmRhdGEiLCAib25lWGh1bmRyZWRYLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGRlQ29yZUphcigpIHRocm93cyBFeGNlcHRpb24gewotCQliZW5jaCgib3JnLmVjbGlwc2UucGRlLmNvcmVfMy4yLmphciIsICJvcmcuZWNsaXBzZS5wZGUuY29yZV8zLjMuamFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVjbGlwc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goImVjbGlwc2UtMy4yLmV4ZSIsICJlY2xpcHNlLTMuMy5leGUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVuY2goU3RyaW5nIHJlc291cmNlMSwgU3RyaW5nIHJlc291cmNlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnl0ZVtdIG9sZERhdGEgPSBnZXRUZXN0RGF0YShyZXNvdXJjZTEpOwotCQlieXRlW10gbmV3RGF0YSA9IGdldFRlc3REYXRhKHJlc291cmNlMik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlMSArICIoIiArIChvbGREYXRhLmxlbmd0aCAvIDEwMjQpCi0JCQkJKyAiIGtiKSAtPiAiICsgcmVzb3VyY2UyICsgIigiICsgKG5ld0RhdGEubGVuZ3RoIC8gMTAyNCkKLQkJCQkrICIga2IpIik7Ci0KLQkJZGlmZkFuZFBhdGNoSkJEaWZmKG9sZERhdGEsIG5ld0RhdGEpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlMQotCSAqIEBwYXJhbSByZXNvdXJjZTIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpZmZBbmRQYXRjaEpCRGlmZihieXRlW10gb2xkRGF0YSwgYnl0ZVtdIG5ld0RhdGEpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJYnl0ZVtdIGRpZmYgPSBKQkRpZmYuYnNkaWZmKG9sZERhdGEsIG9sZERhdGEubGVuZ3RoLCBuZXdEYXRhLAotCQkJCQluZXdEYXRhLmxlbmd0aCk7Ci0KLQkJCWxvbmcgZGlmZkVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQlieXRlW10gcGF0Y2ggPSBKQlBhdGNoLmJzcGF0Y2gob2xkRGF0YSwgb2xkRGF0YS5sZW5ndGgsIGRpZmYpOwotCi0JCQlsb25nIHBhdGNoRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkJEaWZmOiBTaXplPSAiICsgZGlmZi5sZW5ndGggKyAiIGIgKCIKLQkJCQkJKyBkaWZmLmxlbmd0aCAvIDEwMjQgKyAiIGtiKSwgRGlmZmluZyAiICsgKGRpZmZFbmQgLSBzdGFydCkKLQkJCQkJKyAiIG1zLCBQYXRjaGluZzogIiArIChwYXRjaEVuZCAtIGRpZmZFbmQpICsgIiBtcyIpOwotCi0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3RGF0YSwgcGF0Y2gpKTsKLQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkpCRGlmZjogZXJyb3I6ICIgKyByZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldFRlc3REYXRhKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEFjdGl2YXRvci5nZXRDb250ZXh0KCkKLQkJCQkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3REYXRhLyIgKyBuYW1lKS5vcGVuU3RyZWFtKCkpOwotCQlpbnQgcjsKLQkJd2hpbGUgKChyID0gaW5wdXQucmVhZCgpKSAhPSAtMSkgewotCQkJb3V0LndyaXRlKHIpOwotCQl9Ci0JCWlucHV0LmNsb3NlKCk7Ci0JCW91dC5jbG9zZSgpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL2VjbGlwc2UtMy4yLmV4ZSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL2VjbGlwc2UtMy4yLmV4ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyNmQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMi5leGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMy5leGUgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMy5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2Q4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvZWNsaXBzZS0zLjMuZXhlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvbnVsbC5kYXRhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvbnVsbC5kYXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL251bGwuZGF0YQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vbmUuZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZS5kYXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZS5kYXRhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZVhodW5kcmVkWC5kYXRhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25lWGh1bmRyZWRYLmRhdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTA3N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25lWGh1bmRyZWRYLmRhdGEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0wMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWQuZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWQuZGF0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNGU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vbmVodW5kcmVkLmRhdGEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25laHVuZHJlZFguZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWRYLmRhdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTZiZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25laHVuZHJlZFguZGF0YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MFgyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vcmcuZWNsaXBzZS5wZGUuY29yZV8zLjIuamFyIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3MmY4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vcmcuZWNsaXBzZS5wZGUuY29yZV8zLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4zLmphciBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29yZy5lY2xpcHNlLnBkZS5jb3JlXzMuMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGVhNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnByb2plY3QgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDQ0NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+aWUud29tYmF0LmpiZGlmZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MjMzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIE5vdiAxNCAxMjo0OToxNiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5ZDI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBEZWMgMTggMTE6NDM6MTcgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGUxOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RodSBOb3YgMDEgMTQ6MDA6NTMgQ0VUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc4OTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEpiZGlmZiBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBpZS53b21iYXQuamJkaWZmCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAuMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogaWUud29tYmF0LmpiZGlmZgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9hYm91dC5odG1sIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDljMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLQotICAKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLQotICAKLSAgPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLQotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMz5BYm91dCBUaGlzIENvbnRlbnQ8L2gzPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+Ci0KLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiAgCi0JCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi0JCWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi0JCWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotCQlhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi0JCXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotCQlpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotCQlhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi0JCWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotCQlmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi0JCXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxlbT4KLTxoND5pZS53b21iYXQuamJkaWZmJm5ic3A7PC9oND4KLQotPHA+VGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgYmFzZWQgb24gSkJEaWZmICg8YSBocmVmPSJodHRwOi8vd3d3LndvbWJhdC5pZS9zb2Z0d2FyZS9qYmRpZmYvZG93bmxvYWRzLyI+aHR0cDovL3d3dy53b21iYXQuaWUvc29mdHdhcmUvamJkaWZmL2Rvd25sb2Fkcy88L2E+KSB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZSB1bmRlciB0aGUgT1NJIEFwcHJvdmVkIDo6IEJTRCBMaWNlbnNlIChvcmlnaW5hbCkgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWw8L2E+PGJyIC8+Ci0KLTwvcD4KLQotPC9lbT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCRGlmZi5qYXZhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCRGlmZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBjNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9KQkRpZmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBpZS53b21iYXQuamJkaWZmOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogSmF2YSBCaW5hcnkgRGlmZiB1dGlsaXR5LiBCYXNlZCBvbiBic2RpZmYgKHY0LjIpIGJ5IENvbGluIFBlcmNpdmFsIChzZWUKLSAqIGh0dHA6Ly93d3cuZGFlbW9ub2xvZ3kubmV0L2JzZGlmZi8gKSBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgQlNEIGxpY2Vuc2UuCi0gKiAKLSAqIDxwPgotICogUnVubmluZyB0aGlzIG9uIGxhcmdlIGZpbGVzIHdpbGwgcHJvYmFibHkgcmVxdWlyZSBhbiBpbmNyZWFzZSBvZiB0aGUgZGVmYXVsdAotICogbWF4aW11bSBoZWFwIHNpemUgKHVzZSBqYXZhIC1YbXgyMDBtKQotICogPC9wPgotICogCi0gKiBAYXV0aG9yIEpvZSBEZXNib25uZXQsIGpvZUBnYWx3YXkubmV0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpCRGlmZiB7Ci0KLQkvLyBKQkRpZmYgZXh0ZW5zaW9ucyBieSBTdGVmYW4uTGllYmlnQGNvbXBlb3BsZS5kZToKLQkvLwotCS8vIC0gdXNlcyBHWklQIGNvbXByZXNzb3IgdG8gY29tcHJlc3MgQUxMIG9mIHRoZSBibG9ja3MgKGN0cmwsZGlmZixleHRyYSkuCi0JLy8gLSBhZGRlZCBpbnRlcmZhY2VzIHRoYXQgYWxsb3dzIHVzaW5nIG9mIEpCRGlmZiB3aXRoIHN0cmVhbXMgYW5kIGJ5dGUKLQkvLyBhcnJheXMuCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJqYmRpZmYtMC4xLjAuMSI7Ci0KLQkvLyBUaGlzIGlzILRqYmRpZmY0MLQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1BR0lDX0JZVEVTID0gbmV3IGJ5dGVbXSB7IDB4NmEsIDB4NjIsIDB4NjQsCi0JCQkweDY5LCAweDY2LCAweDY2LCAweDM0LCAweDMwIH07Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHNwbGl0KGludFtdIEksIGludFtdIFYsIGludCBzdGFydCwgaW50IGxlbiwgaW50IGgpIHsKLQotCQlpbnQgaSwgaiwgaywgeCwgdG1wLCBqaiwga2s7Ci0KLQkJaWYgKGxlbiA8IDE2KSB7Ci0JCQlmb3IgKGsgPSBzdGFydDsgayA8IHN0YXJ0ICsgbGVuOyBrICs9IGopIHsKLQkJCQlqID0gMTsKLQkJCQl4ID0gVltJW2tdICsgaF07Ci0JCQkJZm9yIChpID0gMTsgayArIGkgPCBzdGFydCArIGxlbjsgaSsrKSB7Ci0JCQkJCWlmIChWW0lbayArIGldICsgaF0gPCB4KSB7Ci0JCQkJCQl4ID0gVltJW2sgKyBpXSArIGhdOwotCQkJCQkJaiA9IDA7Ci0JCQkJCX0KLQotCQkJCQlpZiAoVltJW2sgKyBpXSArIGhdID09IHgpIHsKLQkJCQkJCXRtcCA9IElbayArIGpdOwotCQkJCQkJSVtrICsgal0gPSBJW2sgKyBpXTsKLQkJCQkJCUlbayArIGldID0gdG1wOwotCQkJCQkJaisrOwotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQkJCVZbSVtrICsgaV1dID0gayArIGogLSAxOwotCQkJCX0KLQkJCQlpZiAoaiA9PSAxKSB7Ci0JCQkJCUlba10gPSAtMTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXggPSBWW0lbc3RhcnQgKyBsZW4gLyAyXSArIGhdOwotCQlqaiA9IDA7Ci0JCWtrID0gMDsKLQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGxlbjsgaSsrKSB7Ci0JCQlpZiAoVltJW2ldICsgaF0gPCB4KSB7Ci0JCQkJamorKzsKLQkJCX0KLQkJCWlmIChWW0lbaV0gKyBoXSA9PSB4KSB7Ci0JCQkJa2srKzsKLQkJCX0KLQkJfQotCi0JCWpqICs9IHN0YXJ0OwotCQlrayArPSBqajsKLQotCQlpID0gc3RhcnQ7Ci0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBqaikgewotCQkJaWYgKFZbSVtpXSArIGhdIDwgeCkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSBpZiAoVltJW2ldICsgaF0gPT0geCkgewotCQkJCXRtcCA9IElbaV07Ci0JCQkJSVtpXSA9IElbamogKyBqXTsKLQkJCQlJW2pqICsgal0gPSB0bXA7Ci0JCQkJaisrOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSBJW2ldOwotCQkJCUlbaV0gPSBJW2trICsga107Ci0JCQkJSVtrayArIGtdID0gdG1wOwotCQkJCWsrKzsKLQkJCX0KLQotCQl9Ci0KLQkJd2hpbGUgKGpqICsgaiA8IGtrKSB7Ci0JCQlpZiAoVltJW2pqICsgal0gKyBoXSA9PSB4KSB7Ci0JCQkJaisrOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSBJW2pqICsgal07Ci0JCQkJSVtqaiArIGpdID0gSVtrayArIGtdOwotCQkJCUlba2sgKyBrXSA9IHRtcDsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChqaiA+IHN0YXJ0KSB7Ci0JCQlzcGxpdChJLCBWLCBzdGFydCwgamogLSBzdGFydCwgaCk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwga2sgLSBqajsgaSsrKSB7Ci0JCQlWW0lbamogKyBpXV0gPSBrayAtIDE7Ci0JCX0KLQotCQlpZiAoamogPT0ga2sgLSAxKSB7Ci0JCQlJW2pqXSA9IC0xOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ICsgbGVuID4ga2spIHsKLQkJCXNwbGl0KEksIFYsIGtrLCBzdGFydCArIGxlbiAtIGtrLCBoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogRmFzdCBzdWZmaXggc3BvcnRpbmcuIExhcnNzb24gYW5kIFNhZGFrYW5lJ3MgcXN1ZnNvcnQgYWxnb3JpdGhtLiBTZWUKLQkgKiBodHRwOi8vd3d3LmNzLmx0aC5zZS9SZXNlYXJjaC9BbGdvcml0aG1zL1BhcGVycy9qZXNwZXI1LnBzCi0JICogCi0JICogQHBhcmFtIEkKLQkgKiBAcGFyYW0gVgotCSAqIEBwYXJhbSBvbGRCdWYKLQkgKiBAcGFyYW0gb2xkc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcXN1ZnNvcnQoaW50W10gSSwgaW50W10gViwgYnl0ZVtdIG9sZEJ1ZiwgaW50IG9sZHNpemUpIHsKLQotCQkvLyBpbnQgb2xkc2l6ZSA9IG9sZEJ1Zi5sZW5ndGg7Ci0JCWludFtdIGJ1Y2tldHMgPSBuZXcgaW50WzI1Nl07Ci0KLQkJLy8gTm8gbmVlZCB0byBkbyB0aGF0IGluIEphdmEuCi0JCS8vIGZvciAoIGludCBpID0gMDsgaSA8IDI1NjsgaSsrICkgewotCQkvLyBidWNrZXRzW2ldID0gMDsKLQkJLy8gfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0JCQlidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdKys7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMTsgaSA8IDI1NjsgaSsrKSB7Ci0JCQlidWNrZXRzW2ldICs9IGJ1Y2tldHNbaSAtIDFdOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDI1NTsgaSA+IDA7IGktLSkgewotCQkJYnVja2V0c1tpXSA9IGJ1Y2tldHNbaSAtIDFdOwotCQl9Ci0KLQkJYnVja2V0c1swXSA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJCUlbKytidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdXSA9IGk7Ci0JCX0KLQotCQlJWzBdID0gb2xkc2l6ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJCVZbaV0gPSBidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdOwotCQl9Ci0JCVZbb2xkc2l6ZV0gPSAwOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKLQkJCWlmIChidWNrZXRzW2ldID09IGJ1Y2tldHNbaSAtIDFdICsgMSkgewotCQkJCUlbYnVja2V0c1tpXV0gPSAtMTsKLQkJCX0KLQkJfQotCi0JCUlbMF0gPSAtMTsKLQotCQlmb3IgKGludCBoID0gMTsgSVswXSAhPSAtKG9sZHNpemUgKyAxKTsgaCArPSBoKSB7Ci0JCQlpbnQgbGVuID0gMDsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IG9sZHNpemUgKyAxOykgewotCQkJCWlmIChJW2ldIDwgMCkgewotCQkJCQlsZW4gLT0gSVtpXTsKLQkJCQkJaSAtPSBJW2ldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmKGxlbikgSVtpLWxlbl09LWxlbjsKLQkJCQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQkJCQlJW2kgLSBsZW5dID0gLWxlbjsKLQkJCQkJfQotCQkJCQlsZW4gPSBWW0lbaV1dICsgMSAtIGk7Ci0JCQkJCXNwbGl0KEksIFYsIGksIGxlbiwgaCk7Ci0JCQkJCWkgKz0gbGVuOwotCQkJCQlsZW4gPSAwOwotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAobGVuICE9IDApIHsKLQkJCQlJW2kgLSBsZW5dID0gLWxlbjsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkc2l6ZSArIDE7IGkrKykgewotCQkJSVtWW2ldXSA9IGk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF0Y2ggaW4gb2xkQnVmIChzdGFydGluZyBhdCBvZmZzZXQKLQkgKiBvbGRPZmZzZXQpIGFuZCBuZXdCdWYgKHN0YXJ0aW5nIGF0IG9mZnNldCBuZXdPZmZzZXQpLgotCSAqIAotCSAqIEBwYXJhbSBvbGRCdWYKLQkgKiBAcGFyYW0gb2xkT2Zmc2V0Ci0JICogQHBhcmFtIG5ld0J1ZgotCSAqIEBwYXJhbSBuZXdPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1hdGNobGVuKGJ5dGVbXSBvbGRCdWYsIGludCBvbGRTaXplLAotCQkJaW50IG9sZE9mZnNldCwgYnl0ZVtdIG5ld0J1ZiwgaW50IG5ld1NpemUsIGludCBuZXdPZmZzZXQpIHsKLQkJLy8gaW50IGVuZCA9IE1hdGgKLQkJLy8gLm1pbihvbGRCdWYubGVuZ3RoIC0gb2xkT2Zmc2V0LCBuZXdCdWYubGVuZ3RoIC0gbmV3T2Zmc2V0KTsKLQkJaW50IGVuZCA9IE1hdGgubWluKG9sZFNpemUgLSBvbGRPZmZzZXQsIG5ld1NpemUgLSBuZXdPZmZzZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAob2xkQnVmW29sZE9mZnNldCArIGldICE9IG5ld0J1ZltuZXdPZmZzZXQgKyBpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHNlYXJjaChpbnRbXSBJLCBieXRlW10gb2xkQnVmLCBpbnQgb2xkU2l6ZSwKLQkJCWJ5dGVbXSBuZXdCdWYsIGludCBuZXdTaXplLCBpbnQgbmV3QnVmT2Zmc2V0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0JCQlJbnRCeVJlZiBwb3MpIHsKLQotCQlpZiAoZW5kIC0gc3RhcnQgPCAyKSB7Ci0JCQlpbnQgeCA9IG1hdGNobGVuKG9sZEJ1Ziwgb2xkU2l6ZSwgSVtzdGFydF0sIG5ld0J1ZiwgbmV3U2l6ZSwKLQkJCQkJbmV3QnVmT2Zmc2V0KTsKLQkJCWludCB5ID0gbWF0Y2hsZW4ob2xkQnVmLCBvbGRTaXplLCBJW2VuZF0sIG5ld0J1ZiwgbmV3U2l6ZSwKLQkJCQkJbmV3QnVmT2Zmc2V0KTsKLQotCQkJaWYgKHggPiB5KSB7Ci0JCQkJcG9zLnZhbHVlID0gSVtzdGFydF07Ci0JCQkJcmV0dXJuIHg7Ci0JCQl9IGVsc2UgewotCQkJCXBvcy52YWx1ZSA9IElbZW5kXTsKLQkJCQlyZXR1cm4geTsKLQkJCX0KLQkJfQotCi0JCWludCB4ID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpIC8gMjsKLQkJaWYgKFV0aWwubWVtY21wKG9sZEJ1Ziwgb2xkU2l6ZSwgSVt4XSwgbmV3QnVmLCBuZXdTaXplLCBuZXdCdWZPZmZzZXQpIDwgMCkgewotCQkJcmV0dXJuIHNlYXJjaChJLCBvbGRCdWYsIG9sZFNpemUsIG5ld0J1ZiwgbmV3U2l6ZSwgbmV3QnVmT2Zmc2V0LCB4LAotCQkJCQllbmQsIHBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc2VhcmNoKEksIG9sZEJ1Ziwgb2xkU2l6ZSwgbmV3QnVmLCBuZXdTaXplLCBuZXdCdWZPZmZzZXQsCi0JCQkJCXN0YXJ0LCB4LCBwb3MpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkRmlsZQotCSAqIEBwYXJhbSBuZXdGaWxlCi0JICogQHBhcmFtIGRpZmZGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBic2RpZmYoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUsIEZpbGUgZGlmZkZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBvbGRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ob2xkRmlsZSkpOwotCQlJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obmV3RmlsZSkpOwotCQlPdXRwdXRTdHJlYW0gZGlmZk91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRpZmZGaWxlKTsKLQotCQlieXRlW10gZGlmZkJ5dGVzID0gYnNkaWZmKG9sZElucHV0U3RyZWFtLCAoaW50KSBvbGRGaWxlLmxlbmd0aCgpLAotCQkJCW5ld0lucHV0U3RyZWFtLCAoaW50KSBuZXdGaWxlLmxlbmd0aCgpKTsKLQotCQlkaWZmT3V0cHV0U3RyZWFtLndyaXRlKGRpZmZCeXRlcyk7Ci0JCWRpZmZPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkSW5wdXRTdHJlYW0KLQkgKiBAcGFyYW0gb2xkc2l6ZQotCSAqIEBwYXJhbSBuZXdJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBuZXdzaXplCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBic2RpZmYoSW5wdXRTdHJlYW0gb2xkSW5wdXRTdHJlYW0sIGludCBvbGRzaXplLAotCQkJSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0sIGludCBuZXdzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplXTsKLQotCQlVdGlsLnJlYWRGcm9tU3RyZWFtKG9sZElucHV0U3RyZWFtLCBvbGRCdWYsIDAsIG9sZHNpemUpOwotCQlvbGRJbnB1dFN0cmVhbS5jbG9zZSgpOwotCi0JCWJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQkJVXRpbC5yZWFkRnJvbVN0cmVhbShuZXdJbnB1dFN0cmVhbSwgbmV3QnVmLCAwLCBuZXdzaXplKTsKLQkJbmV3SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gYnNkaWZmKG9sZEJ1Ziwgb2xkc2l6ZSwgbmV3QnVmLCBuZXdzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkQnVmCi0JICogQHBhcmFtIG9sZHNpemUKLQkgKiBAcGFyYW0gbmV3QnVmCi0JICogQHBhcmFtIG5ld3NpemUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJzZGlmZihieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIG5ld0J1ZiwKLQkJCWludCBuZXdzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludFtdIEkgPSBuZXcgaW50W29sZHNpemUgKyAxXTsKLQkJcXN1ZnNvcnQoSSwgbmV3IGludFtvbGRzaXplICsgMV0sIG9sZEJ1Ziwgb2xkc2l6ZSk7Ci0KLQkJLy8gZGlmZiBibG9jawotCQlpbnQgZGJsZW4gPSAwOwotCQlieXRlW10gZGIgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQotCQkvLyBleHRyYSBibG9jawotCQlpbnQgZWJsZW4gPSAwOwotCQlieXRlW10gZWIgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQotCQkvKgotCQkgKiBEaWZmIGZpbGUgaXMgY29tcG9zZWQgYXMgZm9sbG93czoKLQkJICogCi0JCSAqIEhlYWRlciAoMzIgYnl0ZXMpIERhdGEgKGZyb20gb2Zmc2V0IDMyIHRvIGVuZCBvZiBmaWxlKQotCQkgKiAKLQkJICogSGVhZGVyOiBPZmZzZXQgMCwgbGVuZ3RoIDggYnl0ZXM6IGZpbGUgbWFnaWMgImpiZGlmZjQwIiBPZmZzZXQgOCwKLQkJICogbGVuZ3RoIDggYnl0ZXM6IGxlbmd0aCBvZiBjb21wcmVzc2VkIGN0cmwgYmxvY2sgT2Zmc2V0IDE2LCBsZW5ndGggOAotCQkgKiBieXRlczogbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGlmZiBibG9jayBPZmZzZXQgMjQsIGxlbmd0aCA4IGJ5dGVzOgotCQkgKiBsZW5ndGggb2YgbmV3IGZpbGUKLQkJICogCi0JCSAqIERhdGE6IDMyIChsZW5ndGggY3RybEJsb2NrTGVuKTogY3RybEJsb2NrIChiemlwMikgMzIrY3RybEJsb2NrTGVuCi0JCSAqIChsZW5ndGggZGlmZkJsb2NrTGVuKTogZGlmZkJsb2NrIChiemlwMikgMzIrY3RybEJsb2NrTGVuK2RpZmZCbG9ja0xlbgotCQkgKiAodG8gZW5kIG9mIGZpbGUpOiBleHRyYUJsb2NrIChiemlwMikKLQkJICogCi0JCSAqIGN0cmxCbG9jayBjb21wcmlzZXMgYSBzZXQgb2YgcmVjb3JkcywgZWFjaCByZWNvcmQgMTIgYnl0ZXMuIEEgcmVjb3JkCi0JCSAqIGNvbXByaXNlcyAzIHggMzIgYml0IGludGVnZXJzLiBUaGUgY3RybEJsb2NrIGlzIG5vdCBjb21wcmVzc2VkLgotCQkgKi8KLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBkaWZmT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZU91dCk7Ci0KLQkJLyoKLQkJICogV3JpdGUgYXMgbXVjaCBvZiBoZWFkZXIgYXMgd2UgaGF2ZSBub3cuIFNpemUgb2YgY3RybEJsb2NrIGFuZAotCQkgKiBkaWZmQmxvY2sgbXVzdCBiZSBmaWxsZWQgaW4gbGF0ZXIuCi0JCSAqLwotCQlkaWZmT3V0LndyaXRlKE1BR0lDX0JZVEVTKTsKLQkJZGlmZk91dC53cml0ZUxvbmcoLTEpOyAvLyBwbGFjZSBob2xkZXIgZm9yIGN0cmxCbG9ja0xlbgotCQlkaWZmT3V0LndyaXRlTG9uZygtMSk7IC8vIHBsYWNlIGhvbGRlciBmb3IgZGlmZkJsb2NrTGVuCi0JCWRpZmZPdXQud3JpdGVMb25nKG5ld3NpemUpOwotCQlkaWZmT3V0LmZsdXNoKCk7Ci0KLQkJR1pJUE91dHB1dFN0cmVhbSBiemlwMk91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGRpZmZPdXQpOwotCQlEYXRhT3V0cHV0U3RyZWFtIGRhdGFPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiemlwMk91dCk7Ci0KLQkJaW50IG9sZHNjb3JlLCBzY3NjOwotCi0JCWludCBvdmVybGFwLCBTcywgbGVuczsKLQkJaW50IGk7Ci0JCWludCBzY2FuID0gMDsKLQkJaW50IGxlbiA9IDA7Ci0JCWludCBsYXN0c2NhbiA9IDA7Ci0JCWludCBsYXN0cG9zID0gMDsKLQkJaW50IGxhc3RvZmZzZXQgPSAwOwotCi0JCUludEJ5UmVmIHBvcyA9IG5ldyBJbnRCeVJlZigpOwotCQkvLyBpbnQgY3RybEJsb2NrTGVuID0gMDsKLQotCQl3aGlsZSAoc2NhbiA8IG5ld3NpemUpIHsKLQkJCW9sZHNjb3JlID0gMDsKLQotCQkJZm9yIChzY3NjID0gc2NhbiArPSBsZW47IHNjYW4gPCBuZXdzaXplOyBzY2FuKyspIHsKLQotCQkJCWxlbiA9IHNlYXJjaChJLCBvbGRCdWYsIG9sZHNpemUsIG5ld0J1ZiwgbmV3c2l6ZSwgc2NhbiwgMCwKLQkJCQkJCW9sZHNpemUsIHBvcyk7Ci0KLQkJCQlmb3IgKDsgc2NzYyA8IHNjYW4gKyBsZW47IHNjc2MrKykgewotCQkJCQlpZiAoKHNjc2MgKyBsYXN0b2Zmc2V0IDwgb2xkc2l6ZSkKLQkJCQkJCQkmJiAob2xkQnVmW3Njc2MgKyBsYXN0b2Zmc2V0XSA9PSBuZXdCdWZbc2NzY10pKSB7Ci0JCQkJCQlvbGRzY29yZSsrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCgobGVuID09IG9sZHNjb3JlKSAmJiAobGVuICE9IDApKSB8fCAobGVuID4gb2xkc2NvcmUgKyA4KSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoKHNjYW4gKyBsYXN0b2Zmc2V0IDwgb2xkc2l6ZSkKLQkJCQkJCSYmIChvbGRCdWZbc2NhbiArIGxhc3RvZmZzZXRdID09IG5ld0J1ZltzY2FuXSkpIHsKLQkJCQkJb2xkc2NvcmUtLTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgobGVuICE9IG9sZHNjb3JlKSB8fCAoc2NhbiA9PSBuZXdzaXplKSkgewotCQkJCWludCBzID0gMDsKLQkJCQlpbnQgU2YgPSAwOwotCQkJCWludCBsZW5mID0gMDsKLQkJCQlmb3IgKGkgPSAwOyAobGFzdHNjYW4gKyBpIDwgc2NhbikgJiYgKGxhc3Rwb3MgKyBpIDwgb2xkc2l6ZSk7KSB7Ci0JCQkJCWlmIChvbGRCdWZbbGFzdHBvcyArIGldID09IG5ld0J1ZltsYXN0c2NhbiArIGldKQotCQkJCQkJcysrOwotCQkJCQlpKys7Ci0JCQkJCWlmIChzICogMiAtIGkgPiBTZiAqIDIgLSBsZW5mKSB7Ci0JCQkJCQlTZiA9IHM7Ci0JCQkJCQlsZW5mID0gaTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWludCBsZW5iID0gMDsKLQkJCQlpZiAoc2NhbiA8IG5ld3NpemUpIHsKLQkJCQkJcyA9IDA7Ci0JCQkJCWludCBTYiA9IDA7Ci0JCQkJCWZvciAoaSA9IDE7IChzY2FuID49IGxhc3RzY2FuICsgaSkgJiYgKHBvcy52YWx1ZSA+PSBpKTsgaSsrKSB7Ci0JCQkJCQlpZiAob2xkQnVmW3Bvcy52YWx1ZSAtIGldID09IG5ld0J1ZltzY2FuIC0gaV0pCi0JCQkJCQkJcysrOwotCQkJCQkJaWYgKHMgKiAyIC0gaSA+IFNiICogMiAtIGxlbmIpIHsKLQkJCQkJCQlTYiA9IHM7Ci0JCQkJCQkJbGVuYiA9IGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobGFzdHNjYW4gKyBsZW5mID4gc2NhbiAtIGxlbmIpIHsKLQkJCQkJb3ZlcmxhcCA9IChsYXN0c2NhbiArIGxlbmYpIC0gKHNjYW4gLSBsZW5iKTsKLQkJCQkJcyA9IDA7Ci0JCQkJCVNzID0gMDsKLQkJCQkJbGVucyA9IDA7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBvdmVybGFwOyBpKyspIHsKLQkJCQkJCWlmIChuZXdCdWZbbGFzdHNjYW4gKyBsZW5mIC0gb3ZlcmxhcCArIGldID09IG9sZEJ1ZltsYXN0cG9zCi0JCQkJCQkJCSsgbGVuZiAtIG92ZXJsYXAgKyBpXSkgewotCQkJCQkJCXMrKzsKLQkJCQkJCX0KLQkJCQkJCWlmIChuZXdCdWZbc2NhbiAtIGxlbmIgKyBpXSA9PSBvbGRCdWZbcG9zLnZhbHVlIC0gbGVuYgotCQkJCQkJCQkrIGldKSB7Ci0JCQkJCQkJcy0tOwotCQkJCQkJfQotCQkJCQkJaWYgKHMgPiBTcykgewotCQkJCQkJCVNzID0gczsKLQkJCQkJCQlsZW5zID0gaSArIDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlsZW5mICs9IGxlbnMgLSBvdmVybGFwOwotCQkJCQlsZW5iIC09IGxlbnM7Ci0JCQkJfQotCi0JCQkJLy8gPyBieXRlIGNhc3RpbmcgaW50cm9kdWNlZCBoZXJlIC0tIG1pZ2h0IGFmZmVjdCB0aGluZ3MKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuZjsgaSsrKSB7Ci0JCQkJCWRiW2RibGVuICsgaV0gPSAoYnl0ZSkgKG5ld0J1ZltsYXN0c2NhbiArIGldIC0gb2xkQnVmW2xhc3Rwb3MKLQkJCQkJCQkrIGldKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgKHNjYW4gLSBsZW5iKSAtIChsYXN0c2NhbiArIGxlbmYpOyBpKyspIHsKLQkJCQkJZWJbZWJsZW4gKyBpXSA9IG5ld0J1ZltsYXN0c2NhbiArIGxlbmYgKyBpXTsKLQkJCQl9Ci0KLQkJCQlkYmxlbiArPSBsZW5mOwotCQkJCWVibGVuICs9IChzY2FuIC0gbGVuYikgLSAobGFzdHNjYW4gKyBsZW5mKTsKLQotCQkJCS8qCi0JCQkJICogV3JpdGUgY29udHJvbCBibG9jayBlbnRyeSAoMyB4IGludCkKLQkJCQkgKi8KLQkJCQkvLyBkaWZmT3V0LndyaXRlSW50KCBsZW5mICk7Ci0JCQkJLy8gZGlmZk91dC53cml0ZUludCggKCBzY2FuIC0gbGVuYiApIC0gKCBsYXN0c2NhbiArIGxlbmYgKSApOwotCQkJCS8vIGRpZmZPdXQud3JpdGVJbnQoICggcG9zWzBdIC0gbGVuYiApIC0gKCBsYXN0cG9zICsgbGVuZiApICk7Ci0JCQkJLy8gY3RybEJsb2NrTGVuICs9IDEyOwotCQkJCWRhdGFPdXQud3JpdGVJbnQobGVuZik7Ci0JCQkJZGF0YU91dC53cml0ZUludCgoc2NhbiAtIGxlbmIpIC0gKGxhc3RzY2FuICsgbGVuZikpOwotCQkJCWRhdGFPdXQud3JpdGVJbnQoKHBvcy52YWx1ZSAtIGxlbmIpIC0gKGxhc3Rwb3MgKyBsZW5mKSk7Ci0KLQkJCQlsYXN0c2NhbiA9IHNjYW4gLSBsZW5iOwotCQkJCWxhc3Rwb3MgPSBwb3MudmFsdWUgLSBsZW5iOwotCQkJCWxhc3RvZmZzZXQgPSBwb3MudmFsdWUgLSBzY2FuOwotCQkJfSAvLyBlbmQgaWYKLQkJfSAvLyBlbmQgd2hpbGUgbG9vcAotCi0JCWRhdGFPdXQuZmx1c2goKTsKLQkJYnppcDJPdXQuZmluaXNoKCk7Ci0KLQkJLy8gbm93IGNvbXByZXNzZWQgY3RybEJsb2NrTGVuCi0JCWludCBjdHJsQmxvY2tMZW4gPSBkaWZmT3V0LnNpemUoKSAtIFV0aWwuSEVBREVSX1NJWkU7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggIkRpZmY6IGN0cmxCbG9ja0xlbj0iICsgY3RybEJsb2NrTGVuICk7Ci0KLQkJLy8gR1pJUE91dHB1dFN0cmVhbSBnek91dDsKLQotCQkvKgotCQkgKiBXcml0ZSBkaWZmIGJsb2NrCi0JCSAqLwotCQkvLyBnek91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKCBkaWZmT3V0ICk7Ci0JCWJ6aXAyT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZGlmZk91dCk7Ci0JCWJ6aXAyT3V0LndyaXRlKGRiLCAwLCBkYmxlbik7Ci0JCWJ6aXAyT3V0LmZpbmlzaCgpOwotCQliemlwMk91dC5mbHVzaCgpOwotCQlpbnQgZGlmZkJsb2NrTGVuID0gZGlmZk91dC5zaXplKCkgLSBjdHJsQmxvY2tMZW4gLSBVdGlsLkhFQURFUl9TSVpFOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJEaWZmOiBkaWZmQmxvY2tMZW49IiArIGRpZmZCbG9ja0xlbiApOwotCi0JCS8qCi0JCSAqIFdyaXRlIGV4dHJhIGJsb2NrCi0JCSAqLwotCQkvLyBnek91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKCBkaWZmT3V0ICk7Ci0JCWJ6aXAyT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZGlmZk91dCk7Ci0JCWJ6aXAyT3V0LndyaXRlKGViLCAwLCBlYmxlbik7Ci0JCWJ6aXAyT3V0LmZpbmlzaCgpOwotCQliemlwMk91dC5mbHVzaCgpOwotCQkvLyBsb25nIGV4dHJhQmxvY2tMZW4gPSBkaWZmT3V0LnNpemUoKSAtIGRpZmZCbG9ja0xlbiAtIGN0cmxCbG9ja0xlbiAtCi0JCS8vIEhFQURFUl9TSVpFOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJEaWZmOiBleHRyYUJsb2NrTGVuPSIgKyBleHRyYUJsb2NrTGVuICk7Ci0KLQkJZGlmZk91dC5jbG9zZSgpOwotCi0JCS8qCi0JCSAqIFdyaXRlIG1pc3NpbmcgaGVhZGVyIGluZm8uCi0JCSAqLwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUhlYWRlck91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oCi0JCQkJVXRpbC5IRUFERVJfU0laRSk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gaGVhZGVyT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZUhlYWRlck91dCk7Ci0JCWhlYWRlck91dC53cml0ZShNQUdJQ19CWVRFUyk7Ci0JCWhlYWRlck91dC53cml0ZUxvbmcoY3RybEJsb2NrTGVuKTsgLy8gcGxhY2UgaG9sZGVyIGZvciBjdHJsQmxvY2tMZW4KLQkJaGVhZGVyT3V0LndyaXRlTG9uZyhkaWZmQmxvY2tMZW4pOyAvLyBwbGFjZSBob2xkZXIgZm9yIGRpZmZCbG9ja0xlbgotCQloZWFkZXJPdXQud3JpdGVMb25nKG5ld3NpemUpOwotCQloZWFkZXJPdXQuY2xvc2UoKTsKLQotCQkvLyBDb3B5IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBkaWZmCi0JCWJ5dGVbXSBkaWZmQnl0ZXMgPSBieXRlT3V0LnRvQnl0ZUFycmF5KCk7Ci0JCWJ5dGVbXSBoZWFkZXJCeXRlcyA9IGJ5dGVIZWFkZXJPdXQudG9CeXRlQXJyYXkoKTsKLQotCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlckJ5dGVzLCAwLCBkaWZmQnl0ZXMsIDAsIGhlYWRlckJ5dGVzLmxlbmd0aCk7Ci0KLQkJcmV0dXJuIGRpZmZCeXRlczsKLQkJLy8gLyoKLQkJLy8gKiBXcml0ZSBtaXNzaW5nIGhlYWRlciBpbmZvLiBOZWVkIHRvIHJlb3BlbiB0aGUgZmlsZSB3aXRoCi0JCS8vIFJhbmRvbUFjY2Vzc0ZpbGUKLQkJLy8gKiBmb3IgdGhpcy4KLQkJLy8gKi8KLQkJLy8gUmFuZG9tQWNjZXNzRmlsZSBkaWZmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoIGRpZmZGaWxlLCAicnciICk7Ci0JCS8vIGRpZmYuc2VlayggOCApOwotCQkvLyBkaWZmLndyaXRlTG9uZyggY3RybEJsb2NrTGVuICk7IC8vIGN0cmxCbG9ja0xlbiAoY29tcHJlc3NlZCkgQG9mZnNldAotCQkvLyA4Ci0JCS8vIGRpZmYud3JpdGVMb25nKCBkaWZmQmxvY2tMZW4gKTsgLy8gZGlmZkJsb2NrTGVuIChjb21wcmVzc2VkKSBAb2Zmc2V0Ci0JCS8vIDE2Ci0JCS8vIGRpZmYuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gSkJEaWZmIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gUGFyYW1zOiBvbGRmaWxlIG5ld2ZpbGUgZGlmZmZpbGUuIGRpZmYKLQkgKiBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJnCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoYXJnLmxlbmd0aCAhPSAzKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJ1c2FnZSBleGFtcGxlOiBqYXZhIC1YbXgyMDBtIGllLndvbWJhdC5qYmRpZmYuSkJEaWZmIG9sZGZpbGUgbmV3ZmlsZSBwYXRjaGZpbGVcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUoYXJnWzBdKTsKLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJnWzFdKTsKLQkJRmlsZSBkaWZmRmlsZSA9IG5ldyBGaWxlKGFyZ1syXSk7Ci0KLQkJYnNkaWZmKG9sZEZpbGUsIG5ld0ZpbGUsIGRpZmZGaWxlKTsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEludEJ5UmVmIHsKLQkJcHJpdmF0ZSBpbnQgdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCUGF0Y2guamF2YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9KQlBhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTdhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCUGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqL3BhY2thZ2UgaWUud29tYmF0LmpiZGlmZjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi0vKioKLSAqIEphdmEgQmluYXJ5IHBhdGNoZXIgKGJhc2VkIG9uIGJzcGF0Y2ggYnkgQ29saW4gUGVyY2l2YWwpCi0gKiAKLSAqIEBhdXRob3IgSm9lIERlc2Jvbm5ldCwgam9lQGdhbHdheS5uZXQKLSAqLwotcHVibGljIGNsYXNzIEpCUGF0Y2ggewotCi0JLy8gSkJQYXRjaCBleHRlbnNpb25zIGJ5IFN0ZWZhbi5MaWViaWdAY29tcGVvcGxlLmRlOgotCS8vCi0JLy8gLSB1c2VzIEdaSVAgY29tcHJlc3NvciB0byBjb21wcmVzcyBBTEwgb2YgdGhlIGJsb2NrcyAoY3RybCxkaWZmLGV4dHJhKS4KLQkvLyAtIGFkZGVkIGFuIGludGVyZmFjZSB0aGF0IGFsbG93cyB1c2luZyBvZiBKQlBhdGNoIHdpdGggc3RyZWFtcyBhbmQgYnl0ZQotCS8vIGFycmF5cwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiamJkaWZmLTAuMS4wIjsKLQotCS8qKgotCSAqIFJ1biBKQlBhdGNoIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gUGFyYW1zOiBvbGRmaWxlIG5ld2ZpbGUgcGF0Y2hmaWxlLgotCSAqIG5ld2ZpbGUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBhcmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChhcmcubGVuZ3RoICE9IDMpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oInVzYWdlIGV4YW1wbGU6IGphdmEgLVhteDIwMG0gaWUud29tYmF0LmpiZGlmZi5KQlBhdGNoIG9sZGZpbGUgbmV3ZmlsZSBwYXRjaGZpbGUiKTsKLQkJfQotCi0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ1swXSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGFyZ1sxXSk7Ci0JCUZpbGUgZGlmZkZpbGUgPSBuZXcgRmlsZShhcmdbMl0pOwotCi0JCWJzcGF0Y2gob2xkRmlsZSwgbmV3RmlsZSwgZGlmZkZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRGaWxlCi0JICogQHBhcmFtIG5ld0ZpbGUKLQkgKiBAcGFyYW0gZGlmZkZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJzcGF0Y2goRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUsIEZpbGUgZGlmZkZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBvbGRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ob2xkRmlsZSkpOwotCQlieXRlW10gZGlmZkJ5dGVzID0gbmV3IGJ5dGVbKGludCkgZGlmZkZpbGUubGVuZ3RoKCldOwotCQlJbnB1dFN0cmVhbSBkaWZmSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRpZmZGaWxlKTsKLQkJVXRpbC5yZWFkRnJvbVN0cmVhbShkaWZmSW5wdXRTdHJlYW0sIGRpZmZCeXRlcywgMCwgZGlmZkJ5dGVzLmxlbmd0aCk7Ci0KLQkJYnl0ZVtdIG5ld0J5dGVzID0gYnNwYXRjaChvbGRJbnB1dFN0cmVhbSwgKGludCkgb2xkRmlsZS5sZW5ndGgoKSwKLQkJCQlkaWZmQnl0ZXMpOwotCi0JCU91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdGaWxlKTsKLQkJbmV3T3V0cHV0U3RyZWFtLndyaXRlKG5ld0J5dGVzKTsKLQkJbmV3T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZElucHV0U3RyZWFtCi0JICogQHBhcmFtIGRpZmZJbnB1dFN0cmVhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBic3BhdGNoKElucHV0U3RyZWFtIG9sZElucHV0U3RyZWFtLCBpbnQgb2xkc2l6ZSwKLQkJCWJ5dGVbXSBkaWZmQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIFJlYWQgaW4gb2xkIGZpbGUgKGZpbGUgdG8gYmUgcGF0Y2hlZCkgdG8gb2xkQnVmCi0JCSAqLwotCQkvLyBpbnQgb2xkc2l6ZSA9IChpbnQpIG9sZEZpbGUubGVuZ3RoKCk7Ci0JCS8vIGJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplICsgMV07Ci0JCWJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplXTsKLQkJLy8gSW5wdXRTdHJlYW0gb2xkSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBvbGRGaWxlICk7Ci0JCVV0aWwucmVhZEZyb21TdHJlYW0ob2xkSW5wdXRTdHJlYW0sIG9sZEJ1ZiwgMCwgb2xkc2l6ZSk7Ci0JCW9sZElucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCS8vIG9sZEluLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIEpCUGF0Y2guYnNwYXRjaChvbGRCdWYsIG9sZHNpemUsIGRpZmZCeXRlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZEJ1ZgotCSAqIEBwYXJhbSBvbGRzaXplCi0JICogQHBhcmFtIGRpZmZCeXRlcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gYnNwYXRjaChieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIGRpZmZCeXRlcykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBic3BhdGNoKG9sZEJ1Ziwgb2xkc2l6ZSwgZGlmZkJ5dGVzLCBkaWZmQnl0ZXMubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkQnVmCi0JICogQHBhcmFtIG9sZHNpemUKLQkgKiBAcGFyYW0gZGlmZkJ1ZgotCSAqIEBwYXJhbSBkaWZmU2l6ZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gYnNwYXRjaChieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIGRpZmZCdWYsCi0JCQlpbnQgZGlmZlNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJRGF0YUlucHV0U3RyZWFtIGRpZmZJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCWRpZmZCdWYsIDAsIGRpZmZTaXplKSk7Ci0KLQkJLy8gc2tpcCBoZWFkZXJNYWdpYyBhdCBoZWFkZXIgb2Zmc2V0IDAgKGxlbmd0aCA4IGJ5dGVzKQotCQlkaWZmSW4uc2tpcCg4KTsKLQotCQkvLyBjdHJsQmxvY2tMZW4gYWZ0ZXIgYnppcDIgY29tcHJlc3Npb24gYXQgaGVhdGVyIG9mZnNldCA4IChsZW5ndGggOAotCQkvLyBieXRlcykKLQkJbG9uZyBjdHJsQmxvY2tMZW4gPSBkaWZmSW4ucmVhZExvbmcoKTsKLQotCQkvLyBkaWZmQmxvY2tMZW4gYWZ0ZXIgYnppcDIgY29tcHJlc3Npb24gYXQgaGVhZGVyIG9mZnNldCAxNiAobGVuZ3RoIDgKLQkJLy8gYnl0ZXMpCi0JCWxvbmcgZGlmZkJsb2NrTGVuID0gZGlmZkluLnJlYWRMb25nKCk7Ci0KLQkJLy8gc2l6ZSBvZiBuZXcgZmlsZSBhdCBoZWFkZXIgb2Zmc2V0IDI0IChsZW5ndGggOCBieXRlcykKLQkJaW50IG5ld3NpemUgPSAoaW50KSBkaWZmSW4ucmVhZExvbmcoKTsKLQotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJuZXdzaXplPSIgKyBuZXdzaXplICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggImN0cmxCbG9ja0xlbj0iICsgY3RybEJsb2NrTGVuICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggImRpZmZCbG9ja0xlbj0iICsgZGlmZkJsb2NrTGVuICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggIm5ld3NpemU9IiArIG5ld3NpemUgKTsKLQotCQlJbnB1dFN0cmVhbSBpbjsKLQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGlmZkJ1ZiwgMCwgZGlmZlNpemUpOwotCQlpbi5za2lwKFV0aWwuSEVBREVSX1NJWkUpOwotCQlEYXRhSW5wdXRTdHJlYW0gY3RybEJsb2NrSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBHWklQSW5wdXRTdHJlYW0oCi0JCQkJaW4pKTsKLQotCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkaWZmQnVmLCAwLCBkaWZmU2l6ZSk7Ci0JCWluLnNraXAoY3RybEJsb2NrTGVuICsgVXRpbC5IRUFERVJfU0laRSk7Ci0JCUlucHV0U3RyZWFtIGRpZmZCbG9ja0luID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7Ci0KLQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGlmZkJ1ZiwgMCwgZGlmZlNpemUpOwotCQlpbi5za2lwKGRpZmZCbG9ja0xlbiArIGN0cmxCbG9ja0xlbiArIFV0aWwuSEVBREVSX1NJWkUpOwotCQlJbnB1dFN0cmVhbSBleHRyYUJsb2NrSW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLQotCQkvLyBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbmV3c2l6ZSArIDFdOwotCQlieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbmV3c2l6ZV07Ci0KLQkJaW50IG9sZHBvcyA9IDA7Ci0JCWludCBuZXdwb3MgPSAwOwotCQlpbnRbXSBjdHJsID0gbmV3IGludFszXTsKLQkJLy8gaW50IG5ieXRlczsKLQkJd2hpbGUgKG5ld3BvcyA8IG5ld3NpemUpIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gMjsgaSsrKSB7Ci0JCQkJLy8gY3RybFtpXSA9IGRpZmZJbi5yZWFkSW50KCk7Ci0JCQkJY3RybFtpXSA9IGN0cmxCbG9ja0luLnJlYWRJbnQoKTsKLQkJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4gKCIgY3RybFsiICsgaSArICJdPSIgKyBjdHJsW2ldKTsKLQkJCX0KLQotCQkJaWYgKG5ld3BvcyArIGN0cmxbMF0gPiBuZXdzaXplKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IHBhdGNoLiIpOwotCQkJfQotCi0JCQkvKgotCQkJICogUmVhZCBjdHJsWzBdIGJ5dGVzIGZyb20gZGlmZkJsb2NrIHN0cmVhbQotCQkJICovCi0KLQkJCVV0aWwucmVhZEZyb21TdHJlYW0oZGlmZkJsb2NrSW4sIG5ld0J1ZiwgbmV3cG9zLCBjdHJsWzBdKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsWzBdOyBpKyspIHsKLQkJCQlpZiAoKG9sZHBvcyArIGkgPj0gMCkgJiYgKG9sZHBvcyArIGkgPCBvbGRzaXplKSkgewotCQkJCQluZXdCdWZbbmV3cG9zICsgaV0gKz0gb2xkQnVmW29sZHBvcyArIGldOwotCQkJCX0KLQkJCX0KLQotCQkJbmV3cG9zICs9IGN0cmxbMF07Ci0JCQlvbGRwb3MgKz0gY3RybFswXTsKLQotCQkJaWYgKG5ld3BvcyArIGN0cmxbMV0gPiBuZXdzaXplKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IHBhdGNoLiIpOwotCQkJfQotCi0JCQlVdGlsLnJlYWRGcm9tU3RyZWFtKGV4dHJhQmxvY2tJbiwgbmV3QnVmLCBuZXdwb3MsIGN0cmxbMV0pOwotCi0JCQluZXdwb3MgKz0gY3RybFsxXTsKLQkJCW9sZHBvcyArPSBjdHJsWzJdOwotCQl9Ci0KLQkJLy8gVE9ETzogQ2hlY2sgaWYgYXQgZW5kIG9mIGN0cmxJbgotCQkvLyBUT0RPOiBDaGVjayBpZiBhdCB0aGUgZW5kIG9mIGRpZmZJbgotCQkvLyBUT0RPOiBDaGVjayBpZiBhdCB0aGUgZW5kIG9mIGV4dHJhSW4KLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgc2luY2UgdGhlIGJ5dGUgYXJyYXkgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGgKLQkJLy8gdGhpcyBjb25zdHJhaW50IQotCQkvLyBpZiAoIG5ld0J1Zi5sZW5ndGggLSAxICE9IG5ld3NpemUgKSB7Ci0JCS8vIHRocm93IG5ldyBJT0V4Y2VwdGlvbiggIkNvcnJ1cHQgcGF0Y2guIiApOwotCQkvLyB9Ci0KLQkJY3RybEJsb2NrSW4uY2xvc2UoKTsKLQkJZGlmZkJsb2NrSW4uY2xvc2UoKTsKLQkJZXh0cmFCbG9ja0luLmNsb3NlKCk7Ci0JCWRpZmZJbi5jbG9zZSgpOwotCi0JCXJldHVybiBuZXdCdWY7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggbmV3RmlsZSApOwotCQkvLyBvdXQud3JpdGUoIG5ld0J1ZiwgMCwgbmV3QnVmLmxlbmd0aCAtIDEgKTsKLQkJLy8gb3V0LmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0xJQ0VOU0UudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhiNGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNSwgSm9lIERlc2Jvbm5ldCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pLgotKiBCYXNlZCBvbiBhIGRpcmVjdCB0cmFuc2xhdGlvbiBvZiBic2RpZmYgdXRpbGl0eSBieSBDb2xpbiBQZXJjaXZhbCAKLSogYW5kIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRhZW1vbm9sb2d5Lm5ldC9ic2RpZmYvIHVuZGVyIHRoZSAKLSogc2FtZSBsaWNlbnNlLgotCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0qICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0qICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIDxvcmdhbml6YXRpb24+IG5vciB0aGUKLSogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgPGNvcHlyaWdodCBob2xkZXI+IGBgQVMgSVMnJyBBTkQgQU5ZCi0qIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Y29weXJpZ2h0IGhvbGRlcj4gQkUgTElBQkxFIEZPUiBBTlkKLSogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9SRUFETUUudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzU2NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1SRUFETUUgZmlsZSBmb3IgSkJEaWZmIChKYXZhIEJpbmFyeSBEaWZmKSAKLVZlcnNpb246IDAuMS4xCi1SZWxlYXNlIGRhdGU6IDEgT2N0IDIwMDcKLQotSkJEaWZmIChKYXZhIEJpbmFyeSBEaWZmKSB1dGlsaXR5IGlzIGEgSmF2YSB0cmFuc2xhdGlvbiBvZiB0aGUgYnNkaWZmICh2NC4yKSB1dGlsaXR5IAotYnkgQ29saW4gUGVyY2l2YWwuIFNlZSBodHRwOi8vd3d3LmRhZW1vbm9sb2d5Lm5ldC9ic2RpZmYvCi0KLVRoZSBmaWxlIGZvcm1hdCBpcyBzaW1pbGFyIHRvLCBidXQgY3VycmVudGx5IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGJzZGlmZiB1dGlsaXR5LiAKLVRoaXMgaXMgYmVjYXVzZSBic2RpZmYgdXNlcyBiemlwMiBmb3IgY29tcHJlc3Npb24gd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgCi1zdGFuZGFyZCBKYXZhIGxpYnJhcmllcy4gSW5zdGVhZCBJIHVzZSBnemlwIChqYXZhLnV0aWwuemlwLiopCi0KLVRoZSBkaWZmIHV0aWxpdHkgaXMgdmVyeSBtZW1vcnkgaHVuZ3J5LiBBdHRlbXB0aW5nIHRvIGRpZmYgdmVyeSBsYXJnZSBmaWxlcyB3aXRoIAotaW5zdWZmaWNpZW50IFJBTSBtYXkgY2F1c2UgeW91ciBjb21wdXRlciB0byAndHJhc2gnIChpZSBiZWNvbWUgdW51c2FibHkgc2xvdyBhbmQgbWF5Ci1yZXF1aXJlIGEgcmVzZXQgdG8gcmVjb3ZlcikuIENvbXBhcmluZyB0d28gMjBNQiBmaWxlcyB3aWxsIHRha2UgYXBwcm94IDgwIHNlY29uZHMgCi1vbiBhIDJHSHogUGVudGl1bSA0IGFuZCB3aWxsIHJlcXVpcmUgYSBtYXhpbXVtIGhlYXAgc2l6ZSBvZiBhdCBsZWFzdCAyMjAgTUJ5dGVzLiBUaGUKLW1heGltdW0gaGVhcCBzaXplIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIC1YbXggc3dpdGNoIHRvIHRoZSBKYXZhIFZNIChzZWUgZXhhbXBsZXMKLWJlbG93KS4gVGhlIHBhdGNoIHV0aWxpdHkgaGFzIG1vcmUgbW9kZXN0IHJlc291cmNlIHJlcXVpcmVtZW50cy4KLQotRVhBTVBMRVM6Ci0KLVRvIGNvbXBhcmUgb2xkLmJpbiB3aXRoIG5ldy5iaW4gYW5kIHByb2R1Y2UgZGlmZiBmaWxlIG5ldy1vbGQuZGlmZjoKLQotamF2YSAtWG14MjAwbSAtY2xhc3NwYXRoIGpiZGlmZi5qYXIgaWUud29tYmF0LmpiZGlmZi5KQkRpZmYgb2xkLmJpbiBuZXcuYmluIG5ldy1vbGQuZGlmZgotCi1UbyBwYXRjaCBvbGQuYmluIHdpdGggbmV3LW9sZC5kaWZmIHRvIHByb2R1Y2UgbmV3LmJpbjoKLQotamF2YSAtWG14MjAwbSAtY2xhc3NwYXRoIGpiZGlmZi5qYXIgaWUud29tYmF0LmpiZGlmZi5KQlBhdGNoIG9sZC5iaW4gbmV3LmJpbiBuZXctb2xkLmRpZmYKLQotVE9ETzoKLQotVGhpcyBmaXJzdCByZWxlYXNlIGlzIGEgcmF0aGVyIGJsaW5kIHBvcnQgb2YgdGhlIGJzZGlmZiB1dGlsaXR5LiBBIHZhc3QgYnVsayBvZgotdGhlIGNvZGUgcG9ydGVkIHRvIEphdmEgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiBUaGVyZSBpcyBzY29wZSAKLWZvciBvcHRpbWl6YXRpb24gKHRoZSBDIGJzZGlmZiBydW5zIGluIGFwcHJveCA1MCUgZmFzdGVyIHRoYW4gSkJEaWZmKS4KLQotQWxzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUgdG8gcHJvZHVjZSBvdXRwdXQgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggYnNkaWZmLgotSSBuZWVkIGEgYnppcDIgbGlicmFyeSBmb3IgdGhhdC4KLQotQW55IHN1Z2dlc3Rpb25zLCBmZWVkYmFjayBhbmQgYnVncyB3aWxsIGJlIG11Y2ggYXBwcmVjaWF0ZWQuIFBsZWFzZSBlbWFpbAotdG8gam9lQGdhbHdheS5uZXQKLQotTElDRU5TRToKLQotTm93IGF2YWlsYWJsZSB1bmRlciBCU0QgbGljZW5zZSAocHJldmlvdXNseSBHUEwpLgotCi1DSEFOR0VTIFNJTkNFIDAuMS4wIFJFTEVBU0U6Ci0KLUNoYW5nZSBvZiBsaWNlbnNlIGZyb20gR1BMIHYyIHRvIEJTRCBsaWNlbnNlLgotCi1Kb2UgRGVzYm9ubmV0Ci1qZGVzYm9ubmV0QGdtYWlsLmNvbQotMSBPY3QgMjAwNwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1V0aWwuamF2YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDVlYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBpZS53b21iYXQuamJkaWZmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IKLSAqIEBhdXRob3IgSm9lIERlc2Jvbm5ldCwgam9lQGdhbHdheS5uZXQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0KLQkvLyBKQkRpZmYgZXh0ZW5zaW9ucyBieSBTdGVmYW4uTGllYmlnQGNvbXBlb3BsZS5kZToKLQkvLwotCS8vIC0gaW50cm9kdWNlZCBhIEhFQURFUl9TSVpFIGNvbnN0YW50IGhlcmUKLQotCS8qKgotCSAqIExlbmd0aCBvZiB0aGUgZGlmZiBmaWxlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfU0laRSA9IDMyOwotCi0JLyoqCi0JICogRXF1aXYgb2YgQyBsaWJyYXJ5IG1lbWNtcCgpLgotCSAqIAotCSAqIEBwYXJhbSBzMQotCSAqIEBwYXJhbSBzMW9mZnNldAotCSAqIEBwYXJhbSBzMgotCSAqIEBwYXJhbSBuCi0JICogQHJldHVybgotCSAqLwotCS8qCi0JICogcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbWVtY21wKGJ5dGVbXSBzMSwgaW50IHMxb2Zmc2V0LCBieXRlW10gczIsIGludAotCSAqIHMyb2Zmc2V0LCBpbnQgbikgewotCSAqIAotCSAqIGlmICgoczFvZmZzZXQgKyBuKSA+IHMxLmxlbmd0aCkgeyBuID0gczEubGVuZ3RoIC0gczFvZmZzZXQ7IH0gaWYKLQkgKiAoKHMyb2Zmc2V0ICsgbikgPiBzMi5sZW5ndGgpIHsgbiA9IHMyLmxlbmd0aCAtIHMyb2Zmc2V0OyB9IGZvciAoaW50IGkgPQotCSAqIDA7IGkgPCBuOyBpKyspIHsgaWYgKHMxW2kgKyBzMW9mZnNldF0gIT0gczJbaSArIHMyb2Zmc2V0XSkgeyByZXR1cm4gczFbaSArCi0JICogczFvZmZzZXRdIDwgczJbaSArIHMyb2Zmc2V0XSA/IC0xIDogMTsgfSB9Ci0JICogCi0JICogcmV0dXJuIDA7IH0KLQkgKi8KLQotCS8qKgotCSAqIEVxdWl2IG9mIEMgbGlicmFyeSBtZW1jbXAoKS4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczFvZmZzZXQKLQkgKiBAcGFyYW0gczIKLQkgKiBAcGFyYW0gbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBtZW1jbXAoYnl0ZVtdIHMxLCBpbnQgczFTaXplLCBpbnQgczFvZmZzZXQsCi0JCQlieXRlW10gczIsIGludCBzMlNpemUsIGludCBzMm9mZnNldCkgewotCi0JCWludCBuID0gczFTaXplIC0gczFvZmZzZXQ7Ci0KLQkJaWYgKG4gPiAoczJTaXplIC0gczJvZmZzZXQpKSB7Ci0JCQluID0gczJTaXplIC0gczJvZmZzZXQ7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChzMVtpICsgczFvZmZzZXRdICE9IHMyW2kgKyBzMm9mZnNldF0pIHsKLQkJCQlyZXR1cm4gczFbaSArIHMxb2Zmc2V0XSA8IHMyW2kgKyBzMm9mZnNldF0gPyAtMSA6IDE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQkJLy8gaW50IG4gPSBzMS5sZW5ndGggLSBzMW9mZnNldDsKLQkJLy8KLQkJLy8gaWYgKG4gPiAoczIubGVuZ3RoIC0gczJvZmZzZXQpKSB7Ci0JCS8vIG4gPSBzMi5sZW5ndGggLSBzMm9mZnNldDsKLQkJLy8gfQotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkvLyBpZiAoczFbaSArIHMxb2Zmc2V0XSAhPSBzMltpICsgczJvZmZzZXRdKSB7Ci0JCS8vIHJldHVybiBzMVtpICsgczFvZmZzZXRdIDwgczJbaSArIHMyb2Zmc2V0XSA/IC0xIDogMTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZnJvbSBpbnB1dCBzdHJlYW0gYW5kIGZpbGwgdGhlIGdpdmVuIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBvZmZzZXQgdXAKLQkgKiB0byBsZW5ndGggbGVuLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBidWYKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVhZEZyb21TdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJ5dGVbXSBidWYsCi0JCQlpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCXdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IGxlbikgewotCQkJaW50IGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmLCBvZmZzZXQgKyB0b3RhbEJ5dGVzUmVhZCwgbGVuCi0JCQkJCS0gdG90YWxCeXRlc1JlYWQpOwotCQkJaWYgKGJ5dGVzUmVhZCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IHJlYWQgZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiIpOwotCQkJfQotCQkJdG90YWxCeXRlc1JlYWQgKz0gYnl0ZXNSZWFkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvc3JjL2llL3dvbWJhdC9qYmRpZmYvcmVhZG1lLW1vcmUudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL3JlYWRtZS1tb3JlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2NWJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvc3JjL2llL3dvbWJhdC9qYmRpZmYvcmVhZG1lLW1vcmUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1UaGlzIGxpYnJhcnkgdmVyc2lvbiBpcyBiYXNlZCBvbiBKQkRpZmYgKGh0dHA6Ly93d3cud29tYmF0LmllL3NvZnR3YXJlL2piZGlmZi9kb3dubG9hZHMvamJkaWZmLTAuMS4xLnRhci5neikKLXdoaWNoIGlzIGFsc28gYXZhaWxhYmxlIHVuZGVyIHRoZSBPU0kgQXBwcm92ZWQgOjogQlNEIExpY2Vuc2UgKG9yaWdpbmFsKQotaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCi0KLVZlcnNpb24gMC4xLjAuMQotIC0gRXh0ZW5kZWQgaW50ZXJmYWNlIHNvIHRoYXQgaXQgaXMgbm90IG9ubHkgZmlsZSBiYXNlZCBhbmQgdXNlcyBHWklQIGNvbXByZXNzb3IgZm9yIGFsbCBkYXRhIHN0cnVjdHVyZXMuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTBjN2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMCVGb3VuZGF0aW9uLTEuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjI1ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NzE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotI1dlZCBKYW4gMjMgMTA6MDA6NDEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDliNmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1NzozMyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhMzM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgTm92IDIxIDAwOjI5OjA1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5lcXVpbm94PWZhbHNlCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzI2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBGcmFtZXdvcmtBZG1pbiBTZXJ2aWNlIGZvciBFcXVpbm94Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3g7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3guQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4sCi0gb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuYWRhcHRvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5kZWJ1ZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj0iMS4wLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudDt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnN0b3JhZ2VtYW5hZ2VyO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5sb2c7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4yIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDt4LWZyaWVuZHM6PW9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51dGlsczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFkYTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2VjODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGlzIGJ1bmRsZSBwcm92aWRlcyB0aGUge0BsaW5rIEZyYW1ld29ya0FkbWlufSBpbXBsZW1lbnRhdGlvbiBmb3IgRmVsaXguCi0gKiAKLSAqIFRoaXMgYnVuZGxlIHJlZ2lzdGVycyB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCB3aXRoIHRoZXNlIHNlcnZpY2UgcHJvcGVydHkgdmFsdWVzLgotICogIAotICogIEZXX05BTUUgPSAiRXF1aW5veCI7Ci0gKiAJRldfVkVSU0lPTiA9ICIzLjMiOwotICoJTEFVQ05IRVJfTkFNRSA9ICJFY2xpcHNlLmV4ZSI7Ci0gKiAgTEFVTkNIRVJfVkVSU0lPTiA9ICIzLjIiOwotICogCi0gKiBUaGUgbGF1bmNoaW5nIGJ5IHRoZSBlY2xpcHNlIGxhdW5jaGVyIGlzIHN1cHBvcnRlZC4KLSAqIAotICogSGFuZGxpbmcgcGx1Z2lucyBpbiBub24gSmFyIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICogCi0gKiBGd0J1bmRsZVN0YXRlIHN1cHBvcnRzIHJldHJpZXZpbmcgZncgcGVyc2lzdGVudCBkYXRhCi0gKiAgYW5kICByZXNvbHZpbmcgYnVuZGxlcyBpZiBydW5uaW5nIG9uIGVxdWlub3guCi0gKiBGd0J1bmRsZVN0YXRlIERvZXMgTk9UIHN1cHBvcnQgcmV0cmlldmluZyBzdGFydCBMZXZlbHMgZnJvbSBmdyBwZXJzaXN0ZW50IGRhdGEgbG9jYXRpb24vCi0gKiAgIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkZBOwotCUVxdWlub3hGd0FkbWluSW1wbCBmd0FkbWluID0gbnVsbDsKLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckZ3QWRtaW4oKSB7Ci0JCURpY3Rpb25hcnkgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9WRU5ET1IsICJFY2xpcHNlLm9yZyIpOwotCi0JCXByb3BzLnB1dChGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0ZXX05BTUUsIEVxdWlub3hDb25zdGFudHMuRldfTkFNRSk7Ci0JCXByb3BzLnB1dChGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0ZXX1ZFUlNJT04sIEVxdWlub3hDb25zdGFudHMuRldfVkVSU0lPTik7Ci0JCXByb3BzLnB1dChGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX05BTUUsIEVxdWlub3hDb25zdGFudHMuTEFVTkNIRVJfTkFNRSk7Ci0JCXByb3BzLnB1dChGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX1ZFUlNJT04sIEVxdWlub3hDb25zdGFudHMuTEFVTkNIRVJfVkVSU0lPTik7Ci0KLQkJaWYgKEVxdWlub3hGd0FkbWluSW1wbC5pc1J1bm5pbmdGdyhjb250ZXh0KSkgewotCQkJcHJvcHMucHV0KEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfUlVOTklOR19TWVNURU1fRkxBRywgInRydWUiKTsKLQkJCWZ3QWRtaW4gPSBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKGNvbnRleHQsIHRydWUpOwotCQl9IGVsc2UKLQkJCWZ3QWRtaW4gPSBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKGNvbnRleHQpOwotCi0JCXJlZ2lzdHJhdGlvbkZBID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoRnJhbWV3b3JrQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBmd0FkbWluLCBwcm9wcyk7Ci0JfQotCi0JLyoqCi0JICogVE9ETzogVGhlc2Ugc2VydmljZXMgYXJlIG5ldmVyIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGFjcXVpcmVTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQkvL2JlIHRvbGVyYW50IG9mIGNvbmN1cnJlbnQgc2h1dGRvd24KLQkJQnVuZGxlQ29udGV4dCB0aGVDb250ZXh0ID0gY29udGV4dDsKLQkJaWYgKHRoZUNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoZUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShzZXJ2aWNlTmFtZSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhlQ29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKLQkJTG9nLmluaXQoYnVuZGxlQ29udGV4dCk7Ci0JCXJlZ2lzdGVyRndBZG1pbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCQlpZiAocmVnaXN0cmF0aW9uRkEgIT0gbnVsbCkKLQkJCXJlZ2lzdHJhdGlvbkZBLnVucmVnaXN0ZXIoKTsKLQkJaWYgKGZ3QWRtaW4gIT0gbnVsbCkKLQkJCWZ3QWRtaW4uZGVhY3RpdmF0ZSgpOwotCQlMb2cuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRWNsaXBzZUxhdW5jaGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FY2xpcHNlTGF1bmNoZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWE4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FY2xpcHNlTGF1bmNoZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5TaW1wbGVCdW5kbGVzU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMYXVuY2hlckltcGwgewotCXN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nT2ZDbWQoU3RyaW5nW10gY21kYXJyYXkpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNtZGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoY21kYXJyYXlbaV0pOwotCQkJc2IuYXBwZW5kKCIgIik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8JQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQotCUVxdWlub3hGd0FkbWluSW1wbCBmd0FkbWluID0gbnVsbDsKLQotCUVjbGlwc2VMYXVuY2hlckltcGwoRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4pIHsKLQkJLy9FY2xpcHNlTGF1bmNoZXJJbXBsKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4pIHsKLQkJLy8JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuZndBZG1pbiA9IGZ3QWRtaW47Ci0JfQotCi0JcHVibGljIFByb2Nlc3MgbGF1bmNoKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBGaWxlIGN3ZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgdGhpcywgImxhdW5jaChNYW5pcHVsYXRvciAsIEZpbGUgKSIsICIiKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlpZiAobGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBsYXVuY2hJbk1lbW9yeShtYW5pcHVsYXRvciwgY3dkKTsKLQkJcmV0dXJuIGxhdW5jaEJ5TGF1bmNoZXIobWFuaXB1bGF0b3IsIGN3ZCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGxhdW5jaEJ5TGF1bmNoZXIoTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIEZpbGUgY3dkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0KLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSBtdXN0IGJlIHNldC4iKTsKLQkJU3RyaW5nW10gY21kYXJyYXkgPSBuZXcgU3RyaW5nW10ge2xhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldEFic29sdXRlUGF0aCgpfTsKLQkJLy8JCXRyeSB7Ci0JCWlmIChjd2QgPT0gbnVsbCkKLQkJCWN3ZCA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKTsKLQkJUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRhcnJheSwgbnVsbCwgY3dkKTsKLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgIlx0IiArIGdldFN0cmluZ09mQ21kKGNtZGFycmF5KSk7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCXByaXZhdGUgUHJvY2VzcyBsYXVuY2hJbk1lbW9yeShNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgRmlsZSBjd2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJVXRpbHMuY2hlY2tBYnNvbHV0ZUZpbGUobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCksICJmd0phciIpOwotCQkvLwkJdGhpcy5sYXVuY2hlckNJbmZvLmZ3SmFyID0gZndKYXI7Ci0JCS8vCQlpZiAoY3dkID09IG51bGwpCi0JCS8vCQkJY3dkID0gZndKYXIuOwotCQlVdGlscy5jaGVja0Fic29sdXRlRGlyKGN3ZCwgImN3ZCIpOwotCi0JCUxpc3QgY21kTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWlmIChsYXVuY2hlckRhdGEuZ2V0SnZtKCkgIT0gbnVsbCkKLQkJCWNtZExpc3QuYWRkKGxhdW5jaGVyRGF0YS5nZXRKdm0oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWVsc2UKLQkJCWNtZExpc3QuYWRkKCJqYXZhIik7Ci0KLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRKdm1BcmdzKCkgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGF1bmNoZXJEYXRhLmdldEp2bUFyZ3MoKS5sZW5ndGg7IGkrKykKLQkJCQljbWRMaXN0LmFkZChsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpW2ldKTsKLQotCQljbWRMaXN0LmFkZCgiLWphciIpOwotCQljbWRMaXN0LmFkZChVdGlscy5nZXRSZWxhdGl2ZVBhdGgobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCksIGN3ZCkpOwotCi0JCUVxdWlub3hNYW5pcHVsYXRvckltcGwuY2hlY2tDb25zaXN0ZW5jeU9mRndDb25maWdMb2NBbmRGd1BlcnNpc3RlbnREYXRhTG9jKGxhdW5jaGVyRGF0YSk7Ly9jaGVja0NvbnNpc3RlbmN5KHRoaXMubGF1bmNoZXJDSW5mby5md0NvbmZpZ0ZpbGUsIHRoaXMubGF1bmNoZXJDSW5mby5md0luc3RhbmNlUHJpdmF0ZUFyZWEpOwotCQljbWRMaXN0LmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DT05GSUdVUkFUSU9OKTsKLQkJY21kTGlzdC5hZGQoVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKGxhdW5jaGVyRGF0YS5nZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKSwgY3dkKSk7Ci0KLQkJaWYgKGxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpCi0JCQljbWRMaXN0LmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DTEVBTik7Ci0KLQkJU3RyaW5nW10gY21kYXJyYXkgPSBuZXcgU3RyaW5nW2NtZExpc3Quc2l6ZSgpXTsKLQkJY21kTGlzdC50b0FycmF5KGNtZGFycmF5KTsKLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgIkluIENXRCA9ICIgKyBjd2QgKyAiXG5cdCIgKyBnZXRTdHJpbmdPZkNtZChjbWRhcnJheSkpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZGFycmF5LCBudWxsLCBjd2QpOwotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VjbGlwc2VMYXVuY2hlclBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FY2xpcHNlTGF1bmNoZXJQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlNjZlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VjbGlwc2VMYXVuY2hlclBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTGF1bmNoZXJEYXRhOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGF1bmNoZXJQYXJzZXIgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb25maWdGaWxlTGluZXMoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgRmlsZSBvdXRwdXRGaWxlLCBib29sZWFuIHJlbGF0aXZlKSB7Ci0JCUxpc3QgbGluZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JCWJvb2xlYW4gc3RhcnRVcEZsYWcgPSBmYWxzZTsKLQkJZmluYWwgU3RyaW5nW10gcHJvZ3JhbUFyZ3MgPSBsYXVuY2hlckRhdGEuZ2V0UHJvZ3JhbUFyZ3MoKTsKLQkJaWYgKHByb2dyYW1BcmdzICE9IG51bGwgJiYgcHJvZ3JhbUFyZ3MubGVuZ3RoICE9IDApCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2dyYW1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByb2dyYW1BcmdzW2ldLmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9TVEFSVFVQKSAmJiAocHJvZ3JhbUFyZ3NbaSArIDFdICE9IG51bGwgfHwgcHJvZ3JhbUFyZ3NbaSArIDFdLmxlbmd0aCgpICE9IDApKSB7Ci0JCQkJCWxpbmVzLmFkZChwcm9ncmFtQXJnc1tpXSk7Ci0JCQkJCWxpbmVzLmFkZChwcm9ncmFtQXJnc1srK2ldKTsKLQkJCQkJc3RhcnRVcEZsYWcgPSB0cnVlOwotCQkJCX0gZWxzZQotCQkJCQlsaW5lcy5hZGQocHJvZ3JhbUFyZ3NbaV0pOwotCQkJfQotCQlpZiAobGF1bmNoZXJEYXRhLmlzQ2xlYW4oKSkKLQkJCWxpbmVzLmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DTEVBTik7Ci0JCUZpbGUgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uID0gbGF1bmNoZXJEYXRhLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpOwotCQlGaWxlIGZ3Q29uZmlnTG9jYXRpb24gPSBsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQlpZiAoZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWlmIChmd0NvbmZpZ0xvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoIWZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbi5lcXVhbHMoZndDb25maWdMb2NhdGlvbikpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbik7Ci0JCX0gZWxzZSBpZiAoZndDb25maWdMb2NhdGlvbiAhPSBudWxsKQotCQkJbGF1bmNoZXJEYXRhLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihmd0NvbmZpZ0xvY2F0aW9uLCBsYXVuY2hlckRhdGEuaXNDbGVhbigpKTsKLQotCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlsaW5lcy5hZGQoRXF1aW5veENvbnN0YW50cy5PUFRJT05fQ09ORklHVVJBVElPTik7Ci0JCQlsaW5lcy5hZGQobGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQotCQlpZiAoIXN0YXJ0VXBGbGFnKQotCQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpICE9IG51bGwpIHsKLQkJCQlsaW5lcy5hZGQoRXF1aW5veENvbnN0YW50cy5PUFRJT05fRlcpOwotCQkJCVN0cmluZyBwYXRoID0gIiI7Ci0JCQkJLy9pZiAocmVsYXRpdmUpCi0JCQkJLy8JcGF0aCA9IFV0aWxzLmdldFJlbGF0aXZlUGF0aChsYXVuY2hlckRhdGEuZ2V0RndKYXIoKSwgb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCS8vZWxzZQotCQkJCXBhdGggPSBsYXVuY2hlckRhdGEuZ2V0RndKYXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlsaW5lcy5hZGQocGF0aCk7Ci0JCQl9Ci0KLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRKdm0oKSAhPSBudWxsKSB7Ci0JCQlsaW5lcy5hZGQoRXF1aW5veENvbnN0YW50cy5PUFRJT05fVk0pOwotCQkJbGluZXMuYWRkKGxhdW5jaGVyRGF0YS5nZXRKdm0oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJZmluYWwgU3RyaW5nW10ganZtQXJncyA9IGxhdW5jaGVyRGF0YS5nZXRKdm1BcmdzKCk7Ci0JCWlmIChqdm1BcmdzICE9IG51bGwgJiYganZtQXJncy5sZW5ndGggIT0gMCkgewotCQkJbGluZXMuYWRkKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX1ZNQVJHUyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGp2bUFyZ3MubGVuZ3RoOyBpKyspCi0JCQkJbGluZXMuYWRkKGp2bUFyZ3NbaV0pOwotCQl9Ci0JCVN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbbGluZXMuc2l6ZSgpXTsKLQkJbGluZXMudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNtZExpbmUoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgU3RyaW5nW10gbGluZXMpIHsKLQkJLy9Mb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCAiaW5wdXRGaWxlPSIgKyBpbnB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkvLwkJZmluYWwgRmlsZSBsYXVuY2hlckZpbGUgPSBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKTsKLQkJZmluYWwgRmlsZSBsYXVuY2hlckNvbmZpZ0ZpbGUgPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLmdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoZXJEYXRhKTsKLQotCQlib29sZWFuIGNsZWFuID0gbGF1bmNoZXJEYXRhLmlzQ2xlYW4oKTsKLQkJYm9vbGVhbiBuZWVkVG9VcGRhdGUgPSBmYWxzZTsKLQkJRmlsZSBmd1BlcnNpc3RlbnREYXRhTG9jID0gbGF1bmNoZXJEYXRhLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpOwotCQlGaWxlIGZ3Q29uZmlnTG9jYXRpb24gPSBsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQlpZiAoZndQZXJzaXN0ZW50RGF0YUxvYyA9PSBudWxsKSB7Ci0JCQlpZiAoZndDb25maWdMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJZndQZXJzaXN0ZW50RGF0YUxvYyA9IG5ldyBGaWxlKGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRQYXJlbnQoKSwgRXF1aW5veENvbnN0YW50cy5ERUZBVUxUX0NPTkZJR1VSQVRJT04pOwotCQkJCWZ3Q29uZmlnTG9jYXRpb24gPSBmd1BlcnNpc3RlbnREYXRhTG9jOwotCQkJCW5lZWRUb1VwZGF0ZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWZ3UGVyc2lzdGVudERhdGFMb2MgPSBmd0NvbmZpZ0xvY2F0aW9uOwotCQkJCW5lZWRUb1VwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZndDb25maWdMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJZndDb25maWdMb2NhdGlvbiA9IGZ3UGVyc2lzdGVudERhdGFMb2M7Ci0JCQkJbmVlZFRvVXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCUZpbGUgZndKYXIgPSBsYXVuY2hlckRhdGEuZ2V0RndKYXIoKTsKLQkJaWYgKGZ3SmFyID09IG51bGwpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRFY2xpcHNlUGx1Z2luRnVsbExvY2F0aW9uKEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSwgbmV3IEZpbGUobGF1bmNoZXJDb25maWdGaWxlLmdldFBhcmVudCgpLCBFcXVpbm94Q29uc3RhbnRzLlBMVUdJTlNfRElSKSk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlmd0phciA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24pLmdldEZpbGUoKSk7Ci0JCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0phcihmd0phcik7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJfQotCQkvLyBsYXVuY2hlckRhdGEuaW5pdGlhbGl6ZSgpOyAvLyByZXNldCBleGNlcHQgbGF1bmNoZXJGaWxlLgotCi0JCS8vCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobGF1bmNoZXJGaWxlKTsKLQkJYm9vbGVhbiB2bUFyZ3NGbGFnID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiICIpOwotCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyIpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0b2tlbml6ZXIuY291bnRUb2tlbnMoKSAhPSAxKSB7Ci0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCB0aGlzLCAicGFyc2VDbWRMaW5lKFN0cmluZ1tdIGxpbmVzLCBGaWxlIGlucHV0RmlsZSkiLCAiSWxsZWdhbCBGb3JtYXQ6bGluZT0iICsgbGluZSArICJ0b2tlbml6ZXIuY291bnRUb2tlbnMoKT0iICsgdG9rZW5pemVyLmNvdW50VG9rZW5zKCkpOwotCQkJCS8vdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbGxlZ2FsIEZvcm1hdDpsaW5lPSIgKyBsaW5lICsgInRva2VuaXplci5jb3VudFRva2VucygpPSIgKyB0b2tlbml6ZXIuY291bnRUb2tlbnMoKSk7Ci0JCQl9Ci0JCQlpZiAodm1BcmdzRmxhZykgewotCQkJCWxhdW5jaGVyRGF0YS5hZGRKdm1BcmcobGluZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobGluZS5zdGFydHNXaXRoKCItdm1hcmdzIikpIHsKLQkJCQl2bUFyZ3NGbGFnID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoRXF1aW5veENvbnN0YW50cy5PUFRJT05fQ09ORklHVVJBVElPTikpIHsKLQkJCQlmaW5hbCBTdHJpbmcgbmV4dExpbmUgPSBsaW5lc1srK2ldLnRyaW0oKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXh0TGluZSk7Ci0JCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKLQkJCQkJZmlsZSA9IG5ldyBGaWxlKGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRQYXJlbnQoKSArIEZpbGUuc2VwYXJhdG9yICsgbmV4dExpbmUpOwotCQkJCWZ3UGVyc2lzdGVudERhdGFMb2MgPSBmaWxlOwotCQkJCW5lZWRUb1VwZGF0ZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DTEVBTikpIHsKLQkJCQljbGVhbiA9IHRydWU7Ci0JCQkJbmVlZFRvVXBkYXRlID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX1ZNKSkgewotCQkJCWZpbmFsIFN0cmluZyBuZXh0TGluZSA9IGxpbmVzWysraV0udHJpbSgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5leHRMaW5lKTsKLQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShsYXVuY2hlckNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIG5leHRMaW5lKTsKLQkJCQl9Ci0JCQkJbGF1bmNoZXJEYXRhLnNldEp2bShmaWxlKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0ZXKSkgewotCQkJCWZpbmFsIFN0cmluZyBuZXh0TGluZSA9IGxpbmVzWysraV0udHJpbSgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5leHRMaW5lKTsKLQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShsYXVuY2hlckNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIG5leHRMaW5lKTsKLQkJCQl9Ci0JCQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZpbGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlsYXVuY2hlckRhdGEuYWRkUHJvZ3JhbUFyZyhsaW5lc1tpXSk7Ci0JCQkJLy8JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCB0aGlzLCAicGFyc2VDbWRMaW5lKFN0cmluZ1tdIGxpbmVzLCBGaWxlIGlucHV0RmlsZSkiLCAiVW5zdXBwb3J0ZWQgYnkgY3VycmVudCBpbXBsOmxpbmU9IiArIGxpbmUpOwotCQkJfQotCQl9Ci0JCWlmIChuZWVkVG9VcGRhdGUpIHsKLQkJCWxhdW5jaGVyRGF0YS5zZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oZndQZXJzaXN0ZW50RGF0YUxvYywgY2xlYW4pOwotCQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oZndQZXJzaXN0ZW50RGF0YUxvYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGUgbGF1bmNoZXJDb25maWdGaWxlID0gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKGxhdW5jaGVyRGF0YSk7Ci0JCWlmIChsYXVuY2hlckNvbmZpZ0ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlckNvbmZpZ0ZpbGUoKSBzaG91bGQgYmUgc2V0IGluIGFkdmFuY2UuIik7Ci0JCWlmICghbGF1bmNoZXJDb25maWdGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGxhdW5jaGVyQ29uZmlnRmlsZSkpOwotCi0JCQlTdHJpbmcgbGluZTsKLQkJCUxpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQobGluZSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBsaW5lcyA9IChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQkJCVN0cmluZyBvc2dpSW5zdGFsbEFyZWEgPSBnZXRMYXVuY2hlcihsaW5lcykgIT0gbnVsbCA/IEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKGdldExhdW5jaGVyKGxpbmVzKS5nZXRQYXRoKCksIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkgOiBudWxsOwotCi0JCQlTdHJpbmcgcmVzb2x2ZU5leHRMaW5lID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVzb2x2ZU5leHRMaW5lICE9IG51bGwpIHsKLQkJCQkJbGluZXNbaV0gPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VBYnNvbHV0ZShsaW5lc1tpXSwgcmVzb2x2ZU5leHRMaW5lKTsKLQkJCQkJcmVzb2x2ZU5leHRMaW5lID0gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXNvbHZlTmV4dExpbmUgPSBuZWVkc1BhdGhSZXNvbHV0aW9uKGxpbmVzW2ldLCBvc2dpSW5zdGFsbEFyZWEsIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLnBhcnNlQ21kTGluZShsYXVuY2hlckRhdGEsIGxpbmVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChiciAhPSBudWxsKQotCQkJCWJyLmNsb3NlKCk7Ci0JCX0KLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19JTkZPLCAiTGF1bmNoZXIgQ29uZmlnIGZpbGUoIiArIGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIpIGlzIHJlYWQgc3VjY2Vzc2Z1bGx5LiIpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRMYXVuY2hlcihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX1NUQVJUVVApICYmIGkgKyAxIDwgYXJncy5sZW5ndGggJiYgYXJnc1tpICsgMV0uY2hhckF0KDEpICE9ICctJykgewotCQkJCUlQYXRoIHBhcmVudEZvbGRlciA9IG5ldyBQYXRoKGFyZ3NbaSArIDFdKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJaWYgKHBhcmVudEZvbGRlci5sYXN0U2VnbWVudCgpLmVxdWFscygicGx1Z2lucyIpKQotCQkJCQlyZXR1cm4gcGFyZW50Rm9sZGVyLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b0ZpbGUoKTsKLQkJCQlyZXR1cm4gcGFyZW50Rm9sZGVyLnRvRmlsZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vUmV0dXJuIHRoZSBiYXNlIGFnYWluc3Qgd2hpY2ggdGhlIHBhdGggbmVlZHMgdG8gYmUgcmVzb2x2ZWQsIGlmIHJlc29sdXRpb24gaXMgbmVlZGVkLgotCXByaXZhdGUgU3RyaW5nIG5lZWRzUGF0aFJlc29sdXRpb24oU3RyaW5nIGVudHJ5LCBTdHJpbmcgb3NnaUluc3RhbGxBcmVhLCBTdHJpbmcgbGF1bmNoZXJGb2xkZXIpIHsKLQkJaWYgKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0NPTkZJR1VSQVRJT04uZXF1YWxzSWdub3JlQ2FzZShlbnRyeSkpCi0JCQlyZXR1cm4gb3NnaUluc3RhbGxBcmVhOwotCQlpZiAoIi0tbGF1bmNoZXIubGlicmFyeSIuZXF1YWxzSWdub3JlQ2FzZShlbnRyeSkpCi0JCQlyZXR1cm4gbGF1bmNoZXJGb2xkZXI7Ci0JCWlmIChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9TVEFSVFVQLmVxdWFsc0lnbm9yZUNhc2UoZW50cnkpKQotCQkJcmV0dXJuIGxhdW5jaGVyRm9sZGVyOwotCQlpZiAoRXF1aW5veENvbnN0YW50cy5PUFRJT05fRlcuZXF1YWxzSWdub3JlQ2FzZShlbnRyeSkpCi0JCQlyZXR1cm4gb3NnaUluc3RhbGxBcmVhICE9IG51bGwgPyBvc2dpSW5zdGFsbEFyZWEgOiBsYXVuY2hlckZvbGRlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShFcXVpbm94TGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgYm9vbGVhbiByZWxhdGl2ZSwgYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgbGF1bmNoZXJDb25maWdGaWxlID0gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKGxhdW5jaGVyRGF0YSk7Ci0KLQkJaWYgKGxhdW5jaGVyQ29uZmlnRmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGF1bmNoZXJDb25maWdGaWxlIGNhbm5vdCBiZSBzZXQuIGxhdW5jaGVyIGZpbGUgc2hvdWxkIGJlIHNldCBpbiBhZHZhbmNlLiIpOwotCQlVdGlscy5jcmVhdGVQYXJlbnREaXIobGF1bmNoZXJDb25maWdGaWxlKTsKLQkJLy8gYmFja3VwIGZpbGUgaWYgZXhpc3RzLgkJCi0JCWlmIChiYWNrdXApCi0JCQlpZiAobGF1bmNoZXJDb25maWdGaWxlLmV4aXN0cygpKSB7Ci0JCQkJRmlsZSBkZXN0ID0gVXRpbHMuZ2V0U2ltcGxlRGF0YUZvcm1hdHRlZEZpbGUobGF1bmNoZXJDb25maWdGaWxlKTsKLQkJCQlpZiAoIWxhdW5jaGVyQ29uZmlnRmlsZS5yZW5hbWVUbyhkZXN0KSkKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsIHRvIHJlbmFtZSBmcm9tICgiICsgbGF1bmNoZXJDb25maWdGaWxlICsgIikgdG8gKCIgKyBkZXN0ICsgIikiKTsKLQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0lORk8sIHRoaXMsICJzYXZlQ29uZmlncygpIiwgIlN1Y2NlZWQgdG8gcmVuYW1lIGZyb20gKCIgKyBsYXVuY2hlckNvbmZpZ0ZpbGUgKyAiKSB0byAoIiArIGRlc3QgKyAiKSIpOwotCQkJfQotCi0JCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGxhdW5jaGVyQ29uZmlnRmlsZSkpOwotCi0JCQlTdHJpbmdbXSBsaW5lcyA9IHRoaXMuZ2V0Q29uZmlnRmlsZUxpbmVzKGxhdW5jaGVyRGF0YSwgbGF1bmNoZXJDb25maWdGaWxlLCByZWxhdGl2ZSk7Ci0JCQlTdHJpbmcgb3NnaUluc3RhbGxBcmVhID0gZ2V0TGF1bmNoZXIobGluZXMpICE9IG51bGwgPyBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VBYnNvbHV0ZShnZXRMYXVuY2hlcihsaW5lcykuZ2V0UGF0aCgpLCBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpIDogbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJU3RyaW5nIHJlc29sdmVOZXh0TGluZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlc29sdmVOZXh0TGluZSAhPSBudWxsKSB7Ci0JCQkJCWxpbmVzW2ldID0gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlUmVsYXRpdmUobGluZXNbaV0sIHJlc29sdmVOZXh0TGluZSk7Ci0JCQkJCXJlc29sdmVOZXh0TGluZSA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzb2x2ZU5leHRMaW5lID0gbmVlZHNQYXRoUmVzb2x1dGlvbihsaW5lc1tpXSwgb3NnaUluc3RhbGxBcmVhLCBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcik7Ci0JCQkJCS8vV2UgZG9uJ3Qgd3JpdGUgLWNvbmZpZ3VyYXRpb24gd2hlbiBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJCQlpZiAoRXF1aW5veENvbnN0YW50cy5PUFRJT05fQ09ORklHVVJBVElPTi5lcXVhbHNJZ25vcmVDYXNlKGxpbmVzW2ldKSkgewotCQkJCQkJcmVzb2x2ZU5leHRMaW5lID0gbnVsbDsKLQkJCQkJCWlmIChuZXcgUGF0aChsaW5lc1tpICsgMV0pLnJlbW92ZUxhc3RTZWdtZW50cygxKS5lcXVhbHMobmV3IFBhdGgob3NnaUluc3RhbGxBcmVhKSkpIHsKLQkJCQkJCQlpKys7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYncud3JpdGUobGluZXNbaV0pOwotCQkJCWJ3Lm5ld0xpbmUoKTsKLQkJCX0KLQkJCWJ3LmZsdXNoKCk7Ci0JCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0lORk8sICJMYXVuY2hlciBDb25maWcgZmlsZSBpcyBzYXZlZCBzdWNjZXNzZnVsbHkgaW50bzoiICsgbGF1bmNoZXJDb25maWdGaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidyAhPSBudWxsKQotCQkJCWJ3LmNsb3NlKCk7Ci0JCQlpZiAobGF1bmNoZXJEYXRhLmdldFByZXZpb3VzTGF1bmNoZXJJbmkoKSAhPSBudWxsKQotCQkJCWxhdW5jaGVyRGF0YS5nZXRQcmV2aW91c0xhdW5jaGVySW5pKCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hCdW5kbGVzU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEJ1bmRsZXNTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NkZTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEJ1bmRsZXNTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5hZGFwdG9yLkVjbGlwc2VFbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlNpbXBsZUJ1bmRsZXNTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLkZyYW1ld29ya1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLQotcHVibGljIGNsYXNzIEVxdWlub3hCdW5kbGVzU3RhdGUgaW1wbGVtZW50cyBCdW5kbGVzU3RhdGUgewotCXN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfVElNRVNUQU1QID0gMEw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCS8vIFdoaWxlIHdlIHJlY29nbml6ZSB0aGUgYW1kNjQgYXJjaGl0ZWN0dXJlLCB3ZSBjaGFuZ2UKLQkvLyB0aGlzIGludGVybmFsbHkgdG8gYmUgeDg2XzY0LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9BTUQ2NCA9ICJhbWQ2NCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfQVJDSF9JMzg2ID0gImkzODYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9QUyA9IHsib3NnaS5vcyIsICJvc2dpLndzIiwgIm9zZ2kubmwiLCAib3NnaS5hcmNoIiwgQ29uc3RhbnRzLkZSQU1FV09SS19TWVNURU1QQUNLQUdFUywgIm9zZ2kucmVzb2x2ZXJNb2RlIiwgQ29uc3RhbnRzLkZSQU1FV09SS19FWEVDVVRJT05FTlZJUk9OTUVOVCwgIm9zZ2kucmVzb2x2ZU9wdGlvbmFsIiwgIm9zZ2kuZ2VuZXJpY0FsaWFzZXMifTsKLQotCXN0YXRpYyBib29sZWFuIGNoZWNrRnVsbHlTdXBwb3J0ZWQoKSB7Ci0JCS8vVE9ETyAtIFRoaXMgd2FzIHByZXZpb3VzbHkgZG9pbmcgYSBib2d1cyBjaGVjayBieSBhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIGEgcGFydGljdWxhciBjbGFzcyAtIGl0J3Mgbm90IGNsZWFyIHdoYXQgdGhpcyBpcyB0cnlpbmcgdG8gZG8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogZWNsaXBzZS5leGUgd2lsbCBsYXVuY2ggYSBmdyB3aGVyZSBwbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2lfKi4qLiouKi5qYXIKLQkgKiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBmdy4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoZXJEYXRhCi0JICogQHBhcmFtIGNvbmZpZ0RhdGEKLQkgKiBAcmV0dXJuIEZpbGUgb2YgZndKYXIgdG8gYmUgdXNlZC4KLQkgKi8KLQlzdGF0aWMgRmlsZSBnZXRGd0phcihMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBDb25maWdEYXRhIGNvbmZpZ0RhdGEpIHsKLQkJcmV0dXJuIGdldEZ3SmFyKGxhdW5jaGVyRGF0YSwgY29uZmlnRGF0YSwgdHJ1ZSk7Ci0JCS8vCi0JCS8vIC8vIEVjbGlwc2VMYXVuY2hlclBhcnNlciBsYXVuY2hlclBhcnNlciA9IG5ldwotCQkvLyBFY2xpcHNlTGF1bmNoZXJQYXJzZXIobGF1bmNoZXJEYXRhKTsKLQkJLy8gLy8gbGF1bmNoZXJQYXJzZXIucmVhZCgpOwotCQkvLyBpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgIT0gbnVsbCkKLQkJLy8gcmV0dXJuIGxhdW5jaGVyRGF0YS5nZXRGd0phcigpOwotCQkvLwotCQkvLyAvLyBjaGVjayAtRCBhcmd1bWVudHMgb2YganZtQXJncyA/Ci0JCS8vIFN0cmluZ1tdIGp2bUFyZ3MgPSBsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpOwotCQkvLyBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGp2bUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJLy8gaWYgKGp2bUFyZ3NbaV0uZW5kc1dpdGgoIi1EIiArICJvc2dpLmZyYW1ld29yaz0iKSkgewotCQkvLyBsb2NhdGlvbiA9IGp2bUFyZ3NbaV0uc3Vic3RyaW5nKCgiLUQiICsgIm9zZ2kuZnJhbWV3b3JrPSIpLmxlbmd0aCgpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkvLyByZXR1cm4gbmV3IEZpbGUobG9jYXRpb24pOwotCQkvLwotCQkvLyBGaWxlIHJldCA9IGdldFN5c3RlbUJ1bmRsZUZyb21CdW5kbGVJbmZvcyhsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEpOwotCQkvLyBpZiAocmV0ICE9IG51bGwpCi0JCS8vIHJldHVybiByZXQ7Ci0JCS8vIHJldHVybiBnZXRTeXN0ZW1CdW5kbGVCeVNlYXJjaGluZyhsYXVuY2hlckRhdGEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RndKYXIoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgQ29uZmlnRGF0YSBjb25maWdEYXRhLCBib29sZWFuIGNoZWNrQnVuZGxlSW5mb3MpIHsKLQkJLy8gRWNsaXBzZUxhdW5jaGVyUGFyc2VyIGxhdW5jaGVyUGFyc2VyID0gbmV3Ci0JCS8vIEVjbGlwc2VMYXVuY2hlclBhcnNlcihsYXVuY2hlckRhdGEpOwotCQkvLyBsYXVuY2hlclBhcnNlci5yZWFkKCk7Ci0JCWlmIChsYXVuY2hlckRhdGEuZ2V0RndKYXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbGF1bmNoZXJEYXRhLmdldEZ3SmFyKCk7Ci0JCX0KLQotCQkvLyBjaGVjayAtRCBhcmd1bWVudHMgb2YganZtQXJncyA/Ci0JCVN0cmluZ1tdIGp2bUFyZ3MgPSBsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpOwotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGp2bUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChqdm1BcmdzW2ldLmVuZHNXaXRoKCItRCIgKyAib3NnaS5mcmFtZXdvcms9IikpIHsKLQkJCQlsb2NhdGlvbiA9IGp2bUFyZ3NbaV0uc3Vic3RyaW5nKCgiLUQiICsgIm9zZ2kuZnJhbWV3b3JrPSIpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJfQotCi0JCWlmIChjaGVja0J1bmRsZUluZm9zKSB7Ci0JCQlGaWxlIHJldCA9IGdldFN5c3RlbUJ1bmRsZUZyb21CdW5kbGVJbmZvcyhjb25maWdEYXRhKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCS8vCQlyZXR1cm4gZ2V0U3lzdGVtQnVuZGxlQnlTZWFyY2hpbmcobGF1bmNoZXJEYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBsb25nIGdldE1heElkKFN0YXRlIHN0YXRlKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlRGVzY3JpcHRpb25zID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlsb25nIG1heElkID0gREVGQVVMVF9USU1FU1RBTVA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlRGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKQotCQkJaWYgKG1heElkIDwgYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldEJ1bmRsZUlkKCkpIHsKLQkJCQltYXhJZCA9IGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRCdW5kbGVJZCgpOwotCQkJfQotCQlyZXR1cm4gbWF4SWQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRTeXN0ZW1CdW5kbGVCeVNlYXJjaGluZyhMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JLy8JCUZpbGUgcGx1Z2luc0RpcjsKLQkvLwkJaWYgKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpID09IG51bGwpIHsKLQkvLwkJCWlmIChsYXVuY2hlckRhdGEuZ2V0SG9tZSgpID09IG51bGwpCi0JLy8JCQkJcmV0dXJuIG51bGw7Ci0JLy8JCQlwbHVnaW5zRGlyID0gbmV3IEZpbGUobGF1bmNoZXJEYXRhLmdldEhvbWUoKSwgInBsdWdpbnMiKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCXBsdWdpbnNEaXIgPSBuZXcgRmlsZShsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCksICJwbHVnaW5zIik7Ci0JLy8JCX0KLQkvLwotCS8vCQlTdHJpbmcgZnVsbExvY2F0aW9uID0gRmlsZVV0aWxzLmdldEVjbGlwc2VQbHVnaW5GdWxsTG9jYXRpb24oRXF1aW5veENvbnN0YW50cy5GV19TWU1CT0xJQ19OQU1FLCBwbHVnaW5zRGlyKTsKLQkvLwkJaWYgKGZ1bGxMb2NhdGlvbiA9PSBudWxsKQotCS8vCQkJcmV0dXJuIG51bGw7Ci0JLy8JCVVSTCB1cmwgPSBudWxsOwotCS8vCQl0cnkgewotCS8vCQkJdXJsID0gbmV3IFVSTChmdWxsTG9jYXRpb24pOwotCS8vCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCS8vCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCAiZnVsbExvY2F0aW9uIGlzIG5vdCBpbiBwcm9wZXIgZm9ybWF0OiIgKyBmdWxsTG9jYXRpb24pOwotCS8vCQl9Ci0JLy8JCXJldHVybiB1cmwgPT0gbnVsbCA/IG51bGwgOiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkvLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFN5c3RlbUJ1bmRsZUZyb21CdW5kbGVJbmZvcyhCdW5kbGVJbmZvW10gYnVuZGxlSW5mb3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBtYXRjaCA9IGlzU3lzdGVtQnVuZGxlKGJ1bmRsZUluZm9zW2ldKTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKQotCQkJCXJldHVybiBtYXRjaDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFN5c3RlbUJ1bmRsZUZyb21CdW5kbGVJbmZvcyhDb25maWdEYXRhIGNvbmZpZ0RhdGEpIHsKLQkJQnVuZGxlSW5mb1tdIGJ1bmRsZUluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCXJldHVybiBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MoYnVuZGxlSW5mb3MpOwotCX0KLQotCXN0YXRpYyBsb25nIGdldFRpbWVTdGFtcChGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbikgewotCQlpZiAoZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gREVGQVVMVF9USU1FU1RBTVA7Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLCBFcXVpbm94Q29uc3RhbnRzLlBFUlNJU1RFTlRfRElSX05BTUUpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBERUZBVUxUX1RJTUVTVEFNUDsKLQkJbG9uZyByZXQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQlGaWxlW10gbGlzdHMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdHMgPT0gbnVsbCkKLQkJCXJldHVybiByZXQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdHMubGVuZ3RoOyBpKyspCi0JCQlpZiAocmV0IDwgbGlzdHNbaV0ubGFzdE1vZGlmaWVkKCkpCi0JCQkJcmV0ID0gbGlzdHNbaV0ubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGlzU3lzdGVtQnVuZGxlKEJ1bmRsZUluZm8gYnVuZGxlSW5mbykgewotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsIHx8IGJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBidW5kbGVMb2NhdGlvbiA9IGJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGJ1bmRsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoRXF1aW5veENvbnN0YW50cy5SRUZFUkVOQ0UpKQotCQkJYnVuZGxlTG9jYXRpb24gPSBidW5kbGVMb2NhdGlvbi5zdWJzdHJpbmcoRXF1aW5veENvbnN0YW50cy5SRUZFUkVOQ0UubGVuZ3RoKCkpOwotCQlpZiAoYnVuZGxlTG9jYXRpb24uc3RhcnRzV2l0aCgiZmlsZToiKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdbXSBjbGF1c2VzID0gVXRpbHMuZ2V0Q2xhdXNlc01hbmlmZXN0TWFpbkF0dHJpYnV0ZXMoYnVuZGxlTG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCQlpZiAoYnVuZGxlTG9jYXRpb24uaW5kZXhPZihFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUpID4gMCkKLQkJCQkJaWYgKEVxdWlub3hDb25zdGFudHMuUEVSU0lTVEVOVF9ESVJfTkFNRS5lcXVhbHMoVXRpbHMuZ2V0UGF0aEZyb21DbGF1c2UoY2xhdXNlc1swXSkpKQotCQkJCQkJcmV0dXJuIG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gIm9zZ2kub3MiLCAib3NnaS53cyIsICJvc2dpLm5sIiwgIm9zZ2kuYXJjaCIsCi0JLy8gQ29uc3RhbnRzLkZSQU1FV09SS19TWVNURU1QQUNLQUdFUywgIm9zZ2kucmVzb2x2ZXJNb2RlIiwKLQkvLyBDb25zdGFudHMuRlJBTUVXT1JLX0VYRUNVVElPTkVOVklST05NRU5ULCAib3NnaS5yZXNvbHZlT3B0aW9uYWwiCi0Jc3RhdGljIFByb3BlcnRpZXMgc2V0RGVmYXVsdFBsYXRmb3JtUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkvLyBzZXQgZGVmYXVsdCB2YWx1ZQotCi0JCVN0cmluZyBubCA9IExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvc2dpLm5sIiwgbmwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVE9ETyByZW1vdmUgRWNsaXBzZUVudmlyb25tZW50SW5vZgotCQlTdHJpbmcgb3MgPSBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpOy8vJE5PTi1OTFMtMSQpOwotCQlwbGF0Zm9ybVByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9zZ2kub3MiLCBvcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgd3MgPSBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzV1Mob3MpOwotCQlwbGF0Zm9ybVByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9zZ2kud3MiLCB3cyk7Ci0KLQkJLy8gaWYgdGhlIHVzZXIgZGlkbid0IHNldCB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSB3aXRoIGEgY29tbWFuZCBsaW5lCi0JCS8vIGFyZ3VtZW50IHRoZW4gdXNlIHRoZSBkZWZhdWx0LgotCQlTdHJpbmcgYXJjaCA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gRnJhbWV3b3JrUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOy8vJE5PTi1OTFMtMSQKLQkJLy8gTWFwIGkzODYgYXJjaGl0ZWN0dXJlIHRvIHg4NgotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOVEVSTkFMX0FSQ0hfSTM4NikpCi0JCQlhcmNoID0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5BUkNIX1g4NjsKLQkJLy8gTWFwIGFtZDY0IGFyY2hpdGVjdHVyZSB0byB4ODZfNjQKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOVEVSTkFMX0FNRDY0KSkKLQkJCWFyY2ggPSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLkFSQ0hfWDg2XzY0OwotCQllbHNlCi0JCQlhcmNoID0gbmFtZTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvc2dpLmFyY2giLCBhcmNoKTsgLy8kTk9OLU5MUy0xJAkJCQotCi0JCXBsYXRmb3JtUHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb25zdGFudHMuRlJBTUVXT1JLX1NZU1RFTVBBQ0tBR0VTLCBGcmFtZXdvcmtQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfU1lTVEVNUEFDS0FHRVMpKTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfRVhFQ1VUSU9ORU5WSVJPTk1FTlQsIEZyYW1ld29ya1Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19FWEVDVVRJT05FTlZJUk9OTUVOVCkpOwotCQlwbGF0Zm9ybVByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm9zZ2kucmVzb2x2ZU9wdGlvbmFsIiwgIiIgKyAidHJ1ZSIuZXF1YWxzKEZyYW1ld29ya1Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm9zZ2kucmVzb2x2ZU9wdGlvbmFsIikpKTsKLQkJcmV0dXJuIHBsYXRmb3JtUHJvcGVydGllczsKLQl9Ci0KLQlFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbiA9IG51bGw7Ci0KLQlCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IG51bGw7Ci0JUHJvcGVydGllcyBwbGF0ZnJvbVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JbG9uZyBtYXhJZCA9IERFRkFVTFRfVElNRVNUQU1QOwotCi0JU3RhdGVPYmplY3RGYWN0b3J5IHNvRmFjdG9yeSA9IG51bGw7Ci0KLQlTdGF0ZSBzdGF0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBJZiB1c2VGd1BlcnNpc3RlbnREYXRhIGZsYWcgZXF1YWxzIGZhbHNlLCB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgbm90IHRha2UKLQkgKiBhIGZyYW1ld29yayBwZXJzaXN0ZW50IGRhdGEgaW50byBhY2NvdW50LiBPdGhlcndpc2UsIGl0IHdpbGwuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gZndBZG1pbgotCSAqIEBwYXJhbSBtYW5pcHVsYXRvcgotCSAqIEBwYXJhbSB1c2VGd1BlcnNpc3RlbnREYXRhCi0JICovCi0JRXF1aW5veEJ1bmRsZXNTdGF0ZShCdW5kbGVDb250ZXh0IGNvbnRleHQsIEVxdWlub3hGd0FkbWluSW1wbCBmd0FkbWluLCBNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgYm9vbGVhbiB1c2VGd1BlcnNpc3RlbnREYXRhKSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuZndBZG1pbiA9IGZ3QWRtaW47Ci0JCS8vIGNvcHkgbWFuaXB1bGF0b3Igb2JqZWN0IGZvciBhdm9pZGluZyBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhlCi0JCS8vIG1hbmlwdWxhdG9yLgotCQl0aGlzLm1hbmlwdWxhdG9yID0gZndBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQl0aGlzLm1hbmlwdWxhdG9yLnNldENvbmZpZ0RhdGEobWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRMYXVuY2hlckRhdGEobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpOwotCQlpbml0aWFsaXplKHVzZUZ3UGVyc2lzdGVudERhdGEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgZG9lcyBOT1QgdGFrZSBhIGZyYW1ld29yayBwZXJzaXN0ZW50IGRhdGEgaW50byBhY2NvdW50LgotCSAqIEl0IHdpbGwgY3JlYXRlIFN0YXRlIG9iamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBsYXRmb3JtUHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBmd0FkbWluCi0JICogQHBhcmFtIG1hbmlwdWxhdG9yCi0JICogQHBhcmFtIHBsYXRmb3JtUHJvcGVydGllcwotCSAqLwotCUVxdWlub3hCdW5kbGVzU3RhdGUoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbiwgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIFByb3BlcnRpZXMgcGxhdGZvcm1Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuZndBZG1pbiA9IGZ3QWRtaW47Ci0JCS8vIGNvcHkgbWFuaXB1bGF0b3Igb2JqZWN0IGZvciBhdm9pZGluZyBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhlCi0JCS8vIG1hbmlwdWxhdG9yLgotCQl0aGlzLm1hbmlwdWxhdG9yID0gZndBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQl0aGlzLm1hbmlwdWxhdG9yLnNldENvbmZpZ0RhdGEobWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRMYXVuY2hlckRhdGEobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpOwotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJQnVuZGxlSW5mb1tdIGJJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQl0aGlzLmNvbXBvc2VOZXdTdGF0ZShsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEsIHBsYXRmb3JtUHJvcGVydGllcywgYkluZm9zKTsKLQl9Ci0KLQkvKioKLQkgKiBjb21wb3NlIG5ldyBzdGF0ZSB3aXRob3V0IHJlYWRpbmcgZnJhbWV3b3JrIHBlcnNpc3RlbnQgZGF0YS4gVGhlCi0JICogY29uZmlnRGF0YS5nZXRGd0RlcGVuZGVudFByb3BzKCkgaXMgdXNlZCBmb3IgdGhlIGNvbXBvc2l0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hlckRhdGEKLQkgKiBAcGFyYW0gY29uZmlnRGF0YQotCSAqIEBwYXJhbSBiSW5mb3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29tcG9zZU5ld1N0YXRlKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEsIENvbmZpZ0RhdGEgY29uZmlnRGF0YSwgQnVuZGxlSW5mb1tdIGJJbmZvcykgewotCQl0aGlzLmNvbXBvc2VOZXdTdGF0ZShsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEsIGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpLCBiSW5mb3MpOwotCX0KLQotCS8qKgotCSAqIGNvbXBvc2UgbmV3IHN0YXRlIHdpdGhvdXQgcmVhZGluZyBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhLiBUaGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0aWVzIGlzIHVzZWQgZm9yIHRoZSBjb21wb3NpdGlvbi4gSWYgc3lzdGVtIGJ1bmRsZSBpcyBub3QgaW5jbHVkZWQKLQkgKiBpbiB0aGUgZ2l2ZW4gYkluZm9zLCB0aGUgZncgamFyIGxhdW5jaGVyRGF0YSBjb250YWlucyB3aWxsIGJlIHVzZWQuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaGVyRGF0YQotCSAqIEBwYXJhbSBjb25maWdEYXRhCi0JICogQHBhcmFtIHByb3BlcnRpZXMKLQkgKiBAcGFyYW0gYkluZm9zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXBvc2VOZXdTdGF0ZShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBDb25maWdEYXRhIGNvbmZpZ0RhdGEsIFByb3BlcnRpZXMgcHJvcGVydGllcywgQnVuZGxlSW5mb1tdIGJJbmZvcykgewotCQkvL05vdGUsIHRoZXJlIHVzZSB0byBiZSBhIGxvdCBtb3JlIGNvZGUgaW4gdGhpcyBtZXRob2QKLQkJRmlsZSBmd0phciA9IGdldFN5c3RlbUJ1bmRsZUZyb21CdW5kbGVJbmZvcyhjb25maWdEYXRhKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZ3SmFyKTsKLQkJdGhpcy5zZXRGd0phcihmd0phcik7Ci0JCWNvbXBvc2VTdGF0ZShjb25maWdEYXRhLmdldEJ1bmRsZXMoKSwgcHJvcGVydGllcywgbnVsbCk7Ci0JCXJlc29sdmUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogY29tcG9zZSBzdGF0ZS4gSWYgaXQgY2Fubm90IGNvbXBvc2UgaXQgYnkgc29tZWhvdywgZmFsc2UgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGJJbmZvcwotCSAqIEBwYXJhbSBwcm9wcwotCSAqIEBwYXJhbSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24KLQkgKiBAcmV0dXJuIGlmIGl0IGNhbm5vdCBjb21wb3NlIGl0IGJ5IHNvbWVob3csIGZhbHNlIGlzIHJldHVybmVkLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29tcG9zZVN0YXRlKEJ1bmRsZUluZm9bXSBiSW5mb3MsIERpY3Rpb25hcnkgcHJvcHMsIEZpbGUgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQl0aGlzLm1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRCdW5kbGVzKG51bGwpOwotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCXRoaXMuc2V0U3RhdGVPYmplY3RGYWN0b3J5KCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY2FjaGVkSW5zdGFsbGVkQnVuZGxlcyA9IG51bGw7Ci0JCXN0YXRlID0gbnVsbDsKLQkJYm9vbGVhbiBmbGFnTmV3U3RhdGUgPSBmYWxzZTsKLQkJaWYgKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkvL05PVEUgSGVyZSB0aGVyZSB3YXMgYSBiaWcgY2h1bmsgb2YgY29kZSByZWFkaW5nIHRoZSBmcmFtZXdvcmsgc3RhdGUgcGVyc2lzdGVkIG9uIGRpc2sKLQkJCS8vIGFuZCBJIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCB3YXMgY2F1c2luZyB2YXJpb3VzIHByb2JsZW1zLiBTZWUgaW4gcHJldmlvdXMgcmV2aXNpb24KLQkJCXRoaXMubWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEJ1bmRsZXMoaW5mb3MpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXN0YXRlID0gc29GYWN0b3J5LmNyZWF0ZVN0YXRlKHRydWUpOwotCQlmbGFnTmV3U3RhdGUgPSB0cnVlOwotCQljYWNoZWRJbnN0YWxsZWRCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uWzBdOwotCQlpZiAocHJvcHMgPT0gbnVsbCkgewotCQkJdGhpcy5tYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuc2V0QnVuZGxlcyhpbmZvcyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzVG9TdGF0ZShwcm9wcyk7Ci0JCXNldFBsYXRmb3JtUHJvcGVydGllcyhzdGF0ZSk7Ci0KLQkJLy8gcmVtb3ZlIGluaXRpYWwgYnVuZGxlIHdoaWNoIHdlcmUgaW5zdGFsbGVkIGJ1dCBub3QgbGlzdGVkIGluCi0JCS8vIGZ3Q29uZmlnRmlsZUJJbmZvcy4KLQkJLy8gYnVuZGxlTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjYWNoZWRJbnN0YWxsZWRCdW5kbGVzKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkSW5zdGFsbGVkQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNhY2hlZEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0TG9jYXRpb24oKS5zdGFydHNXaXRoKCJpbml0aWFsQCIpKSB7Ci0JCQkJU3RyaW5nIGxvY2F0aW9uID0gRmlsZVV0aWxzLmdldFJlYWxMb2NhdGlvbihtYW5pcHVsYXRvciwgY2FjaGVkSW5zdGFsbGVkQnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpLCB0cnVlKTsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBiSW5mb3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGJJbmZvc1tqXS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvbikpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQpCi0JCQkJCXN0YXRlLnJlbW92ZUJ1bmRsZShjYWNoZWRJbnN0YWxsZWRCdW5kbGVzW2ldLmdldEJ1bmRsZUlkKCkpOwotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1heElkID0gc3RhdGUuZ2V0SGlnaGVzdEJ1bmRsZUlkKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKLQkJCW1heElkID0gZ2V0TWF4SWQoc3RhdGUpOwotCQl9Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfREVCVUcsIHRoaXMsICJjb21wb3NlRXhwZWN0ZWRTdGF0ZSgpIiwgImluc3RhbGxCdW5kbGUoKToiKTsKLQkJfQotCQlpZiAoZmxhZ05ld1N0YXRlKSB7Ci0JCQlpbnQgaW5kZXhTeXN0ZW1CdW5kbGUgPSAtMTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYkluZm9zLmxlbmd0aDsgaisrKQotCQkJCWlmIChpc1N5c3RlbUJ1bmRsZShiSW5mb3Nbal0pICE9IG51bGwpIHsKLQkJCQkJaW5kZXhTeXN0ZW1CdW5kbGUgPSBqOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWlmIChpbmRleFN5c3RlbUJ1bmRsZSA+IDApIHsKLQkJCQlCdW5kbGVJbmZvW10gbmV3QnVuZGxlSW5mb3MgPSBuZXcgQnVuZGxlSW5mb1tiSW5mb3MubGVuZ3RoXTsKLQkJCQluZXdCdW5kbGVJbmZvc1swXSA9IGJJbmZvc1tpbmRleFN5c3RlbUJ1bmRsZV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShiSW5mb3MsIDAsIG5ld0J1bmRsZUluZm9zLCAxLCBpbmRleFN5c3RlbUJ1bmRsZSk7Ci0JCQkJaWYgKGluZGV4U3lzdGVtQnVuZGxlIDwgYkluZm9zLmxlbmd0aCAtIDEpCi0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYkluZm9zLCBpbmRleFN5c3RlbUJ1bmRsZSArIDEsIG5ld0J1bmRsZUluZm9zLCBpbmRleFN5c3RlbUJ1bmRsZSArIDEsIGJJbmZvcy5sZW5ndGggLSBpbmRleFN5c3RlbUJ1bmRsZSAtIDEpOwotCQkJCWJJbmZvcyA9IG5ld0J1bmRsZUluZm9zOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYkluZm9zLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgdGhpcywgImNvbXBvc2VFeHBlY3RlZFN0YXRlKCkiLCAiYkluZm9zWyIgKyBqICsgIl09IiArIGJJbmZvc1tqXSk7Ci0JCQl0cnkgewotCQkJCXRoaXMuaW5zdGFsbEJ1bmRsZShiSW5mb3Nbal0pOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5zdGFsbCBiSW5mb3NbIiArIGogKyAiXT0iICsgYkluZm9zW2pdKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgY29udGludWUKLQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0VSUk9SLCB0aGlzLCAiY29tcG9zZUV4cGVjdGVkU3RhdGUoKSIsICJCdW5kbGVJbmZvOiIgKyBiSW5mb3Nbal0sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvIGNvbnZlcnQoQnVuZGxlRGVzY3JpcHRpb24gdG9Db252ZXJ0KSB7Ci0JCWJvb2xlYW4gbWFya2VkQXNTdGFydGVkID0gZmFsc2U7Ci0JCWludCBzbCA9IEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0KLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJLy8gVGhpcyBhbGdvcml0aG0gaXMgbm90IHNvcGhpc3RpY2F0ZWQuCi0JCWlmICh0b0NvbnZlcnQuZ2V0QnVuZGxlSWQoKSA9PSAwICYmIEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRS5lcXVhbHModG9Db252ZXJ0LmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJLy8gQ29udmVydGluZyB0aGUgU3lzdGVtIEJ1bmRsZQotCQkJU3RyaW5nIHN5bWJvbGljTmFtZVRhcmdldCA9IHRvQ29udmVydC5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCVZlcnNpb24gdmVyc2lvblRhcmdldCA9IHRvQ29udmVydC5nZXRWZXJzaW9uKCk7Ci0JCQl0cnkgewotCQkJCUZpbGUgZndKYXIgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRGd0phcigpOwotCQkJCWlmIChmd0phciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmd0phckxvY2F0aW9uID0gZndKYXIudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQlTdHJpbmdbXSBjbGF1c2VzID0gVXRpbHMuZ2V0Q2xhdXNlc01hbmlmZXN0TWFpbkF0dHJpYnV0ZXMoZndKYXJMb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJCQlTdHJpbmcgZndKYXJTeW1ib2xpY05hbWUgPSBVdGlscy5nZXRQYXRoRnJvbUNsYXVzZShjbGF1c2VzWzBdKTsKLQkJCQkJU3RyaW5nIGZ3SmFyVmVyc2lvblN0ID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhmd0phckxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkJCQlpZiAoZndKYXJTeW1ib2xpY05hbWUuZXF1YWxzKHN5bWJvbGljTmFtZVRhcmdldCkgJiYgZndKYXJWZXJzaW9uU3QuZXF1YWxzKHZlcnNpb25UYXJnZXQudG9TdHJpbmcoKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gZndKYXJMb2NhdGlvbjsKLQkJCQkJCW1hcmtlZEFzU3RhcnRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRFY2xpcHNlUmVhbExvY2F0aW9uKG1hbmlwdWxhdG9yLCB0b0NvbnZlcnQuZ2V0TG9jYXRpb24oKSk7Ci0JCQlCdW5kbGVJbmZvW10gb3JpZ2luYWxCSW5mb3MgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQkJLy8gaWYgKERFQlVHKQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0b0NvbnZlcnQ9IiArIGxvY2F0aW9uKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxCSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBpZiAoREVCVUcpCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvcmlnaW5hbEJJbmZvc1siICsgaSArICJdPSIgKwotCQkJCS8vIG9yaWdpbmFsQkluZm9zW2ldLmdldExvY2F0aW9uKCkpOwotCQkJCWlmIChvcmlnaW5hbEJJbmZvc1tpXS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvbikpIHsKLQkJCQkJbWFya2VkQXNTdGFydGVkID0gb3JpZ2luYWxCSW5mb3NbaV0uaXNNYXJrZWRBc1N0YXJ0ZWQoKTsKLQkJCQkJc2wgPSBnZXRTdGFydExldmVsKG9yaWdpbmFsQkluZm9zW2ldLmdldFN0YXJ0TGV2ZWwoKSk7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCS8vIFRPRE8gY3VycmVudCBlcXVpbm94IGltcGwgaGFzIG5vIHdheSB0byBnZXQgdGhlIHN0YXJ0IGxldmVsCi0JCQkJLy8gaW5mbyBwZXJzaXN0ZW50bHkgc3RvcmVkLgotCQkJCW1hcmtlZEFzU3RhcnRlZCA9IGZhbHNlOwotCQkJCXNsID0gQnVuZGxlSW5mby5OT19MRVZFTDsKLQkJCX0KLQkJfQotCQlCdW5kbGVJbmZvIHJlc3VsdCA9IG5ldyBCdW5kbGVJbmZvKCk7Ci0JCXJlc3VsdC5zZXRTeW1ib2xpY05hbWUodG9Db252ZXJ0LmdldFN5bWJvbGljTmFtZSgpKTsKLQkJcmVzdWx0LnNldFZlcnNpb24odG9Db252ZXJ0LmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJcmVzdWx0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJcmVzdWx0LnNldFJlc29sdmVkKHRvQ29udmVydC5pc1Jlc29sdmVkKCkpOwotCQlyZXN1bHQuc2V0TWFya2VkQXNTdGFydGVkKG1hcmtlZEFzU3RhcnRlZCk7Ci0JCXJlc3VsdC5zZXRTdGFydExldmVsKHNsKTsKLQkJcmVzdWx0LnNldEJ1bmRsZUlkKHRvQ29udmVydC5nZXRCdW5kbGVJZCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGNvbnZlcnRTdGF0ZShCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMpIHsKLQkJQnVuZGxlSW5mb1tdIHJlc3VsdCA9IG5ldyBCdW5kbGVJbmZvW2J1bmRsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBjb252ZXJ0KGJ1bmRsZXNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRFeHBlY3RlZFN0YXRlKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQkJcmV0dXJuIGNvbnZlcnRTdGF0ZShzdGF0ZS5nZXRCdW5kbGVzKCkpOwotCX0KLQotCVByb3BlcnRpZXMgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcGxhdGZyb21Qcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0UHJlcmVxdWlzdGVCdW5kbGVzKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oYkluZm8uZ2V0TG9jYXRpb24oKSk7Ci0JCUltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uW10gaW1wb3J0cyA9IGJ1bmRsZS5nZXRJbXBvcnRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUJhc2VEZXNjcmlwdGlvbiBzdXBwbGllciA9IGltcG9ydHNbaV0uZ2V0U3VwcGxpZXIoKTsKLQkJCWlmIChzdXBwbGllciA9PSBudWxsKSB7Ci0JCQkJaWYgKCFpbXBvcnRzW2ldLmdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpLmVxdWFscyhJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbi5SRVNPTFVUSU9OX09QVElPTkFMKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGltcG9ydCBzdXBwbGllciBzaG91bGQgbm90IGJlIG51bGwiKTsKLQkJCX0gZWxzZQotCQkJCXNldC5hZGQoc3VwcGxpZXIuZ2V0U3VwcGxpZXIoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3VwcGxpZXIuZ2V0U3VwcGxpZXIoKSk7Ci0JCX0KLQkJQnVuZGxlRGVzY3JpcHRpb25bXSByZXF1aXJlcyA9IGJ1bmRsZS5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNldC5hZGQocmVxdWlyZXNbaV0pOwotCQl9Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlcyA9IG5ldyBCdW5kbGVEZXNjcmlwdGlvbltzZXQuc2l6ZSgpXTsKLQkJc2V0LnRvQXJyYXkoYnVuZGxlcyk7Ci0JCXJldHVybiBjb252ZXJ0U3RhdGUoYnVuZGxlcyk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U3RhcnRMZXZlbChpbnQgc3RhcnRMZXZlbCkgewotCQlyZXR1cm4gKHN0YXJ0TGV2ZWwgPT0gQnVuZGxlSW5mby5OT19MRVZFTCA/IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpIDogc3RhcnRMZXZlbCk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm8gZ2V0U3lzdGVtQnVuZGxlKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSB0aGlzLmdldFN5c3RlbUJ1bmRsZURlc2NyaXB0aW9uKCk7Ci0JCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBjb252ZXJ0KGJ1bmRsZSkgOiBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZURlc2NyaXB0aW9uIGdldFN5c3RlbUJ1bmRsZURlc2NyaXB0aW9uKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCB8fCBidW5kbGUuZ2V0SG9zdCgpICE9IG51bGwpIHsgLy8gbnVsbCBvciBhCi0JCQkvLyBmcmFnbWVudCBidW5kbGUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBpZiAoREVCVUcpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUU9IiArCi0JCS8vIEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpPSIgKwotCQkvLyBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkvLyB9Ci0JCXJldHVybiAoRXF1aW5veENvbnN0YW50cy5GV19TWU1CT0xJQ19OQU1FLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpID8gYnVuZGxlIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRTeXN0ZW1GcmFnbWVudGVkQnVuZGxlcygpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gdGhpcy5nZXRTeXN0ZW1CdW5kbGVEZXNjcmlwdGlvbigpOwotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNvbnZlcnRTdGF0ZShidW5kbGUuZ2V0RnJhZ21lbnRzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKGJJbmZvLmdldExvY2F0aW9uKCkpOwotCQlQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW4gPSAoUGxhdGZvcm1BZG1pbikgQWN0aXZhdG9yLmFjcXVpcmVTZXJ2aWNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJU3RhdGVIZWxwZXIgaGVscGVyID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZUhlbHBlcigpOwotCQlWZXJzaW9uQ29uc3RyYWludFtdIGNvbnN0cmFpbnRzID0gaGVscGVyLmdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoZGVzY3JpcHRpb24pOwotCQlTdHJpbmdbXSByZXQgPSBuZXcgU3RyaW5nW2NvbnN0cmFpbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspCi0JCQlyZXRbaV0gPSBjb25zdHJhaW50c1tpXS50b1N0cmluZygpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gdXNlRndQZXJzaXN0ZW50RGF0YSkgewotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJQnVuZGxlSW5mb1tdIGJJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCi0JCWlmICghdXNlRndQZXJzaXN0ZW50RGF0YSkgewotCQkJY29tcG9zZU5ld1N0YXRlKGxhdW5jaGVyRGF0YSwgY29uZmlnRGF0YSwgYkluZm9zKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVxdWlub3hNYW5pcHVsYXRvckltcGwuY2hlY2tDb25zaXN0ZW5jeU9mRndDb25maWdMb2NBbmRGd1BlcnNpc3RlbnREYXRhTG9jKGxhdW5jaGVyRGF0YSk7Ci0JCWlmIChsYXVuY2hlckRhdGEuaXNDbGVhbigpKSB7Ci0JCQljb21wb3NlTmV3U3RhdGUobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhLCBiSW5mb3MpOwotCQl9IGVsc2UgewotCQkJaWYgKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpID09IG51bGwpIHsKLQkJCQkvLyBUT0RPIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHNldCBtb3JlIHByZWNpc2VseS4KLQkJCQlGaWxlIGluc3RhbGxBcmVhID0gbnVsbDsKLQkJCQlTdHJpbmcgaW5zdGFsbEFyZWFTdCA9IGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wKEVxdWlub3hDb25zdGFudHMuUFJPUF9JTlNUQUxMKTsKLQkJCQlpZiAoaW5zdGFsbEFyZWFTdCA9PSBudWxsKSB7Ci0JCQkJCWlmIChtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRMYXVuY2hlcigpID09IG51bGwpIHsKLQkJCQkJCS8vIFRPRE8gaW1wbGVtZW50Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbnN0YWxsQXJlYSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluc3RhbGxBcmVhU3Quc3RhcnRzV2l0aCgiZmlsZToiKSkKLQkJCQkJCWluc3RhbGxBcmVhID0gbmV3IEZpbGUoaW5zdGFsbEFyZWFTdC5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSkpOwotCQkJCQllbHNlCi0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXJyZW50IGltcGxlbWVudGF0aW9uIGFzc3VtZSB0aGF0IHByb3BlcnR5IHZhbHVlIGtleWVkIGJ5ICIgKyBFcXVpbm94Q29uc3RhbnRzLlBST1BfSU5TVEFMTCArICIgbXVzdCBzdGFydCB3aXRoIFwiZmlsZTpcIi4gQnV0IGl0IHdhcyBub3Q6IiArIGluc3RhbGxBcmVhU3QpOwotCQkJCX0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfREVCVUcsIHRoaXMsICJpbml0aWFsaXplKHVzZUZ3UGVyc2lzdGVudERhdCkiLCAiaW5zdGFsbEFyZWE9IiArIGluc3RhbGxBcmVhKTsKLQkJCQlGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9IG5ldyBGaWxlKGluc3RhbGxBcmVhLCAiY29uZmlndXJhdGlvbiIpOwotCQkJCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24sIGZhbHNlKTsKLQkJCX0KLQkJCWlmICghY29tcG9zZVN0YXRlKGJJbmZvcywgbnVsbCwgbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKCkpKQotCQkJCWNvbXBvc2VOZXdTdGF0ZShsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEsIGJJbmZvcyk7Ci0JCQlyZXNvbHZlKHRydWUpOwotCQkJLy8gaWYodGhpcy5nZXRTeXN0ZW1CdW5kbGUoKT09bnVsbCkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbyBiSW5mbykgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY3VycmVudEluc3RhbGxlZEJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCVN0cmluZyBuZXdMb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGJJbmZvLmdldExvY2F0aW9uKCksIHRydWUpOwotCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gVXRpbHMuZ2V0T1NHaU1hbmlmZXN0KG5ld0xvY2F0aW9uKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIG5ld1N5bWJvbGljTmFtZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCWludCBwb3NpdGlvbiA9IG5ld1N5bWJvbGljTmFtZS5pbmRleE9mKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBvc2l0aW9uID49IDApCi0JCQluZXdTeW1ib2xpY05hbWUgPSBuZXdTeW1ib2xpY05hbWUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKS50cmltKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEluc3RhbGxlZEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCksIHRydWUpOwotCQkJaWYgKG5ld0xvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gY3VycmVudEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlpZiAobmV3U3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpKSB7Ci0JCQkJU3RyaW5nIHZlcnNpb24gPSBjdXJyZW50SW5zdGFsbGVkQnVuZGxlc1tpXS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQlpZiAobmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlCdW5kbGVEZXNjcmlwdGlvbiBuZXdCdW5kbGVEZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJJbmZvLnNldEJ1bmRsZUlkKCsrbWF4SWQpOwotCQkJCW5ld0J1bmRsZURlc2NyaXB0aW9uID0gc29GYWN0b3J5LmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgbmV3TG9jYXRpb24sIGJJbmZvLmdldEJ1bmRsZUlkKCkpOwotCQkJCXN0YXRlLmFkZEJ1bmRsZShuZXdCdW5kbGVEZXNjcmlwdGlvbik7Ci0JCQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShiSW5mbyk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgdGhpcywgImluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbykiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRnVsbHlTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiBzdGF0ZS5pc1Jlc29sdmVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZChCdW5kbGVJbmZvIGJJbmZvKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbihiSW5mby5nZXRMb2NhdGlvbigpKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZXNjcmlwdGlvbi5pc1Jlc29sdmVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZShib29sZWFuIGluY3JlbWVudCkgewotCQlzdGF0ZS5yZXNvbHZlKGluY3JlbWVudCk7Ci0JfQotCi0Jdm9pZCBzZXRGd0phcihGaWxlIGZ3SmFyKSB7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLnNldEZ3SmFyKGZ3SmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgcGxhdGZvcm1lIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2l2ZW4gc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFBsYXRmb3JtUHJvcGVydGllcyhTdGF0ZSBzdGF0ZSkgewotCQlEaWN0aW9uYXJ5IHBsYXRmb3JtUHJvcGVydGllcyA9IHN0YXRlLmdldFBsYXRmb3JtUHJvcGVydGllcygpWzBdOwotCQlwbGF0ZnJvbVByb3BlcnRpZXMuY2xlYXIoKTsKLQkJaWYgKHBsYXRmb3JtUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcGxhdGZvcm1Qcm9wZXJ0aWVzLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcGxhdGZvcm1Qcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJCXBsYXRmcm9tUHJvcGVydGllcy5zZXRQcm9wZXJ0eShrZXksIChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlpZiAoREVCVUcpCi0JCQlVdGlscy5wcmludG91dFByb3BlcnRpZXMoU3lzdGVtLm91dCwgIlBsYXRmb3JtUHJvcGVydGllc1swXSIsIHBsYXRmcm9tUHJvcGVydGllcyk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHBsYXRmcm9tUHJvcGVydGllcyByZXF1aXJlZCB0byBjb21wb3NlIHN0YXRlIG9iamVjdCBpbnRvCi0JICogcGxhdGZvcm1Qcm9wZXJ0aWVzIG9mIHRoaXMgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHByb3BzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFBsYXRmb3JtUHJvcGVydGllc1RvU3RhdGUoRGljdGlvbmFyeSBwcm9wcykgewotCQlQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllcyA9IHNldERlZmF1bHRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQotCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcHJvcHMua2V5cygpOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9QUy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChrZXkuZXF1YWxzKFBST1BTW2ldKSkgewotCQkJCQlwbGF0Zm9ybVByb3BlcnRpZXMucHV0KGtleSwgcHJvcHMuZ2V0KGtleSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHBsYXRmb3JtUHJvcGVydGllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN0YXRlT2JqZWN0RmFjdG9yeSgpIHsKLQkJaWYgKHNvRmFjdG9yeSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW4gPSAoUGxhdGZvcm1BZG1pbikgQWN0aXZhdG9yLmFjcXVpcmVTZXJ2aWNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pCi0JCS8vIGhlQnVuZGxlSGVscGVyLmdldERlZmF1bHQoKS5hY3F1aXJlU2VydmljZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXNvRmFjdG9yeSA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChzdGF0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVEZXNjcmlwdGlvbnMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlRGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldEJ1bmRsZUlkKCkgKyAiOiIpOwotCQkJc2IuYXBwZW5kKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS50b1N0cmluZygpICsgIigiKTsKLQkJCXNiLmFwcGVuZChidW5kbGVEZXNjcmlwdGlvbnNbaV0uaXNSZXNvbHZlZCgpICsgIikiKTsKLQkJCVN0cmluZ1tdIGVlcyA9IGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWVzLmxlbmd0aDsgaisrKQotCQkJCXNiLmFwcGVuZChlZXNbal0gKyAiICIpOwotCQkJc2IuYXBwZW5kKCJcbiIpOwotCQl9Ci0JCXNiLmFwcGVuZCgiUGxhdGZvcm1Qcm9wZXJ0aWVzOlxuIik7Ci0JCURpY3Rpb25hcnlbXSBkaWNzID0gc3RhdGUuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGljcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGRpY3NbaV0ua2V5cygpOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBkaWNzW2ldLmdldChrZXkpOwotCQkJCXNiLmFwcGVuZCgiICgiICsga2V5ICsgIiwiICsgdmFsdWUgKyAiKVxuIik7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCJcbiIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbyBiSW5mbykgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQkJbG9uZyBpZCA9IERFRkFVTFRfVElNRVNUQU1QOwotCQlTdHJpbmcgdGFyZ2V0TG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjdXJyZW50SW5zdGFsbGVkQnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpOwotCQkJLy8gVE9ETyBJcyBoYW5kbGluZyAicmVmZXJlbmNlOiIgbmVlZGVkID8KLQkJCS8vIGlmKGxvY2F0aW9uLnN0YXJ0c1dpdGgoInJlZmVyZW5jZToiKSkKLQkJCS8vIGxvY2F0aW9uID0gbG9jYXRpb24uc3Vic3RyaW5nKCJyZWZlcmVuY2U6Ii5sZW5ndGgoKSk7Ci0JCQlpZiAodGFyZ2V0TG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSkgewotCQkJCWlkID0gY3VycmVudEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaWQgIT0gREVGQVVMVF9USU1FU1RBTVApIHsKLQotCQkJdHJ5IHsKLQkJCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gVXRpbHMuZ2V0T1NHaU1hbmlmZXN0KGJJbmZvLmdldExvY2F0aW9uKCkpOwotCQkJCWlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0JCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgdGhpcywgInVuaW5zdGFsbEJ1bmRsZShCdW5kbGVJbmZvKSIsICJVbmFibGUgdG8gZ2V0IGJ1bmRsZSBtYW5pZmVzdCBmb3I6ICIgKyBiSW5mby5nZXRMb2NhdGlvbigpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEZXNjcmlwdGlvbiA9IHNvRmFjdG9yeS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIGJJbmZvLmdldExvY2F0aW9uKCksIGlkKTsKLQkJCQlzdGF0ZS5yZW1vdmVCdW5kbGUoYnVuZGxlRGVzY3JpcHRpb24pOwotCQkJCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYkluZm8pOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJ1bmluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbykiLCBlKTsKLQkJCQkvLyB0aHJvdyBuZXcgTWFuaXB1bGF0b3JFeGNlcHRpb24oIkZhaWwgdG8KLQkJCQkvLyBjcmVhdGVCdW5kbGVEZXNjcmlwdGlvbiBvZiBiSW5mbzoiICsgYkluZm8udG9TdHJpbmcoKSwgZSwKLQkJCQkvLyBNYW5pcHVsYXRvckV4Y2VwdGlvbi5PVEhFUlMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I0ODc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDsKLQotcHVibGljIGNsYXNzIEVxdWlub3hDb25zdGFudHMgewotCi0JLyoqCi0JICogSWYgQnVuZGxlQ29udGV4dCNnZXRQcm9wZXJ0eShQUk9QX0tFWV9VU0VfUkVGRVJFTkNFKSBkb2VzIG5vdCBlcXVhbCAiZmFsc2UiLCAKLQkgKiBNYW5pcHVsYXRvciNzYXZlKCkgd2lsbCBhZGQgInJlZmVyZW5jZToiIHRvIGFueSBidW5kbGUgbG9jYXRpb24gc3BlY2lmaWVkIG9zZ2kuYnVuZGxlcyBpbiBvcmRlciB0byBhdm9pZAotCSAqIGNhY2hpbmcgaXRzIGJ1bmRsZSBqYXIuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkIG5vdGhpbmcgdG8gYW55IGJ1bmRsZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9VU0VfUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51c2VSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TX0RJUiA9ICJwbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZXX1NZTUJPTElDX05BTUUgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT04gPSAiY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfSU5JID0gImNvbmZpZy5pbmkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGV19WRVJTSU9OID0gIjMuMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGV19OQU1FID0gIkVxdWlub3giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEFVTkNIRVJfVkVSU0lPTiA9ICIzLjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEFVTkNIRVJfTkFNRSA9ICJFY2xpcHNlLmV4ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9DT05GSUdVUkFUSU9OID0gIi1jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9GVyA9ICItZnJhbWV3b3JrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9WTSA9ICItdm0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1ZNQVJHUyA9ICItdm1hcmdzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9DTEVBTiA9ICItY2xlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NUQVJUVVAgPSAiLXN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NIT1dTUExBU0ggPSAiLXNob3dzcGxhc2giOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTeXN0ZW0gcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQlVORExFUyA9ICJvc2dpLmJ1bmRsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9CVU5ETEVTX1NUQVJUTEVWRUwgPSAib3NnaS5idW5kbGVzLmRlZmF1bHRTdGFydExldmVsIjsgLy8kTk9OLU5MUy0xJCAvL1RoZSBzdGFydCBsZXZlbCB1c2VkIHRvIGluc3RhbGwgdGhlIGJ1bmRsZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOSVRJQUxfU1RBUlRMRVZFTCA9ICJvc2dpLnN0YXJ0TGV2ZWwiOyAvLyROT04tTkxTLTEkIC8vVGhlIHN0YXJ0IGxldmVsIHdoZW4gdGhlIGZ3bCBzdGFydAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5TVEFMTCA9ICJvc2dpLmluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FQ0xJUFNFX0NPTU1BTkRTID0gImVjbGlwc2UuY29tbWFuZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9PU0dJX0ZXID0gIm9zZ2kuZnJhbWV3b3JrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTEFVTkNIRVJfUEFUSCA9ICJvc2dpLmxhdW5jaGVyUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xBVU5DSEVSX05BTUUgPSAib3NnaS5sYXVuY2hlckluaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSV9FWFRFTlNJT04gPSAiLmluaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVfRVhURU5TSU9OID0gIi5leGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VRVUlOT1hfREVQRU5ERU5UX1BSRUZJWCA9ICJvc2dpLiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRSA9ICJyZWZlcmVuY2U6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfRElSX05BTUUgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RnJhbWV3b3JrQWRtaW5GYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RnJhbWV3b3JrQWRtaW5GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk4OTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEZyYW1ld29ya0FkbWluRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkZyYW1ld29ya0FkbWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW5GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRXF1aW5veEZyYW1ld29ya0FkbWluRmFjdG9yeUltcGwgZXh0ZW5kcyBGcmFtZXdvcmtBZG1pbkZhY3RvcnkgewotCXB1YmxpYyBGcmFtZXdvcmtBZG1pbiBjcmVhdGVGcmFtZXdvcmtBZG1pbigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuU1lTVEVNX1BST1BFUlRZX0tFWSk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKCk7Ci0JCXJldHVybiBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKGNsYXNzTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndBZG1pbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEZ3QWRtaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjM2M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndBZG1pbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzLkVjbGlwc2VWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3JtYW5pcHVsYXRvci5Db25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94RndBZG1pbkltcGwgaW1wbGVtZW50cyBGcmFtZXdvcmtBZG1pbiB7Ci0KLQkvKioKLQkgKiBJZiBib3RoIHRoZSB2ZW5kb3IgYW5kIHRoZSBCdW5kbGUtVmVyc2lvbiBpbiB0aGUgbWFuaWZlc3QgbWF0Y2gsIAotCSAqIHJldHVybiB0cnVlLiBPdGhlcndpc2UgZmFsc2UuCi0JICogIAotCSAqIEByZXR1cm4gZmxhZyB0cnVlIGlmIHRoZSBNYW5pcHVsYXRvckFkbWluIG9iamVjdCBjYW4gaGFuZGxlIGN1cnJlbnRseSBydW5uaW5nIGZ3IGxhdW5jaC4gCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nRncoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vVE9ETyBpbXBsZW1lbnRhdGlvbiBmb3IgRWNsaXBzZS5leGUgYW5kIGZvciBFcXVpbm94Ci0JCVN0cmluZyBmd1ZlbmRvciA9IGNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19WRU5ET1IpOwotCQlpZiAoISJFY2xpcHNlIi5lcXVhbHMoZndWZW5kb3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvL1RPRE8gZGVjaWRlIGlmIHRoaXMgdmVyc2lvbiBjYW4gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnVuZGxlLgotCQlEaWN0aW9uYXJ5IGhlYWRlciA9IGNvbnRleHQuZ2V0QnVuZGxlKDApLmdldEhlYWRlcnMoKTsKLQkJU3RyaW5nIHZlcnNpb25TdCA9IChTdHJpbmcpIGhlYWRlci5nZXQoIkJ1bmRsZS1WZXJzaW9uIik7Ci0JCUVjbGlwc2VWZXJzaW9uIHZlcnNpb24gPSBuZXcgRWNsaXBzZVZlcnNpb24odmVyc2lvblN0KTsKLQkJaW50IHZhbHVlID0gdmVyc2lvbi5jb21wYXJlVG8obmV3IEVjbGlwc2VWZXJzaW9uKEVxdWlub3hDb25zdGFudHMuRldfVkVSU0lPTikpOwotCQlpZiAodmFsdWUgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBUT0RPIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgZWNsaXBzZS5leGUgdXNlZCBmb3IgdGhpcyBsYXVuY2gsIGlmIHVzZWQuIAotCi0JCS8vCQlTdHJpbmcgZWNsaXBzZUNvbW1hbmRzU3QgPSBjb250ZXh0LmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9FQ0xJUFNFX0NPTU1BTkRTKTsKLQkJLy8JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWNsaXBzZUNvbW1hbmRzU3QsIlxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nRncgPSBmYWxzZTsKLQlwcml2YXRlIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yID0gbnVsbDsKLQotCS8vCXByaXZhdGUgU3RyaW5nIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeU5hbWUgPSBudWxsOwotCi0JRXF1aW5veEZ3QWRtaW5JbXBsKCkgewotCQl0aGlzKG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlFcXVpbm94RndBZG1pbkltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMoY29udGV4dCwgZmFsc2UpOwotCX0KLQotCUVxdWlub3hGd0FkbWluSW1wbChTdHJpbmcgY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBudWxsOwotCQl0aGlzLmFjdGl2ZSA9IHRydWU7Ci0JCXRoaXMucnVubmluZ0Z3ID0gZmFsc2U7Ci0JCS8vCQl0aGlzLmNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeU5hbWUgPSBjb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlOYW1lOwotCQlsb2FkQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRDb25maWd1cmF0b3JNYW5pcHVsYXRvcihTdHJpbmcgY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSA9PSBudWxsKQotCQkJdGhpcy5jb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgPSBDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlFcXVpbm94RndBZG1pbkltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJ1bm5pbmdGdykgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmFjdGl2ZSA9IHRydWU7Ci0JCXRoaXMucnVubmluZ0Z3ID0gcnVubmluZ0Z3OwotCX0KLQotCXZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldE1hbmlwdWxhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVxdWlub3hNYW5pcHVsYXRvckltcGwoY29udGV4dCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldFJ1bm5pbmdNYW5pcHVsYXRvcigpIHsKLQkJaWYgKHRoaXMucnVubmluZ0Z3KQotCQkJcmV0dXJuIG5ldyBFcXVpbm94TWFuaXB1bGF0b3JJbXBsKGNvbnRleHQsIHRoaXMsIHRydWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIGFjdGl2ZTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2VzcyBsYXVuY2goTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIEZpbGUgY3dkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy9yZXR1cm4gbmV3IEVjbGlwc2VMYXVuY2hlckltcGwoY29udGV4dCwgdGhpcykubGF1bmNoKG1hbmlwdWxhdG9yLCBjd2QpOwotCQlyZXR1cm4gbmV3IEVjbGlwc2VMYXVuY2hlckltcGwodGhpcykubGF1bmNoKG1hbmlwdWxhdG9yLCBjd2QpOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0b3JNYW5pcHVsYXRvciBnZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndDb25maWdGaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0ZTQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLQotcHVibGljIGNsYXNzIEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElSID0gIkBjb25maWcuZGlyLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VDTElQU0VfUFJPVl9DQUNIRSA9ICJlY2xpcHNlLnAyLmNhY2hlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRUNMSVBTRV9QUk9WX0RBVEFfQVJFQSA9ICJlY2xpcHNlLnAyLmRhdGEuYXJlYSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5jb25maWdVcmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PU0dJX0JVTkRMRVMgPSAib3NnaS5idW5kbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1NHSV9GUkFNRVdPUksgPSAib3NnaS5mcmFtZXdvcmsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PU0dJX0xBVU5DSEVSX1BBVEggPSAib3NnaS5sYXVuY2hlclBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSFMgPSBuZXcgU3RyaW5nW10ge0tFWV9PU0dJX0xBVU5DSEVSX1BBVEgsIEtFWV9FQ0xJUFNFX1BST1ZfQ0FDSEV9OwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VfUkVGRVJFTkNFX1NUUklORyA9IG51bGw7Ci0KLQlwdWJsaWMgRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlcihCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCVVTRV9SRUZFUkVOQ0VfU1RSSU5HID0gY29udGV4dC5nZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfS0VZX1VTRV9SRUZFUkVOQ0UpOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbW1hbmRMaW5lKEJ1bmRsZUluZm8gYnVuZGxlSW5mbywgZmluYWwgVVJMIGJhc2VVcmwpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gYnVuZGxlSW5mby5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIHVzZVJlZmVyZW5jZSA9IHRydWU7Ci0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChVU0VfUkVGRVJFTkNFX1NUUklORyAhPSBudWxsICYmIFVTRV9SRUZFUkVOQ0VfU1RSSU5HLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXVzZVJlZmVyZW5jZSA9IGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW5ldyBVUkwobG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgIkVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuZ2V0Q29tbWFuZExpbmUoKTpidW5kbGVJbmZvPSIgKyBidW5kbGVJbmZvLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8JCQlOZXZlciBoYXBwZW4uIGlnbm9yZS4KLQkJfQotCQlpZiAodXNlUmVmZXJlbmNlKQotCQkJaWYgKCFsb2NhdGlvbi5zdGFydHNXaXRoKCJyZWZlcmVuY2U6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlsb2NhdGlvbiA9ICJyZWZlcmVuY2U6IiArIGxvY2F0aW9uOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IHN0YXJ0TGV2ZWwgPSBidW5kbGVJbmZvLmdldFN0YXJ0TGV2ZWwoKTsKLQkJYm9vbGVhbiB0b0JlU3RhcnRlZCA9IGJ1bmRsZUluZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKTsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vCQlpZiAoYmFzZVVybCAhPSBudWxsICYmIGJ1bmRsZVVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0JCS8vCQkJU3RyaW5nIGJ1bmRsZVBhdGggPSBidW5kbGVVcmwudG9TdHJpbmcoKTsKLQkJLy8JCQlidW5kbGVQYXRoID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKGJ1bmRsZVVybCwgYmFzZVVybCk7Ci0JCS8vCQkJc2IuYXBwZW5kKGJ1bmRsZVBhdGgpOwotCQkvLwkJfSBlbHNlCi0JCXNiLmFwcGVuZChsb2NhdGlvbik7Ci0JCWlmIChzdGFydExldmVsID09IEJ1bmRsZUluZm8uTk9fTEVWRUwgJiYgIXRvQmVTdGFydGVkKQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCXNiLmFwcGVuZCgnQCcpOwotCQlpZiAoc3RhcnRMZXZlbCAhPSBCdW5kbGVJbmZvLk5PX0xFVkVMKQotCQkJc2IuYXBwZW5kKHN0YXJ0TGV2ZWwpOwotCQlpZiAodG9CZVN0YXJ0ZWQpCi0JCQlzYi5hcHBlbmQoIjpzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0Q29uZmlnUHJvcHMoQnVuZGxlSW5mb1tdIGJJbmZvcywgQ29uZmlnRGF0YSBjb25maWdEYXRhLCBMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBib29sZWFuIHJlbGF0aXZlLCBGaWxlIGZ3SmFyKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCWlmIChjb25maWdEYXRhLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTX1NUQVJUTEVWRUwsIEludGVnZXIudG9TdHJpbmcoY29uZmlnRGF0YS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKSk7Ci0JCWlmIChjb25maWdEYXRhLmdldEJlZ2luaW5nRndTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9JTklUSUFMX1NUQVJUTEVWRUwsIEludGVnZXIudG9TdHJpbmcoY29uZmlnRGF0YS5nZXRCZWdpbmluZ0Z3U3RhcnRMZXZlbCgpKSk7Ci0KLQkJZmluYWwgRmlsZSBsYXVuY2hlciA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpOwotCQlpZiAobGF1bmNoZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9IGxhdW5jaGVyLmdldE5hbWUoKTsKLQkJCWlmIChsYXVuY2hlck5hbWUuZW5kc1dpdGgoRXF1aW5veENvbnN0YW50cy5FWEVfRVhURU5TSU9OKSkgewotCQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9MQVVOQ0hFUl9OQU1FLCBsYXVuY2hlck5hbWUuc3Vic3RyaW5nKDAsIGxhdW5jaGVyTmFtZS5sYXN0SW5kZXhPZihFcXVpbm94Q29uc3RhbnRzLkVYRV9FWFRFTlNJT04pKSk7Ci0JCQkJcHJvcHMuc2V0UHJvcGVydHkoRXF1aW5veENvbnN0YW50cy5QUk9QX0xBVU5DSEVSX1BBVEgsIGxhdW5jaGVyLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZndKYXJTdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZndKYXIgIT0gbnVsbCkgewotCQkJCWZ3SmFyU3QgPSBmd0phci50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOZXZlciBoYXBwZW5zCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKGJJbmZvcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCW5vcm1hbGl6ZUxvY2F0aW9uKGJJbmZvc1tpXSk7Ci0JCQkJaWYgKGZ3SmFyU3QgIT0gbnVsbCAmJiBmd0phclN0LmVxdWFscyhiSW5mb3NbaV0uZ2V0TG9jYXRpb24oKSkpCi0JCQkJCWNvbnRpbnVlOyAvL2ZyYW1ld29yayBqYXIgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIGJ1bmRsZXMgbGlzdAotCQkJCXNiLmFwcGVuZChnZXRDb21tYW5kTGluZShiSW5mb3NbaV0sIG51bGwpKTsKLQkJCQlpZiAoaSArIDEgPCBiSW5mb3MubGVuZ3RoKQotCQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTLCBzYi50b1N0cmluZygpKTsKLQotCQl9Ci0JCS8vVE9ETyBUaGUgZm9sbG93aW5nIG1lcmdpbmcgb3BlcmF0aW9ucyBhcmUgc3VzcGljaW91cy4KLQkJcHJvcHMgPSBVdGlscy5hcHBlbmRQcm9wZXJ0aWVzKHByb3BzLCBjb25maWdEYXRhLmdldEZ3SW5kZXBlbmRlbnRQcm9wcygpKTsKLQotCQlwcm9wcyA9IFV0aWxzLmFwcGVuZFByb3BlcnRpZXMocHJvcHMsIGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpKTsKLQotCQkvL0RlYWwgd2l0aCB0aGUgZncgamFyIGFuZCBlbnN1cmUgaXQgaXMgbm90IHNldC4gCi0JCS8vVE9ETyBUaGlzIGNhbid0IGJlIGRvbmUgYmVmb3JlIGJlY2F1c2Ugb2YgdGhlIHByZXZpb3VzIGNhbGxzIHRvIGFwcGVuZFByb3BlcnRpZXMgCi0JCWlmIChmd0phclN0ICE9IG51bGwpCi0JCQlwcm9wcy5zZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVywgZndKYXJTdCAvKiBmd0phci5nZXRBYnNvbHV0ZVBhdGgoKSAqLyk7Ci0JCWVsc2UKLQkJCXByb3BzLnJlbW92ZShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVyk7Ci0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0TWFya2VkQXNTdGFydGVkRm9ybWF0KFN0cmluZyBtc2csIFN0cmluZyBvcmlnaW5hbCkgewotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW1zZyA9IG1zZy50cmltKCk7Ci0JCWludCBjb2xvbiA9IG1zZy5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbG9uID4gLTEpIHsKLQkJCXJldHVybiBtc2cuc3Vic3RyaW5nKGNvbG9uICsgMSkuZXF1YWxzKCJzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1zZy5lcXVhbHMoInN0YXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0U3RhcnRMZXZlbChTdHJpbmcgbXNnLCBTdHJpbmcgb3JpZ2luYWwpIHsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JCW1zZyA9IG1zZy50cmltKCk7Ci0JCWludCBjb2xvbiA9IG1zZy5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbG9uID4gMCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChtc2cuc3Vic3RyaW5nKDAsIGNvbG9uKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCQkJfQotCQl9Ci0JCXJldHVybiBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzRndEZXBlbmRlbnQoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIFRoaXMgYWxnb3JpdGhtIGlzIHRlbXBvcmFsLiAKLQkJaWYgKGtleS5zdGFydHNXaXRoKEVxdWlub3hDb25zdGFudHMuUFJPUF9FUVVJTk9YX0RFUEVOREVOVF9QUkVGSVgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZUxvY2F0aW9uKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliSW5mby5zZXRMb2NhdGlvbihuZXcgVVJMKGxvY2F0aW9uKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYkluZm8uc2V0TG9jYXRpb24obmV3IEZpbGUobG9jYXRpb24pLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8vCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7Ci0JCS8vCQkJaWYgKCFsb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpCi0JCS8vCQkJCWxvY2F0aW9uID0gIi8iICsgbG9jYXRpb247Ci0JCS8vCQkJLy8JCWlmIChmd0phclN0ICE9IG51bGwpCi0JCS8vCQkJLy8JCQlpZiAoZndKYXJTdC5lcXVhbHMobG9jYXRpb24pKQotCQkvLwkJCS8vCQkJCWNvbnRpbnVlOwotCQkvLwkJCWxvY2F0aW9uID0gVXRpbHMucmVwbGFjZUFsbChsb2NhdGlvbiwgRmlsZS5zZXBhcmF0b3IsICIvIik7Ci0JCS8vCQkJLy9TdHJpbmcgamFyTmFtZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhsb2NhdGlvbi5sYXN0SW5kZXhPZigiLyIpICsgMSk7Ci0JCS8vCQkJLy8JCWlmIChqYXJOYW1lLnN0YXJ0c1dpdGgoRXF1aW5veENvbnN0YW50cy5GV19KQVJfUExVR0lOX05BTUUpKQotCQkvLwkJCS8vCQkJY29udGludWU7Ci0JCS8vCQkJYkluZm8uc2V0TG9jYXRpb24oImZpbGU6IiArIGxvY2F0aW9uKTsKLQkJLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEluc3RhbGxpbmdCdW5kbGVzKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBTdHJpbmcgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotCQlDb25maWdEYXRhIGNvbmZpZ0RhdGEgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBiSW5mb1N0cmluZ3MgPSBVdGlscy5nZXRUb2tlbnModmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYkluZm9TdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gYkluZm9TdHJpbmdzW2ldLnRyaW0oKTsKLQkJCQl0b2tlbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIHRva2VuLCBmYWxzZSkudHJpbSgpOwotCi0JCQkJaW50IGluZGV4SSA9IHRva2VuLmluZGV4T2YoIkAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsb2NhdGlvbiA9IChpbmRleEkgPT0gLTEpID8gdG9rZW4gOiB0b2tlbi5zdWJzdHJpbmcoMCwgaW5kZXhJKTsKLQkJCQlTdHJpbmcgcmVhbExvY2F0aW9uID0gRmlsZVV0aWxzLmdldEVjbGlwc2VSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGxvY2F0aW9uKTsKLQkJCQlTdHJpbmcgc2xBbmRGbGFnID0gKGluZGV4SSA+IC0xKSA/IHRva2VuLnN1YnN0cmluZyhpbmRleEkgKyAxKSA6IG51bGw7Ci0KLQkJCQlib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IGdldE1hcmtlZEFzU3RhcnRlZEZvcm1hdChzbEFuZEZsYWcsIHRva2VuKTsKLQkJCQlpbnQgc3RhcnRMZXZlbCA9IGdldFN0YXJ0TGV2ZWwoc2xBbmRGbGFnLCB0b2tlbik7Ci0KLQkJCQlpZiAocmVhbExvY2F0aW9uICE9IG51bGwpCi0JCQkJCWNvbmZpZ0RhdGEuYWRkQnVuZGxlKG5ldyBCdW5kbGVJbmZvKHJlYWxMb2NhdGlvbiwgc3RhcnRMZXZlbCwgbWFya2VkQXNTdGFydGVkKSk7Ci0JCQkJZWxzZQotCQkJCQljb25maWdEYXRhLmFkZEJ1bmRsZShuZXcgQnVuZGxlSW5mbyhsb2NhdGlvbiwgbnVsbCwgbnVsbCwgc3RhcnRMZXZlbCwgbWFya2VkQXNTdGFydGVkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpbnB1dEZpbGUgbXVzdCBiZSBub3QgYSBkaXJlY3RvcnkgYnV0IGEgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuaXB1bGF0b3IKLQkgKiBAcGFyYW0gaW5wdXRGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRGd0NvbmZpZyhNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgRmlsZSBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dEZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX2lucHV0RmlsZUlzRGlyZWN0b3J5LCBpbnB1dEZpbGUpKTsKLQotCQkvL0luaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzCi0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQljb25maWdEYXRhLmluaXRpYWxpemUoKTsKLQotCQkvL0xvYWQgcHJvcGVydGllcwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7Ci0JCQlwcm9wcy5sb2FkKGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXMgPSBudWxsOwotCQl9Ci0KLQkJLy9TdGFydCBmaWd1cmluZyBvdXQgc3R1ZmZzIAotCQlVUkwgcm9vdFVSTCA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpICE9IG51bGwgPyBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKSA6IG51bGw7Ci0KLQkJLy9FeHRyYWN0aW5nIGZ3a0phciBsb2NhdGlvbiBuZWVkcyB0byBiZSBkb25lIGZpcnN0IAotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIGxhdW5jaGVyUGF0aCA9IG51bGw7Ci0JCWNvbmZpZ0RhdGEuc2V0QnVuZGxlcyhudWxsKTsKLQotCQlGaWxlIGZ3SmFyID0gbnVsbDsKLQkJaWYgKHByb3BzLmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9PU0dJX0ZXKSAhPSBudWxsKSB7Ci0JCQlwcm9wcy5zZXRQcm9wZXJ0eShLRVlfT1NHSV9GUkFNRVdPUkssIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKHByb3BzLmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9PU0dJX0ZXKSwgZ2V0T1NHaUluc3RhbGxBcmVhKGxhdW5jaGVyRGF0YSkudG9VUkwoKSkpOwotCQkJU3RyaW5nIGZ3SmFyU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX09TR0lfRlJBTUVXT1JLKTsKLQkJCWlmIChmd0phclN0cmluZyAhPSBudWxsKSB7Ci0JCQkJZndKYXIgPSBuZXcgRmlsZShuZXcgVVJMKGZ3SmFyU3RyaW5nKS5nZXRGaWxlKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0phcihmd0phcik7Ci0JCQkJY29uZmlnRGF0YS5hZGRCdW5kbGUobmV3IEJ1bmRsZUluZm8oZndKYXJTdHJpbmcpKTsKLQkJCX0KLQkJfQotCi0JCXByb3BzID0gbWFrZUFic29sdXRlKHByb3BzLCByb290VVJMLCBmd0phciwgaW5wdXRGaWxlLmdldFBhcmVudEZpbGUoKSwgZ2V0T1NHaUluc3RhbGxBcmVhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKSk7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotCQkJaWYgKGtleS5lcXVhbHMoRXF1aW5veENvbnN0YW50cy5QUk9QX0JVTkRMRVNfU1RBUlRMRVZFTCkpCi0JCQkJY29uZmlnRGF0YS5zZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuUFJPUF9JTklUSUFMX1NUQVJUTEVWRUwpKSB7Ci0JCQkJY29uZmlnRGF0YS5zZXRCZWdpbm5pbmdGd1N0YXJ0TGV2ZWwoSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpOwotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTKSkgewotCQkJCXNldEluc3RhbGxpbmdCdW5kbGVzKG1hbmlwdWxhdG9yLCB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0Z3RGVwZW5kZW50KGtleSkpIHsKLQkJCQkJY29uZmlnRGF0YS5zZXRGd0RlcGVuZGVudFByb3Aoa2V5LCB2YWx1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbmZpZ0RhdGEuc2V0RndJbmRlcGVuZGVudFByb3Aoa2V5LCB2YWx1ZSk7Ci0JCQkJaWYgKGtleS5lcXVhbHMoRXF1aW5veENvbnN0YW50cy5QUk9QX0xBVU5DSEVSX05BTUUpKQotCQkJCQlpZiAobGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkgPT0gbnVsbCkKLQkJCQkJCWxhdW5jaGVyTmFtZSA9IHZhbHVlOwotCQkJCWlmIChrZXkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuUFJPUF9MQVVOQ0hFUl9QQVRIKSkKLQkJCQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpID09IG51bGwpCi0JCQkJCQlsYXVuY2hlclBhdGggPSB2YWx1ZTsKLQkJCX0KLQkJfQotCQlpZiAobGF1bmNoZXJOYW1lICE9IG51bGwgJiYgbGF1bmNoZXJQYXRoICE9IG51bGwpIHsKLQkJCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShsYXVuY2hlclBhdGgsIGxhdW5jaGVyTmFtZSArIEVxdWlub3hDb25zdGFudHMuRVhFX0VYVEVOU0lPTikpOwotCQl9Ci0KLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19JTkZPLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfY29uZmlnRmlsZSwgaW5wdXRGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBtYWtlUmVsYXRpdmUoUHJvcGVydGllcyBwcm9wcywgVVJMIHJvb3RVUkwsIEZpbGUgZndKYXIsIEZpbGUgY29uZmlnQXJlYSwgRmlsZSBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcHJvcHMuZ2V0UHJvcGVydHkoUEFUSFNbaV0pOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlwcm9wcy5wdXQoUEFUSFNbaV0sIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZVJlbGF0aXZlKHBhdGgsIHJvb3RVUkwuZ2V0RmlsZSgpKSk7Ci0JCX0KLQotCQlpZiAocHJvcHMuZ2V0UHJvcGVydHkoS0VZX09TR0lfRlJBTUVXT1JLKSAhPSBudWxsICYmIG9zZ2lJbnN0YWxsQXJlYSAhPSBudWxsKSB7Ci0JCQlwcm9wcy5wdXQoS0VZX09TR0lfRlJBTUVXT1JLLCBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VSZWxhdGl2ZShwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1NHSV9GUkFNRVdPUkspLCBvc2dpSW5zdGFsbEFyZWEudG9VUkwoKSkpOwotCQl9Ci0KLQkJaWYgKHByb3BzLmdldFByb3BlcnR5KEtFWV9PUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9DT05GSUdVUkwpICE9IG51bGwpIHsKLQkJCXByb3BzLnB1dChLRVlfT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1JfQ09ORklHVVJMLCBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VSZWxhdGl2ZShwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1JfQ09ORklHVVJMKSwgY29uZmlnQXJlYS50b1VSTCgpKSk7Ci0JCX0KLQotCQlpZiAocHJvcHMuZ2V0UHJvcGVydHkoS0VZX0VDTElQU0VfUFJPVl9EQVRBX0FSRUEpICE9IG51bGwpIHsKLQkJCVN0cmluZyB1cmwgPSBwcm9wcy5nZXRQcm9wZXJ0eShLRVlfRUNMSVBTRV9QUk9WX0RBVEFfQVJFQSk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlUmVsYXRpdmUodXJsLCBjb25maWdBcmVhLnRvVVJMKCkpOwotCQkJCS8vV2Ugb25seSByZWxhdGl2aXplIHVwIHRvIHRoZSBsZXZlbCB3aGVyZSB0aGUgcDIgYW5kIGNvbmZpZyBmb2xkZXIgYXJlIHNpYmxpbmdzIChlLmcuIGZvby9wMiBhbmQgZm9vL2NvbmZpZykKLQkJCQlpZiAocmVzdWx0LnN0YXJ0c1dpdGgoImZpbGU6Li4vLi4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHQgPSB1cmw7Ci0JCQkJZWxzZSBpZiAoIXJlc3VsdC5lcXVhbHModXJsKSAmJiByZXN1bHQuc3RhcnRzV2l0aCgiZmlsZToiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHQgPSBDT05GSUdfRElSICsgcmVzdWx0LnN1YnN0cmluZyg1KTsKLQkJCQlwcm9wcy5wdXQoS0VZX0VDTElQU0VfUFJPVl9EQVRBX0FSRUEsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1NHSV9CVU5ETEVTKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgZndKYXIgIT0gbnVsbCkgewotCQkJRmlsZSBwYXJlbnQgPSBmd0phci5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJcHJvcHMuc2V0UHJvcGVydHkoS0VZX09TR0lfQlVORExFUywgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQXJyYXlSZWxhdGl2ZSh2YWx1ZSwgcGFyZW50LnRvVVJMKCkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBtYWtlQWJzb2x1dGUoUHJvcGVydGllcyBwcm9wcywgVVJMIHJvb3RVUkwsIEZpbGUgZndKYXIsIEZpbGUgY29uZmlnQXJlYSwgRmlsZSBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcHJvcHMuZ2V0UHJvcGVydHkoUEFUSFNbaV0pOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShQQVRIU1tpXSwgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQWJzb2x1dGUocGF0aCwgcm9vdFVSTC5nZXRGaWxlKCkpKTsKLQkJfQotCi0JCWlmIChwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1JfQ09ORklHVVJMKSAhPSBudWxsKSB7Ci0JCQlwcm9wcy5wdXQoS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCwgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQWJzb2x1dGUocHJvcHMuZ2V0UHJvcGVydHkoS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCksIGNvbmZpZ0FyZWEudG9VUkwoKSkpOwotCQl9Ci0KLQkJaWYgKHByb3BzLmdldFByb3BlcnR5KEtFWV9FQ0xJUFNFX1BST1ZfREFUQV9BUkVBKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdXJsID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX0VDTElQU0VfUFJPVl9EQVRBX0FSRUEpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJaWYgKHVybC5zdGFydHNXaXRoKENPTkZJR19ESVIpKQotCQkJCQl1cmwgPSAiZmlsZToiICsgdXJsLnN1YnN0cmluZyhDT05GSUdfRElSLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByb3BzLnB1dChLRVlfRUNMSVBTRV9QUk9WX0RBVEFfQVJFQSwgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQWJzb2x1dGUodXJsLCBjb25maWdBcmVhLnRvVVJMKCkpKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KEtFWV9PU0dJX0JVTkRMRVMpOwotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBmd0phciAhPSBudWxsKSB7Ci0JCQlGaWxlIHBhcmVudCA9IGZ3SmFyLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShLRVlfT1NHSV9CVU5ETEVTLCBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VBcnJheUFic29sdXRlKHZhbHVlLCBwYXJlbnQudG9VUkwoKSkpOwotCQl9Ci0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0T1NHaUluc3RhbGxBcmVhKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEpIHsKLQkJaWYgKGxhdW5jaGVyRGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdIGFyZ3MgPSBsYXVuY2hlckRhdGEuZ2V0UHJvZ3JhbUFyZ3MoKTsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcmdzW2ldLmVxdWFscygiLXN0YXJ0dXAiKSAmJiBpICsgMSA8IGFyZ3MubGVuZ3RoICYmIGFyZ3NbaSArIDFdLmNoYXJBdCgxKSAhPSAnLScpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmcm9tT1NHaUphclRvT1NHaUluc3RhbGxBcmVhKGFyZ3NbaSArIDFdKTsKLQkJCX0KLQkJfQotCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmcm9tT1NHaUphclRvT1NHaUluc3RhbGxBcmVhKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpICE9IG51bGwpCi0JCQlyZXR1cm4gbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGZyb21PU0dpSmFyVG9PU0dpSW5zdGFsbEFyZWEoU3RyaW5nIHBhdGgpIHsKLQkJSVBhdGggcGFyZW50Rm9sZGVyID0gbmV3IFBhdGgocGF0aCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlpZiAocGFyZW50Rm9sZGVyLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJwbHVnaW5zIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBwYXJlbnRGb2xkZXIucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvRmlsZSgpOwotCQlyZXR1cm4gcGFyZW50Rm9sZGVyLnRvRmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVGd0NvbmZpZyhCdW5kbGVJbmZvW10gYkluZm9zLCBNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgYm9vbGVhbiBiYWNrdXAsIGJvb2xlYW4gcmVsYXRpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ly97Ci0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlGaWxlIGZ3SmFyID0gRXF1aW5veEJ1bmRsZXNTdGF0ZS5nZXRGd0phcihsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEpOwotCQlsYXVuY2hlckRhdGEuc2V0RndKYXIoZndKYXIpOwotCQlGaWxlIG91dHB1dEZpbGUgPSBsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgewotCQkJaWYgKG91dHB1dEZpbGUuaXNGaWxlKCkpIHsKLQkJCQlpZiAoIW91dHB1dEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9md0NvbmZpZ0xvY2F0aW9uTmFtZSwgb3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKSk7Ci0JCQl9IGVsc2UgeyAvLyBEaXJlY3RvcnkKLQkJCQlvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0RmlsZSwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghb3V0cHV0RmlsZS5nZXROYW1lKCkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSkpIHsKLQkJCQlpZiAoIW91dHB1dEZpbGUubWtkaXIoKSkKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9mYWlsZWRUb0NyZWF0ZURpciwgb3V0cHV0RmlsZSkpOwotCQkJCW91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXRGaWxlLCBFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBoZWFkZXIgPSBOTFMuYmluZChNZXNzYWdlcy5tc2dfQ29uZmlnRmlsZUhlYWRlciwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLQkJUHJvcGVydGllcyBjb25maWdQcm9wcyA9IGdldENvbmZpZ1Byb3BzKGJJbmZvcywgY29uZmlnRGF0YSwgbGF1bmNoZXJEYXRhLCByZWxhdGl2ZSwgZndKYXIpOwotCQlpZiAoY29uZmlnUHJvcHMgPT0gbnVsbCB8fCBjb25maWdQcm9wcy5zaXplKCkgPT0gMCkgewotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCB0aGlzLCAic2F2ZUZ3Q29uZmlnKCkgIiwgTWVzc2FnZXMubG9nX2NvbmZpZ1Byb3BzKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCVV0aWxzLmNyZWF0ZVBhcmVudERpcihvdXRwdXRGaWxlKTsKLQotCQlpZiAoREVCVUcpCi0JCQlVdGlscy5wcmludG91dFByb3BlcnRpZXMoU3lzdGVtLm91dCwgImNvbmZpZ1Byb3BzIiwgY29uZmlnUHJvcHMpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGJhY2t1cCkKLQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJRmlsZSBkZXN0ID0gVXRpbHMuZ2V0U2ltcGxlRGF0YUZvcm1hdHRlZEZpbGUob3V0cHV0RmlsZSk7Ci0JCQkJaWYgKCFvdXRwdXRGaWxlLnJlbmFtZVRvKGRlc3QpKQotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX2ZhaWxlZFRvUmVuYW1lLCBvdXRwdXRGaWxlLCBkZXN0KSk7Ci0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19JTkZPLCB0aGlzLCAic2F2ZUZ3Q29uZmlnKCkiLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfcmVuYW1lU3VjY2Vzc2Z1bCwgb3V0cHV0RmlsZSwgZGVzdCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0JCQljb25maWdQcm9wcyA9IG1ha2VSZWxhdGl2ZShjb25maWdQcm9wcywgbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCksIGZ3SmFyLCBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKSwgZ2V0T1NHaUluc3RhbGxBcmVhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKSk7Ci0JCQljb25maWdQcm9wcy5zdG9yZShvdXQsIGhlYWRlcik7Ci0JCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0lORk8sIE5MUy5iaW5kKE1lc3NhZ2VzLmxvZ19md0NvbmZpZ1NhdmUsIG91dHB1dEZpbGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJb3V0LmZsdXNoKCk7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCW91dCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hMYXVuY2hlckRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veExhdW5jaGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjkxMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veExhdW5jaGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkxhdW5jaGVyRGF0YTsKLQotcHVibGljIGNsYXNzIEVxdWlub3hMYXVuY2hlckRhdGEgZXh0ZW5kcyBMYXVuY2hlckRhdGEgewotCUZpbGUgcHJldmlvdXNMYXVuY2hlciA9IG51bGw7Ci0KLQlwdWJsaWMgRXF1aW5veExhdW5jaGVyRGF0YShTdHJpbmcgZndOYW1lLCBTdHJpbmcgZndWZXJzaW9uLCBTdHJpbmcgbGF1bmNoZXJOYW1lLCBTdHJpbmcgbGF1bmNoZXJWZXJzaW9uKSB7Ci0JCXN1cGVyKGZ3TmFtZSwgZndWZXJzaW9uLCBsYXVuY2hlck5hbWUsIGxhdW5jaGVyVmVyc2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXIoRmlsZSBsYXVuY2hlckZpbGUpIHsKLQkJaWYgKHByZXZpb3VzTGF1bmNoZXIgPT0gbnVsbCAmJiBsYXVuY2hlckZpbGUgIT0gbnVsbCAmJiAhbGF1bmNoZXJGaWxlLmVxdWFscyhnZXRMYXVuY2hlcigpKSkKLQkJCXByZXZpb3VzTGF1bmNoZXIgPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLmdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24odGhpcyk7Ci0JCXN1cGVyLnNldExhdW5jaGVyKGxhdW5jaGVyRmlsZSk7Ci0JfQotCi0JRmlsZSBnZXRQcmV2aW91c0xhdW5jaGVySW5pKCkgewotCQlyZXR1cm4gcHJldmlvdXNMYXVuY2hlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hNYW5pcHVsYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDUwNTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlNpbXBsZUJ1bmRsZXNTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhcnRMZXZlbDsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94TWFuaXB1bGF0b3JJbXBsIGltcGxlbWVudHMgTWFuaXB1bGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9MQVNUTU9ESUZJRUQgPSAwTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19JTExFR0FMU1RBVEVFWENFUFRJT04gPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElmIHRoZSBmd0NvbmZpZ0xvY2F0aW9uIGlzIGEgZmlsZSBhbmQgaXRzIG5hbWUgZG9lcyBub3QgZXF1YWwgImNvbmZpZy5pbmkiLAotCSAqIHRocm93IGFuIElsbGVnYVN0YXRlRXhjZXB0aW9uLiAKLQkgKiBJZiB0aGUgZndDb25maWdMb2NhdGlvbiBpcyBhIGZpbGUgYW5kIGl0cyBuYW1lIGVxdWFscyAiY29uZmlnLmluaSIsCi0JICogZndDb25maWdMb2NhdGlvbiB3aWxsIGJlIHVwZGF0ZWQgYnkgaXRzIHBhcmVudCBkaXJlY3RvcnkuCi0JICogCi0JICogVGhlbiwgcmVzZXQgZndDb25maWdMb2NhdGlvbiBhbmQgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uIHRvIGJlIG1hdGNoZWQuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaGVyRGF0YQotCSAqLwotCXN0YXRpYyB2b2lkIGNoZWNrQ29uc2lzdGVuY3lPZkZ3Q29uZmlnTG9jQW5kRndQZXJzaXN0ZW50RGF0YUxvYyhMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JCUZpbGUgZndDb25maWdMb2NhdGlvbiA9IGxhdW5jaGVyRGF0YS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCk7Ci0JCUZpbGUgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uID0gbGF1bmNoZXJEYXRhLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpOwotCi0JCWlmIChmd0NvbmZpZ0xvY2F0aW9uICE9IG51bGwpIHsKLQkJCWlmIChmd0NvbmZpZ0xvY2F0aW9uLmlzRmlsZSgpKSB7Ci0JCQkJaWYgKGZ3Q29uZmlnTG9jYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpKQotCQkJCQlmd0NvbmZpZ0xvY2F0aW9uID0gZndDb25maWdMb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmd0NvbmZpZ0xvY2F0aW9uIGlzIG5vdCBhIGRpcmVjdG9yeSBidXQgaXRzIG5hbWUgZG9lcyBOT1QgZXF1YWwgXCIiICsgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JICsgIlwiIVxuIiArICJcdGZ3Q29uZmlnTG9jYXRpb249IiArIGZ3Q29uZmlnTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXG5cdCxmd1BlcnNpc3RlbnREYXRhTG9jYXRpb249IiArIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oZndDb25maWdMb2NhdGlvbik7Ci0JCQl9Ci0JCQlpZiAoZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkvLwkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCAiZndDb25maWdMb2NhdGlvbj0iICsgZndDb25maWdMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSArICIsXG5cdGZ3SW5zdGFuY2VQcml2YXRlQXJlYT0iICsgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkvL2lmICghZndDb25maWdMb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCkuZXF1YWxzKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbikpCi0JCQkJLy90aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIhY29uZmlnRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXF1YWxzKGZ3SW5zdGFuY2VQcml2YXRlQXJlYSlcbiIgKyAiXHRjb25maWdGaWxlPSIgKyBmd0NvbmZpZ0xvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpICsgIlxuXHQsZndJbnN0YW5jZVByaXZhdGVBcmVhPSIgKyBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWlmICghZndDb25maWdMb2NhdGlvbi5lcXVhbHMoZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIWZ3Q29uZmlnTG9jYXRpb24uZXF1YWxzKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbilcbiIgKyAiXHQhZndDb25maWdMb2NhdGlvbj0iICsgZndDb25maWdMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSArICJcblx0LGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbj0iICsgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oZndDb25maWdMb2NhdGlvbiwgbGF1bmNoZXJEYXRhLmlzQ2xlYW4oKSk7Ci0JCQkvL2xhdW5jaGVyRGF0YS5zZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oZndDb25maWdMb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCksIGxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpOwotCQl9IGVsc2UgewotCQkJaWYgKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKTsKLQkJCQkvL2xhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKG5ldyBGaWxlKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKSk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgaG9tZSA9IGxhdW5jaGVyRGF0YS5nZXRIb21lKCk7Ci0JCQkJaWYgKGhvbWUgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxsIG9mIGZ3Q29uZmlnTG9jYXRpb24sIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiwgYW5kIGhvbWUgYXJlIG5vdCBzZXQiKTsKLQkJCQlmd0NvbmZpZ0xvY2F0aW9uID0gbmV3IEZpbGUoaG9tZSwgImNvbmZpZ3VyYXRpb24iKTsKLQkJCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24sIGxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIEZpbGUgZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JCUZpbGUgbGF1bmNoZXJDb25maWdMb2NhdGlvbiA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKCk7Ci0JCWlmIChsYXVuY2hlckNvbmZpZ0xvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gbGF1bmNoZXJDb25maWdMb2NhdGlvbjsKLQotCQlGaWxlIGxhdW5jaGVyID0gbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCk7Ci0JCWlmIChsYXVuY2hlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSBsYXVuY2hlci5nZXROYW1lKCk7Ci0JCWludCBkb3RMb2NhdGlvbiA9IGxhdW5jaGVyTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQlpZiAoZG90TG9jYXRpb24gIT0gLTEpCi0JCQlsYXVuY2hlck5hbWUgPSBsYXVuY2hlck5hbWUuc3Vic3RyaW5nKDAsIGRvdExvY2F0aW9uKTsKLQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZShsYXVuY2hlci5nZXRQYXJlbnQoKSArIEZpbGUuc2VwYXJhdG9yICsgbGF1bmNoZXJOYW1lICsgRXF1aW5veENvbnN0YW50cy5JTklfRVhURU5TSU9OKTsKLQkJLy8JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQ29uZmlnRGF0YSBjb25maWdEYXRhID0gbmV3IENvbmZpZ0RhdGEoRXF1aW5veENvbnN0YW50cy5GV19OQU1FLCBFcXVpbm94Q29uc3RhbnRzLkZXX1ZFUlNJT04sIEVxdWlub3hDb25zdGFudHMuTEFVTkNIRVJfTkFNRSwgRXF1aW5veENvbnN0YW50cy5MQVVOQ0hFUl9WRVJTSU9OKTsKLQlFcXVpbm94TGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG5ldyBFcXVpbm94TGF1bmNoZXJEYXRhKEVxdWlub3hDb25zdGFudHMuRldfTkFNRSwgRXF1aW5veENvbnN0YW50cy5GV19WRVJTSU9OLCBFcXVpbm94Q29uc3RhbnRzLkxBVU5DSEVSX05BTUUsIEVxdWlub3hDb25zdGFudHMuTEFVTkNIRVJfVkVSU0lPTik7Ci0KLQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JU2VydmljZVRyYWNrZXIgY21UcmFja2VyOwotCWludCB0cmFja2luZ0NvdW50ID0gLTE7Ci0KLQkvLwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcnVudGltZTsKLQotCUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotCi0JRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4gPSBudWxsOwotCi0JRXF1aW5veE1hbmlwdWxhdG9ySW1wbChCdW5kbGVDb250ZXh0IGNvbnRleHQsIEVxdWlub3hGd0FkbWluSW1wbCBmd0FkbWluKSB7Ci0JCXRoaXMoY29udGV4dCwgZndBZG1pbiwgZmFsc2UpOwotCX0KLQotCUVxdWlub3hNYW5pcHVsYXRvckltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbiwgYm9vbGVhbiBydW50aW1lKSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuZndBZG1pbiA9IGZ3QWRtaW47Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWNtVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBDb25maWd1cmF0b3JNYW5pcHVsYXRvci5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkJY21UcmFja2VyLm9wZW4oKTsKLQkJfQotCQkvLwkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJaWYgKHJ1bnRpbWUpCi0JCQlpbml0aWFsaXplUnVudGltZSgpOwotCQkvLyBYWFggRm9yIEVxdWlub3gsIGRlZmF1bHQgdmFsdWUgb2YgSW5pdGlhbCBCdW5kbGUgU3RhcnQgTGV2ZWwgaXMgNC4KLQkJLy8gUHJlY2lzZWx5IHNwZWFraW5nLCBpdCdzIG5vdCBjb3JyZWN0LiAKLQkJLy8gRXF1aW5veCBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyBpbml0aWFsIGJ1bmRsZSBzdGFydCBsZXZlbCBhcyBhbiBPU0dpIHRlcm1pbm9sb2d5LgotCQkvLyBPbmx5IGJ1bmRsZXMgaW5zdGFsbGVkIGJ5IGNvbmZpZy5pbmkgYW5kIHVwZGF0ZWNvbmZpZ3VyYXRvciB3aWxsIGhhdmUgdGhhdCBzdGFydCBsZXZlbCg0KS4KLQkJLy8gT3RoZXJzIGhhcyBhIHN0YXJ0IGxldmVsIG9mIDEuCi0JCWNvbmZpZ0RhdGEuc2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoNCk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZXNTdGF0ZSBnZXRCdW5kbGVzU3RhdGUoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU2ltcGxlQnVuZGxlc1N0YXRlKGZ3QWRtaW4sIHRoaXMsIEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSk7Ci0KLQkJaWYgKCFFcXVpbm94QnVuZGxlc1N0YXRlLmNoZWNrRnVsbHlTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBuZXcgU2ltcGxlQnVuZGxlc1N0YXRlKGZ3QWRtaW4sIHRoaXMsIEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSk7Ci0KLQkJaWYgKHBsYXRmb3JtUHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IEVxdWlub3hCdW5kbGVzU3RhdGUoY29udGV4dCwgZndBZG1pbiwgdGhpcywgZmFsc2UpOwotCQkvLyBYWFggY2hlY2tpbmcgaWYgZndEZXBlbmRlbnQgb3IgZndJbmRlcGVuZGVudCBwbGF0Zm9ybVByb3BlcnRpZXMgYXJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIHBsYXRmb3JtUHJvcGVydGllcyB3YXMgY3JlYXRlZCBtaWdodCBiZSByZXF1aXJlZCBmb3IgYmV0dGVyIGltcGxlbWVudGF0aW9uLgkJCi0JCXJldHVybiBuZXcgRXF1aW5veEJ1bmRsZXNTdGF0ZShjb250ZXh0LCBmd0FkbWluLCB0aGlzLCBwbGF0Zm9ybVByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBDb25maWdEYXRhIGdldENvbmZpZ0RhdGEoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbmZpZ0RhdGE7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRFeHBlY3RlZFN0YXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJLy9Mb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAiZ2V0RXhwZWN0ZWRTdGF0ZSgpIiwgIkJFR0lOIik7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQotCQlCdW5kbGVzU3RhdGUgYnVuZGxlU3RhdGUgPSB0aGlzLmdldEJ1bmRsZXNTdGF0ZSgpOwotCQlpZiAoYnVuZGxlU3RhdGUgaW5zdGFuY2VvZiBTaW1wbGVCdW5kbGVzU3RhdGUpCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZUluZm9bMF07Ci0JCWJ1bmRsZVN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0KLQkJcmV0dXJuIGJ1bmRsZVN0YXRlLmdldEV4cGVjdGVkU3RhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoZXJEYXRhIGdldExhdW5jaGVyRGF0YSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlyZXR1cm4gbGF1bmNoZXJEYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAc2VlIExvY2F0aW9uCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldFJ1bm5pbmdDb25maWd1cmF0aW9uTG9jYXRpb24oKSB7Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbHRlciA9IGNvbnRleHQuY3JlYXRlRmlsdGVyKExvY2F0aW9uLkNPTkZJR1VSQVRJT05fRklMVEVSKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUgdGhpcy4gSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB3ZSBoYXZlIHRlc3RlZCB0aGUgYWJvdmUgZm9ybWF0LgotCQl9Ci0JCXRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgZmlsdGVyLCBudWxsKTsKLQkJdHJhY2tlci5vcGVuKCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB0cmFja2VyLmdldFNlcnZpY2UoKTsKLQkJVVJMIHVybCA9IGxvY2F0aW9uLmdldFVSTCgpOwotCQlpZiAoIXVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0UnVubmluZ0xhdW5jaGVyRmlsZSgpIHsKLQkJRmlsZSBsYXVuY2hlckZpbGUgPSBudWxsOwotCQlTdHJpbmcgZWNsaXBzZUNvbW1hbmRzU3QgPSBjb250ZXh0LmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9FQ0xJUFNFX0NPTU1BTkRTKTsKLQkJaWYgKGVjbGlwc2VDb21tYW5kc1N0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlY2xpcHNlQ29tbWFuZHNTdCwgIlxuIik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJU3RyaW5nIGxhdW5jaGVyU3QgPSBudWxsOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJbGF1bmNoZXJTdCA9IHRva2VuOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHRva2VuLmVxdWFscygiLWxhdW5jaGVyIikpCi0JCQkJZm91bmQgPSB0cnVlOwotCQl9Ci0JCWlmIChsYXVuY2hlclN0ICE9IG51bGwpCi0JCQlsYXVuY2hlckZpbGUgPSBuZXcgRmlsZShsYXVuY2hlclN0KTsKLQkJcmV0dXJuIGxhdW5jaGVyRmlsZTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgZ2V0UnVubmluZ1BsYXRmb3JtUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRXF1aW5veEJ1bmRsZXNTdGF0ZS5QUk9QUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29udGV4dC5nZXRQcm9wZXJ0eShFcXVpbm94QnVuZGxlc1N0YXRlLlBST1BTW2ldKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hCdW5kbGVzU3RhdGUuUFJPUFNbaV0sIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0VGltZVN0YW1wKCkgewotCQlsb25nIHJldCA9IHRoaXMuZ2V0VGltZVN0YW1wV2l0aG91dEZ3UGVyc2lzdGVudERhdGEoKTsKLQkJaWYgKHRoaXMubGF1bmNoZXJEYXRhLmlzQ2xlYW4oKSkKLQkJCXJldHVybiByZXQ7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkRndQZXJzaXN0ZW50ID0gRXF1aW5veEJ1bmRsZXNTdGF0ZS5nZXRUaW1lU3RhbXAobGF1bmNoZXJEYXRhLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpKTsKLQkJcmV0dXJuIE1hdGgubWF4KHJldCwgbGFzdE1vZGlmaWVkRndQZXJzaXN0ZW50KTsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZ2V0VGltZVN0YW1wV2l0aG91dEZ3UGVyc2lzdGVudERhdGEoKSB7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQkJRmlsZSBsYXVuY2hlckNvbmZpZ0ZpbGUgPSBnZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKGxhdW5jaGVyRGF0YSk7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkTGF1bmNoZXJDb25maWdGaWxlID0gREVGQVVMVF9MQVNUTU9ESUZJRUQ7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkRndDb25maWdGaWxlID0gREVGQVVMVF9MQVNUTU9ESUZJRUQ7Ci0JCWlmIChsYXVuY2hlckNvbmZpZ0ZpbGUgIT0gbnVsbCkgewotCQkJLy8gdXNlIGxhdW5jaGVyLiAtLSA+IGxvYWQgZnJvbSBMYXVjbmhlckNvbmZpZyBmaWxlLgotCQkJbGFzdE1vZGlmaWVkTGF1bmNoZXJDb25maWdGaWxlID0gbGF1bmNoZXJDb25maWdGaWxlLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCWNoZWNrQ29uc2lzdGVuY3lPZkZ3Q29uZmlnTG9jQW5kRndQZXJzaXN0ZW50RGF0YUxvYyhsYXVuY2hlckRhdGEpOwotCi0JCWlmIChsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCUZpbGUgZndDb25maWdGaWxlID0gbmV3IEZpbGUobGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKSwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKTsKLQkJCWxhc3RNb2RpZmllZEZ3Q29uZmlnRmlsZSA9IGZ3Q29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlsb25nIHJldCA9IE1hdGgubWF4KGxhc3RNb2RpZmllZExhdW5jaGVyQ29uZmlnRmlsZSwgbGFzdE1vZGlmaWVkRndDb25maWdGaWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvLwkvLyAKLQkvLwlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JLy8JCXRoaXMubG9hZCh0cnVlKTsKLQkvLwl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAiaW5pdGlhbGl6ZSgpIiwgIkJFR0lOIik7Ci0JCWNvbmZpZ0RhdGEuaW5pdGlhbGl6ZSgpOwotCQlsYXVuY2hlckRhdGEuaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUnVudGltZSgpIHsKLQkJLy9UT0RPIHJlZmluZSB0aGUgaW1wbGVtZW50YXRpb24uIHVzaW5nIHNvbWUgTUFHSUMgZGVwZW5kZW50IG9uIEVjbGlwc2UuZXhlIGFuZCBFcXVpbm94IGltcGxlbWVudGF0aW9uLAotCQkvLyBzZXQgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcnVubmluZyBmdy4KLQotCQkvLyAxLiByZXRyaWV2ZSBsb2NhdGlvbiBkYXRhIGZyb20gTG9jYXRpb24gc2VydmljZXMgcmVnaXN0ZXJlZCBieSBlcXVpbm94IGZ3LgotCQlTdHJpbmcgZndKYXJMb2NhdGlvbiA9IGNvbnRleHQuZ2V0UHJvcGVydHkoRXF1aW5veENvbnN0YW50cy5QUk9QX09TR0lfRlcpOwotCQlpZiAoIWZ3SmFyTG9jYXRpb24uc3RhcnRzV2l0aCgiZmlsZToiKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1cnJlbnQgaW1wbGVtZW50YXRpb24gYXNzdW1lIHRoYXQgcHJvcGVydHkgdmFsdWUga2V5ZWQgYnkgIiArIEVxdWlub3hDb25zdGFudHMuUFJPUF9PU0dJX0ZXICsgIiBtdXN0IHN0YXJ0IHdpdGggXCJmaWxlOlwiLiBCdXQgaXQgd2FzIG5vdDoiICsgZndKYXJMb2NhdGlvbik7Ci0JCUZpbGUgZndKYXIgPSBuZXcgRmlsZShmd0phckxvY2F0aW9uLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJmd0phcj0iICsgZndKYXIpOwotCQlGaWxlIGZ3Q29uZmlnTG9jYXRpb24gPSBnZXRSdW5uaW5nQ29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCUZpbGUgbGF1bmNoZXJGaWxlID0gZ2V0UnVubmluZ0xhdW5jaGVyRmlsZSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndKYXIoZndKYXIpOwotCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24sIGZhbHNlKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKGxhdW5jaGVyRmlsZSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWRXaXRob3V0RndQZXJzaXN0ZW50RGF0YSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQkvLyAyLiBDcmVhdGUgYSBNYW5pcHVsYXRvciBvYmplY3QgZnVsbHkgaW5pdGlhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgcnVubmluZyBmdy4KLQotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShTdGFydExldmVsLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVN0YXJ0TGV2ZWwgc3RhcnRMZXZlbCA9IChTdGFydExldmVsKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IGNvbnRleHQuZ2V0QnVuZGxlcygpOwotCQlCdW5kbGVJbmZvW10gYkluZm9zID0gbmV3IEJ1bmRsZUluZm9bYnVuZGxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJidW5kbGVzWyIgKyBpICsgIl09IiArIGJ1bmRsZXNbaV0pOwotCQkJdHJ5IHsKLQkJCQlpZiAoYnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpID09IDApIC8vIFN5c3RlbUJ1bmRsZQotCQkJCQliSW5mb3NbaV0gPSBuZXcgQnVuZGxlSW5mbyhidW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCAoU3RyaW5nKSBidW5kbGVzW2ldLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGVzW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKSwgLTEsIHRydWUpOwotCQkJCWVsc2UgewotCQkJCQliSW5mb3NbaV0gPSBuZXcgQnVuZGxlSW5mbyhidW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCAoU3RyaW5nKSBidW5kbGVzW2ldLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGVzW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKSwgc3RhcnRMZXZlbC5nZXRCdW5kbGVTdGFydExldmVsKGJ1bmRsZXNbaV0pLCBzdGFydExldmVsLmlzQnVuZGxlUGVyc2lzdGVudGx5U3RhcnRlZChidW5kbGVzW2ldKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJY29uZmlnRGF0YS5zZXRCdW5kbGVzKGJJbmZvcyk7Ci0JCXBsYXRmb3JtUHJvcGVydGllcyA9IHRoaXMuZ2V0UnVubmluZ1BsYXRmb3JtUHJvcGVydGllcygpOwotCi0JCS8vIGNvcHkgc3lzdGVtIHByb3BlcnRpZXMgdG8gQ29uZmlnRGF0YQotCQlQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BzLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JCQlpZiAodG9CZUVsaW1pbmF0ZWQoa2V5KSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChFcXVpbm94RndDb25maWdGaWxlUGFyc2VyLmlzRndEZXBlbmRlbnQoa2V5KSkKLQkJCQljb25maWdEYXRhLnNldEZ3RGVwZW5kZW50UHJvcChrZXksIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQljb25maWdEYXRhLnNldEZ3SW5kZXBlbmRlbnRQcm9wKGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gdXBkYXRlIGluaXRpYWxCdW5kbGVTdGFydExldmVsCi0JCVN0YXJ0TGV2ZWwgc2xBZG1pbiA9IChTdGFydExldmVsKSBBY3RpdmF0b3IuYWNxdWlyZVNlcnZpY2UoU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCkpOwotCQlpbnQgaW5pdGlhbEJTTCA9IGNvbmZpZ0RhdGEuZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKTsKLQkJaWYgKGluaXRpYWxCU0wgIT0gc2xBZG1pbi5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKQotCQkJY29uZmlnRGF0YS5zZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbChzbEFkbWluLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCkpOwotCi0JCS8vCQlmb3IgKGludCBqID0gMDsgaiA8IGJJbmZvcy5sZW5ndGg7IGorKykKLQkJLy8JCQljb25maWdEYXRhLmFkZEJ1bmRsZShiSW5mb3Nbal0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3IjbG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAibG9hZCgpIiwgIkJFR0lOIik7Ci0JCWxvYWRXaXRob3V0RndQZXJzaXN0ZW50RGF0YSgpOwotCi0JCUJ1bmRsZXNTdGF0ZSBidW5kbGVzU3RhdGUgPSBudWxsOwotCQlpZiAoRXF1aW5veEJ1bmRsZXNTdGF0ZS5jaGVja0Z1bGx5U3VwcG9ydGVkKCkpIHsKLQkJCS8vCWJ1bmRsZXNTdGF0ZSA9IG5ldyBFcXVpbm94QnVuZGxlc1N0YXRlKGNvbnRleHQsIGZ3QWRtaW4sIHRoaXMsIHRydWUsIHJ1bnRpbWUpOwotCQkJYnVuZGxlc1N0YXRlID0gbmV3IEVxdWlub3hCdW5kbGVzU3RhdGUoY29udGV4dCwgZndBZG1pbiwgdGhpcywgIWxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpOwotCQkJcGxhdGZvcm1Qcm9wZXJ0aWVzID0gKChFcXVpbm94QnVuZGxlc1N0YXRlKSBidW5kbGVzU3RhdGUpLmdldFBsYXRmb3JtUHJvcGVydGllcygpOwotCi0JCX0gZWxzZSB7Ci0JCQlidW5kbGVzU3RhdGUgPSBuZXcgU2ltcGxlQnVuZGxlc1N0YXRlKGZ3QWRtaW4sIHRoaXMsIEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSk7Ci0JCQlwbGF0Zm9ybVByb3BlcnRpZXMuY2xlYXIoKTsKLQkJfQotCQl1cGRhdGVBY2NvcmRpbmdUb0V4cGVjdGVkU3RhdGUoYnVuZGxlc1N0YXRlKTsKLQkJLy8JCWlmICghdXNlQ29uZmlndXJhdG9yKQotCQkvLwkJCXJldHVybjsKLQkJc2V0Q29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQkJaWYgKHRoaXMuY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29uZmlndXJhdG9yTWFuaXB1bGF0b3IudXBkYXRlQnVuZGxlcyh0aGlzKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkV2l0aG91dEZ3UGVyc2lzdGVudERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCUZpbGUgbGF1bmNoZXJDb25maWdGaWxlID0gZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihsYXVuY2hlckRhdGEpOwotCQlpZiAobGF1bmNoZXJDb25maWdGaWxlICE9IG51bGwpIHsKLQkJCS8vIHVzZSBsYXVuY2hlci4gLS0gPiBsb2FkIGZyb20gTGF1Y25oZXJDb25maWcgZmlsZS4KLQkJCS8vIHRoZSBwYXJhbWV0ZXJzIGluIG1lbW9yeSB3aWxsIGJlIHVwZGF0ZWQuCi0JCQlFY2xpcHNlTGF1bmNoZXJQYXJzZXIgcGFyc2VyID0gbmV3IEVjbGlwc2VMYXVuY2hlclBhcnNlcigpOwotCQkJcGFyc2VyLnJlYWQobGF1bmNoZXJEYXRhKTsKLQkJfQotCQljaGVja0NvbnNpc3RlbmN5T2ZGd0NvbmZpZ0xvY0FuZEZ3UGVyc2lzdGVudERhdGFMb2MobGF1bmNoZXJEYXRhKTsKLQotCQlGaWxlIGZ3Q29uZmlnRmlsZSA9IG5ldyBGaWxlKGxhdW5jaGVyRGF0YS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCksIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSk7Ci0JCUVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIoY29udGV4dCk7Ci0JCWlmIChmd0NvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0JCQlwYXJzZXIucmVhZEZ3Q29uZmlnKHRoaXMsIGZ3Q29uZmlnRmlsZSk7Ci0KLQl9Ci0KLQkvLyBTYXZlIGFsbCBwYXJhbWV0ZXIgaW4gbWVtb3J5IGludG8gcHJvcGVyIGNvbmZpZyBmaWxlcy4KLQlwdWJsaWMgdm9pZCBzYXZlKGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCUxvZy5sb2coTG9nU2VydmljZS5MT0dfREVCVUcsIHRoaXMsICJzYXZlKCkiLCAiQkVHSU4iKTsKLQkJU2ltcGxlQnVuZGxlc1N0YXRlLmNoZWNrQXZhaWxhYmlsaXR5KGZ3QWRtaW4pOwotCi0JCXRyeSB7Ci0JCQl1cGRhdGVBY2NvcmRpbmdUb0V4cGVjdGVkU3RhdGUodGhpcy5nZXRCdW5kbGVzU3RhdGUoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUuCi0JCX0KLQkJLy8JCUZpbGUgZndKYXIgPSBFcXVpbm94QnVuZGxlc1N0YXRlLmdldEZ3SmFyKGxhdW5jaGVyRGF0YSwgY29uZmlnRGF0YSk7Ci0JCS8vCQlpZiAoZndKYXIgIT0gbnVsbCkKLQkJLy8JCQlsYXVuY2hlckRhdGEuc2V0RndKYXIoZndKYXIpOwotCi0JCS8vaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgcHJldmlvdXNDb25maWd1cmF0b3IgPSBzZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpOwotCQlpZiAocHJldmlvdXNDb25maWd1cmF0b3IgIT0gbnVsbCkKLQkJCXByZXZpb3VzQ29uZmlndXJhdG9yLmNsZWFudXAodGhpcyk7Ci0KLQkJQnVuZGxlSW5mb1tdIG5ld0JJbmZvcyA9IG51bGw7Ci0JCWlmIChjb25maWd1cmF0b3JNYW5pcHVsYXRvciAhPSBudWxsKSB7IC8vIE9wdGltaXplIEJ1bmRsZUluZm9bXSAKLQkJCXRyeSB7Ci0JCQkJbmV3QkluZm9zID0gY29uZmlndXJhdG9yTWFuaXB1bGF0b3Iuc2F2ZSh0aGlzLCBiYWNrdXApOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJaWYgKExPR19JTExFR0FMU1RBVEVFWENFUFRJT04pCi0JCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgdGhpcywgInNhdmUoKSIsIGUpOwotCQkJCW5ld0JJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbmV3QkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCX0KLQotCQlib29sZWFuIHN0YXRlSXNFbXB0eSA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpLmxlbmd0aCA9PSAwOwotCi0JCUZpbGUgbGF1bmNoZXJDb25maWdGaWxlID0gZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihsYXVuY2hlckRhdGEpOwotCQlpZiAobGF1bmNoZXJDb25maWdGaWxlICE9IG51bGwpIHsKLQkJCWlmICghc3RhdGVJc0VtcHR5KSB7Ci0JCQkJLy8gVXNlIGxhdW5jaGVyLiAtLSA+IHNhdmUgTGF1bmNoZXJDb25maWcgZmlsZS4KLQkJCQlFY2xpcHNlTGF1bmNoZXJQYXJzZXIgbGF1bmNoZXJQYXJzZXIgPSBuZXcgRWNsaXBzZUxhdW5jaGVyUGFyc2VyKCk7Ci0JCQkJbGF1bmNoZXJQYXJzZXIuc2F2ZShsYXVuY2hlckRhdGEsIHRydWUsIGJhY2t1cCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIE5vIGJ1bmRsZXMgaW4gY29uZmlndXJhdGlvbiwgc28gZGVsZXRlIHRoZSBsYXVuY2hlciBjb25maWcgZmlsZQotCQkJCWxhdW5jaGVyQ29uZmlnRmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCWNoZWNrQ29uc2lzdGVuY3lPZkZ3Q29uZmlnTG9jQW5kRndQZXJzaXN0ZW50RGF0YUxvYyhsYXVuY2hlckRhdGEpOwotCi0JCS8vCQkvL2lmIChjb250ZXh0ICE9IG51bGwpCi0JCS8vCQlzZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpOwotCQkvLwotCQkvLwkJQnVuZGxlSW5mb1tdIG5ld0JJbmZvcyA9IG51bGw7Ci0JCS8vCQlpZiAoY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgIT0gbnVsbCkgeyAvLyBPcHRpbWl6ZSBCdW5kbGVJbmZvW10gCi0JCS8vCQkJdHJ5IHsKLQkJLy8JCQkJbmV3QkluZm9zID0gY29uZmlndXJhdG9yTWFuaXB1bGF0b3Iuc2F2ZSh0aGlzLCBiYWNrdXApOwotCQkvLwkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJLy8JCQkJaWYgKExPR19JTExFR0FMU1RBVEVFWENFUFRJT04pCi0JCS8vCQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJzYXZlKCkiLCBlKTsKLQkJLy8JCQkJbmV3QkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCS8vCQkJfQotCQkvLwkJfSBlbHNlIHsKLQkJLy8JCQluZXdCSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJLy8JCX0KLQotCQlpZiAoIXN0YXRlSXNFbXB0eSkgewotCQkJLy8gU2F2ZSBGd0NvbmZpZ0ZpbGUKLQkJCUVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIoY29udGV4dCk7Ci0JCQlwYXJzZXIuc2F2ZUZ3Q29uZmlnKG5ld0JJbmZvcy5sZW5ndGggIT0gMCA/IG5ld0JJbmZvcyA6IGdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCksIHRoaXMsIGJhY2t1cCwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJRmlsZSBjb25maWdEaXIgPSBsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoY29uZmlnRGlyLCBFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpOwotCQkJaWYgKG91dHB1dEZpbGUgIT0gbnVsbCAmJiBvdXRwdXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJb3V0cHV0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCWlmIChjb25maWdEaXIgIT0gbnVsbCAmJiBjb25maWdEaXIuZXhpc3RzKCkpIHsKLQkJCQljb25maWdEaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWdEYXRhKENvbmZpZ0RhdGEgY29uZmlnRGF0YSkgewotCQl0aGlzLmNvbmZpZ0RhdGEuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmNvbmZpZ0RhdGEuc2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoY29uZmlnRGF0YS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKTsKLQkJdGhpcy5jb25maWdEYXRhLnNldEJlZ2lubmluZ0Z3U3RhcnRMZXZlbChjb25maWdEYXRhLmdldEJlZ2luaW5nRndTdGFydExldmVsKCkpOwotCQlCdW5kbGVJbmZvW10gYkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYkluZm9zLmxlbmd0aDsgaSsrKQotCQkJdGhpcy5jb25maWdEYXRhLmFkZEJ1bmRsZShiSW5mb3NbaV0pOwotCQl0aGlzLmNvbmZpZ0RhdGEuc2V0RndJbmRlcGVuZGVudFByb3BzKGNvbmZpZ0RhdGEuZ2V0RndJbmRlcGVuZGVudFByb3BzKCkpOwotCQlpZiAodGhpcy5jb25maWdEYXRhLmdldEZ3TmFtZSgpLmVxdWFscyhjb25maWdEYXRhLmdldEZ3TmFtZSgpKSkKLQkJCWlmICh0aGlzLmNvbmZpZ0RhdGEuZ2V0RndWZXJzaW9uKCkuZXF1YWxzKGNvbmZpZ0RhdGEuZ2V0RndWZXJzaW9uKCkpKSB7Ci0JCQkJLy8gVE9ETyByZWZpbmUgdGhlIGFsZ29yaXRobSB0byBjb3B5aW5nIGZ3IGRlcGVuZGVudCBwcm9wcy4KLQkJCQkvLyAgY29uZmlnRGF0YS5nZXRGd05hbWUoKS9nZXRGd1ZlcnNpb24oKS8KLQkJCQkvLwlnZXRMYXVuY2hlck5hbWUoKS9nZXRMYXVuY2hlclZlcnNpb24oKSBtaWdodCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIAotCQkJCXRoaXMuY29uZmlnRGF0YS5zZXRGd0RlcGVuZGVudFByb3BzKGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpKTsKLQkJCX0KLQl9Ci0KLQkvKioKLQkgKiAxLiBnZXQgYWxsIFNlcnZpY2VSZWZlcmVuY2VzIG9mIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLiAgIAotCSAqIDIuIENoZWNrIGlmIHRoZXJlIGFueSBDb25maWd1cmF0b3JCdW5kbGUgaW4gdGhlIEJ1bmRsZXMgbGlzdCB0aGF0IGNhbiBiZSBtYW5pcHVsYXRlZCBieSAKLQkgKiAJdGhlIGF2YWlsYWJsZSBDb25maWd1cmF0b3JNYW5pcHVsYXRvcnMuCi0JICogMy4gQ2hvb3NlIHRoZSBvbmUgdGhhdCB3aWxsIGJlIGZpcnN0bHkgc3RhcnRlZCBhbW9uZyB0aGVtLgotCSAqIDQuIHNldCB0aGUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNob3NlbiBDb25maWd1cmF0b3JCdW5kbGUuICAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIHNldENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yID0gdGhpcy5md0FkbWluLmdldENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTZXJ2aWNlUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGNtVHJhY2tlci5nZXRTZXJ2aWNlUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8JCWludCBjb3VudCA9IGNtVHJhY2tlci5nZXRUcmFja2luZ0NvdW50KCk7Ci0JCS8vCQlpZiAoY291bnQgPT0gdGhpcy50cmFja2luZ0NvdW50KQotCQkvLwkJCXJldHVybjsKLQkJLy8JCXRoaXMudHJhY2tpbmdDb3VudCA9IGNvdW50OwotCi0JCUJ1bmRsZUluZm9bXSBiSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJaW50IGluaXRpYWxCU0wgPSBjb25maWdEYXRhLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCk7Ci0JCWJJbmZvcyA9IFV0aWxzLnNvcnRCdW5kbGVJbmZvcyhiSW5mb3MsIGluaXRpYWxCU0wpOwotCQkvL2ludCBpbmRleCA9IC0xOwkKLQkJQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgcHJldmlvdXNDb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotCQljb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBiSW5mb3NbaV0uZ2V0TG9jYXRpb24oKTsKLQkJCWxvY2F0aW9uID0gRmlsZVV0aWxzLmdldFJlYWxMb2NhdGlvbih0aGlzLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCQlpZiAoIWJJbmZvc1tpXS5pc01hcmtlZEFzU3RhcnRlZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKQotCQkJCWlmIChyZWZlcmVuY2VzW2pdLmdldFByb3BlcnR5KENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLlNFUlZJQ0VfUFJPUF9LRVlfQ09ORklHVVJBVE9SX0JVTkRMRVNZTUJPTElDTkFNRSkuZXF1YWxzKFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSkpKSB7Ci0JCQkJCWNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yID0gKENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKSBjbVRyYWNrZXIuZ2V0U2VydmljZShyZWZlcmVuY2VzW2pdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJaWYgKGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yICE9IG51bGwpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yICE9IHByZXZpb3VzQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IpCi0JCQlyZXR1cm4gcHJldmlvdXNDb25maWd1cmF0b3JNYW5pcHVsYXRvcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXJEYXRhKExhdW5jaGVyRGF0YSB2YWx1ZSkgewotCQlsYXVuY2hlckRhdGEuaW5pdGlhbGl6ZSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbih2YWx1ZS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCkpOwotCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKHZhbHVlLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpLCB2YWx1ZS5pc0NsZWFuKCkpOwotCQlsYXVuY2hlckRhdGEuc2V0SnZtKHZhbHVlLmdldEp2bSgpKTsKLQkJbGF1bmNoZXJEYXRhLnNldEp2bUFyZ3ModmFsdWUuZ2V0SnZtQXJncygpKTsKLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd05hbWUoKS5lcXVhbHModmFsdWUuZ2V0RndOYW1lKCkpKQotCQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd1ZlcnNpb24oKS5lcXVhbHModmFsdWUuZ2V0RndWZXJzaW9uKCkpKSB7Ci0JCQkJLy8gVE9ETyBsYXVuY2hlckRhdGEuZ2V0RndOYW1lKCkvZ2V0RndWZXJzaW9uKCkvCi0JCQkJLy8JZ2V0TGF1bmNoZXJOYW1lKCkvZ2V0TGF1bmNoZXJWZXJzaW9uKCkgbWlnaHQgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uCi0JCQkJLy8gIGZvciBjb3B5aW5nIC4gCi0JCQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKHZhbHVlLmdldEZ3SmFyKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRIb21lKHZhbHVlLmdldEhvbWUoKSk7Ci0JCQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKHZhbHVlLmdldExhdW5jaGVyKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKHZhbHVlLmdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24oKSk7Ci0JCQl9Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYWwgaW1wbGVtZW50YXRpb24uCi0JICogCi0JICogSWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4ga2V5IHNob3VsZCBiZSBlbGltaW5hdGVkCi0JICogIGZyb20gRndEZXBlbmRlbnRQcm9wZXJ0aWVzIGFuZCBGd0luZGVwZW5kZW50UHJvcGVydGllcywKLQkgKiAgcmV0dXJuIHRydWUuIE90aGVyd2lzZSBmYWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiB0cnVlIGlmIGl0IHNob3VsZCBiZSBlbGltaW5ldGVkIGZyb20gRndEZXBlbmRlbnRQcm9wZXJ0aWVzIGFuZCBGd0luZGVwZW5kZW50UHJvcGVydGllcywKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdG9CZUVsaW1pbmF0ZWQoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5LnN0YXJ0c1dpdGgoImphdmEuIikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIgKyAiQ2xhc3M6IiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tIExhdW5jaGVyRGF0YSAtLS0tLS0tLS0tLVxuIik7Ci0JCXNiLmFwcGVuZChsYXVuY2hlckRhdGEudG9TdHJpbmcoKSk7Ci0JCXNiLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSBDb25maWdEYXRhIC0tLS0tLS0tLS0tXG4iKTsKLQkJc2IuYXBwZW5kKGNvbmZpZ0RhdGEudG9TdHJpbmcoKSk7Ci0JCXNiLmFwcGVuZCgiXG4iICsgVXRpbHMudG9TdHJpbmdQcm9wZXJ0aWVzKCJwbGF0Zm9ybVByb3BlcnRpZXMiLCB0aGlzLnBsYXRmb3JtUHJvcGVydGllcykpOwotCQlzYi5hcHBlbmQoIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK1xuIik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBY2NvcmRpbmdUb0V4cGVjdGVkU3RhdGUoQnVuZGxlc1N0YXRlIGJ1bmRsZXNTdGF0ZSkgewotCQkvLwkJRmlsZSBuZXdGd0phciA9IEVxdWlub3hCdW5kbGVzU3RhdGUuZ2V0RndKYXIobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhKTsKLQkJLy8JCWlmIChidW5kbGVzU3RhdGUgaW5zdGFuY2VvZiBFcXVpbm94QnVuZGxlc1N0YXRlKQotCQkvLwkJCSgoRXF1aW5veEJ1bmRsZXNTdGF0ZSkgYnVuZGxlc1N0YXRlKS5zZXRGd0phcihuZXdGd0phcik7Ci0JCS8vCi0JCS8vCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgPT0gbnVsbCAmJiBuZXdGd0phciAhPSBudWxsKQotCQkvLwkJCWxhdW5jaGVyRGF0YS5zZXRGd0phcihuZXdGd0phcik7Ci0JCUJ1bmRsZUluZm9bXSBuZXdCdW5kbGVJbmZvcyA9IGJ1bmRsZXNTdGF0ZS5nZXRFeHBlY3RlZFN0YXRlKCk7Ci0JCWNvbmZpZ0RhdGEuc2V0QnVuZGxlcyhuZXdCdW5kbGVJbmZvcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChvcmlnaW5hbCk7Ci0JCS8vIGVuc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCi0JCS8vUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHJlbGF0aXZpemF0aW9uIGhhcyBiZWVuIGRvbmUKLQkJU3RyaW5nIHJlc3VsdCA9IG1ha2VSZWxhdGl2ZShwYXRoLCBuZXcgUGF0aChyb290UGF0aCkpOwotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCkuZXF1YWxzKHJlc3VsdCkgPyBvcmlnaW5hbCA6IHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGdpdmVuIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCByb290LCBpZiBhcHBsaWNhYmxlLiBJZiBub3QsIHRoZW4KLQkgKiByZXR1cm4gdGhlIHBhdGggYXMtaXMuCi0JICogCi0JICogTWV0aG9kIHNpbWlsYXIgdG8gb25lIGZyb20gU2ltcGxlQ29uZmlndXJhdGlvbk1hbmlwdWxhdG9ySW1wbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKElQYXRoIHRvUmVsLCBJUGF0aCBiYXNlKSB7Ci0JCWludCBpID0gYmFzZS5tYXRjaGluZ0ZpcnN0U2VnbWVudHModG9SZWwpOwotCQlpZiAoaSA9PSAwKSB7Ci0JCQlyZXR1cm4gdG9SZWwudG9PU1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAoYmFzZS5zZWdtZW50Q291bnQoKSAtIGkpOyBqKyspIHsKLQkJCXJlc3VsdCArPSAiLi4iICsgUGF0aC5TRVBBUkFUT1I7Ci0JCX0KLQkJaWYgKGkgPT0gdG9SZWwuc2VnbWVudENvdW50KCkpCi0JCQlyZXR1cm4gIi4iOwotCQlyZXN1bHQgKz0gdG9SZWwuc2V0RGV2aWNlKG51bGwpLnJlbW92ZUZpcnN0U2VnbWVudHMoaSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGUgPSB1cmxTdHJpbmc7Ci0JCXdoaWxlICghZG9uZSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKGZpbGUpOwotCQkJCWZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAodXJsID09IG51bGwgfHwgIW5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0KLQkJU3RyaW5nIHJvb3RTdHJpbmcgPSByb290VVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSArIG1ha2VSZWxhdGl2ZSh1cmxTdHJpbmcuc3Vic3RyaW5nKGluZGV4KSwgcm9vdFN0cmluZy5zdWJzdHJpbmcocm9vdFN0cmluZy5pbmRleE9mKEZJTEVfUFJPVE9DT0wpICsgNSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBcnJheVJlbGF0aXZlKFN0cmluZyBhcnJheSwgVVJMIHJvb3RVUkwpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhcnJheSwgQ09NTUEpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3RyaW5nIGFic29sdXRlID0gbWFrZVJlbGF0aXZlKHRva2VuLCByb290VVJMKTsKLQkJCWJ1ZmZlci5hcHBlbmQoYWJzb2x1dGUpOwotCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlQXJyYXlBYnNvbHV0ZShTdHJpbmcgYXJyYXksIFVSTCByb290VVJMKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXJyYXksIENPTU1BKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCVN0cmluZyBhYnNvbHV0ZSA9IG1ha2VBYnNvbHV0ZSh0b2tlbiwgcm9vdFVSTCk7Ci0JCQlidWZmZXIuYXBwZW5kKGFic29sdXRlKTsKLQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHRoZSBnaXZlbiBwYXRoIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgcm9vdCwgaWYgYXBwbGljYWJsZS4gSWYgbm90LCB0aGVuCi0JICogcmV0dXJuIHRoZSBwYXRoIGFzLWlzLgotCSAqIAotCSAqIE1ldGhvZCBzaW1pbGFyIHRvIG9uZSBmcm9tIFNpbXBsZUNvbmZpZ3VyYXRpb25NYW5pcHVsYXRvckltcGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChvcmlnaW5hbCk7Ci0JCS8vIGVuc3VyZSB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJSVBhdGggcm9vdCA9IG5ldyBQYXRoKHJvb3RQYXRoKTsKLQkJcmV0dXJuIHJvb3QuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQob3JpZ2luYWwucmVwbGFjZSgnOicsICd9JykpLnRvT1NTdHJpbmcoKS5yZXBsYWNlKCd9JywgJzonKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIHVybFN0cmluZywgVVJMIHJvb3RVUkwpIHsKLQkJLy8gd2Ugb25seSB0cmFmZmljIGluIGZpbGU6IFVSTHMKLQkJaW50IGluZGV4ID0gdXJsU3RyaW5nLmluZGV4T2YoRklMRV9QUk9UT0NPTCk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0JCWluZGV4ID0gaW5kZXggKyA1OwotCi0JCS8vIGVuc3VyZSB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGUgPSB1cmxTdHJpbmc7Ci0JCXdoaWxlICghZG9uZSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKGZpbGUpOwotCQkJCWZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAodXJsID09IG51bGwgfHwgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQotCQlyZXR1cm4gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCAtIDUpICsgbWFrZUFic29sdXRlKHVybFN0cmluZy5zdWJzdHJpbmcoaW5kZXgpLCByb290VVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvTG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODNiOTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmxvZy5Mb2dTZXJ2aWNlOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGxvZ2dpbmcgdG8gTG9nU2VydmljZSwgaWYgYXZhaWxhYmxlIAotICovCi1wdWJsaWMgY2xhc3MgTG9nIHsKLQlzdGF0aWMgcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBsb2dUcmFja2VyOwotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gdXNlTG9nID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxvZ1RyYWNrZXIgIT0gbnVsbCkgewotCQkJbG9nVHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JCWxvZ1RyYWNrZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KEJ1bmRsZUNvbnRleHQgYmMpIHsKLQkJbG9nVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihiYywgTG9nU2VydmljZS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQlsb2dUcmFja2VyLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgT2JqZWN0IG9iaiwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKGxldmVsLCBvYmosIG1ldGhvZCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIE9iamVjdCBvYmosIFN0cmluZyBtZXRob2QsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlMb2dTZXJ2aWNlIGxvZ1NlcnZpY2UgPSBudWxsOwotCQlTdHJpbmcgbXNnID0gIiI7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCW1zZyA9ICIoIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArICIpIjsKLQkJfSBlbHNlIGlmIChvYmogPT0gbnVsbCkKLQkJCW1zZyA9ICJbIiArIG1ldGhvZCArICJdIiArIG1lc3NhZ2U7Ci0JCWVsc2UKLQkJCW1zZyA9ICJbIiArIG1ldGhvZCArICJdKCIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKSI7Ci0JCW1zZyArPSBtZXNzYWdlOwotCQlpZiAobG9nVHJhY2tlciAhPSBudWxsKQotCQkJbG9nU2VydmljZSA9IChMb2dTZXJ2aWNlKSBsb2dUcmFja2VyLmdldFNlcnZpY2UoKTsKLQotCQlpZiAobG9nU2VydmljZSAhPSBudWxsKSB7Ci0JCQlsb2dTZXJ2aWNlLmxvZyhsZXZlbCwgbXNnLCBlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsZXZlbFN0ID0gbnVsbDsKLQkJCWlmIChsZXZlbCA9PSBMb2dTZXJ2aWNlLkxPR19ERUJVRykKLQkJCQlsZXZlbFN0ID0gIkRFQlVHIjsKLQkJCWVsc2UgaWYgKGxldmVsID09IExvZ1NlcnZpY2UuTE9HX0lORk8pCi0JCQkJbGV2ZWxTdCA9ICJJTkZPIjsKLQkJCWVsc2UgaWYgKGxldmVsID09IExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcpCi0JCQkJbGV2ZWxTdCA9ICJXQVJOSU5HIjsKLQkJCWVsc2UgaWYgKGxldmVsID09IExvZ1NlcnZpY2UuTE9HX0VSUk9SKSB7Ci0JCQkJbGV2ZWxTdCA9ICJFUlJPUiI7Ci0JCQkJdXNlTG9nID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICh1c2VMb2cpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlsiICsgbGV2ZWxTdCArICJdIiArIG1zZyk7Ci0JCQkJaWYgKGUgIT0gbnVsbCkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgZSkgewotCQlsb2cobGV2ZWwsIG9iaiwgbWV0aG9kLCBudWxsLCBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKGxldmVsLCBudWxsLCBudWxsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCWxvZyhsZXZlbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgZSk7Ci0JfQotCi0JcHJpdmF0ZSBMb2coKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YTgwZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25faW5wdXRGaWxlSXNEaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Z3Q29uZmlnTG9jYXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9mYWlsZWRUb0NyZWF0ZURpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZmFpbGVkVG9SZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2dfY29uZmlnRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2dfY29uZmlnUHJvcHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX3JlbmFtZVN1Y2Nlc3NmdWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX2Z3Q29uZmlnU2F2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1zZ19Db25maWdGaWxlSGVhZGVyOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI3OGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWV4Y2VwdGlvbl9pbnB1dEZpbGVJc0RpcmVjdG9yeT0gSWxsZWdhbCBBcmd1bWVudDogaW5wdXRGaWxlIHswfSBtdXN0IG5vdCBiZSBhIGRpcmVjdG9yeS4KLWV4Y2VwdGlvbl9md0NvbmZpZ0xvY2F0aW9uTmFtZSA9IElsbGVnYWwgU3RhdGU6IEZyYW1ld29yayBDb25maWd1cmF0aW9uIGxvY2F0aW9uICJ7MH0iIGRvZXMgbm90IG1hdGNoIHsxfS4KLWV4Y2VwdGlvbl9mYWlsZWRUb0NyZWF0ZURpciA9IEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLWV4Y2VwdGlvbl9mYWlsZWRUb1JlbmFtZT1GYWlsZWQgdG8gcmVuYW1lIHswfSB0byB7MX0uCi0KLWxvZ19jb25maWdGaWxlPSBDb25maWd1cmF0aW9uIGZpbGUgKHswfSkgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkuCi1sb2dfY29uZmlnUHJvcHM9IENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBpcyBlbXB0eS4KLWxvZ19yZW5hbWVTdWNjZXNzZnVsPSBTdWNjZXNzZnVsbHkgcmVuYW1lZCB7MH0gdG8gezF9LgotbG9nX2Z3Q29uZmlnU2F2ZT0gRnJhbWV3b3JrIENvbmZpZ3VyYXRpb24gd2FzIHNhdmVkIHN1Y2Nlc3NmdWxseSBpbiB7MH0uCi0KLW1zZ19Db25maWdGaWxlSGVhZGVyPSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgd3JpdHRlbiBieSB7MH0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9FY2xpcHNlVmVyc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9FY2xpcHNlVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU0YjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvdXRpbHMvRWNsaXBzZVZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVZlcnNpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlpbnQgbWFqb3IgPSAwOwotCWludCBtaW5vciA9IDA7Ci0JaW50IHNlcnZpY2UgPSAwOwotCVN0cmluZyBxdWFsaWZpZXIgPSBudWxsOwotCi0JcHVibGljIEVjbGlwc2VWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcnNpb24sICIuIik7Ci0JCWlmICghdG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCXJldHVybjsKLQkJdGhpcy5tYWpvciA9IEludGVnZXIucGFyc2VJbnQodG9rLm5leHRUb2tlbigpKTsKLQkJaWYgKCF0b2suaGFzTW9yZVRva2VucygpKQotCQkJcmV0dXJuOwotCQl0aGlzLm1pbm9yID0gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkpOwotCQlpZiAoIXRvay5oYXNNb3JlVG9rZW5zKCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuc2VydmljZSA9IEludGVnZXIucGFyc2VJbnQodG9rLm5leHRUb2tlbigpKTsKLQkJaWYgKCF0b2suaGFzTW9yZVRva2VucygpKQotCQkJcmV0dXJuOwotCQl0aGlzLnF1YWxpZmllciA9IHRvay5uZXh0VG9rZW4oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKSB7Ci0JCUVjbGlwc2VWZXJzaW9uIHRhcmdldCA9IChFY2xpcHNlVmVyc2lvbikgb2JqOwotCQlpZiAodGFyZ2V0Lm1ham9yID4gdGhpcy5tYWpvcikKLQkJCXJldHVybiAtMTsKLQkJaWYgKHRhcmdldC5tYWpvciA8IHRoaXMubWFqb3IpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKHRhcmdldC5taW5vciA+IHRoaXMubWlub3IpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh0YXJnZXQubWlub3IgPCB0aGlzLm1pbm9yKQotCQkJcmV0dXJuIDE7Ci0JCWlmICh0YXJnZXQuc2VydmljZSA+IHRoaXMuc2VydmljZSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHRhcmdldC5zZXJ2aWNlIDwgdGhpcy5zZXJ2aWNlKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvdXRpbHMvRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDEwMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LkVxdWlub3hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLQotcHVibGljIGNsYXNzIEZpbGVVdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFY2xpcHNlUmVhbExvY2F0aW9uKGZpbmFsIE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJdHJ5IHsKLQkJCW5ldyBVUkwobG9jYXRpb24pOwotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBpZ25vcmUuCi0JCX0KLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoIjoiKSA+PSAwKQotCQkJcmV0dXJuIGxvY2F0aW9uOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJRmlsZSBob21lID0gbGF1bmNoZXJEYXRhLmdldEhvbWUoKTsKLQkJRmlsZSBwbHVnaW5zRGlyID0gbnVsbDsKLQkJaWYgKGhvbWUgIT0gbnVsbCkKLQkJCXBsdWdpbnNEaXIgPSBuZXcgRmlsZShob21lLCBFcXVpbm94Q29uc3RhbnRzLlBMVUdJTlNfRElSKTsKLQkJZWxzZSBpZiAobGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkgIT0gbnVsbCkKLQkJCXBsdWdpbnNEaXIgPSBuZXcgRmlsZShsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCksIEVxdWlub3hDb25zdGFudHMuUExVR0lOU19ESVIpOwotCQllbHNlIGlmIChsYXVuY2hlckRhdGEuZ2V0RndKYXIoKSAhPSBudWxsKQotCQkJcGx1Z2luc0RpciA9IGxhdW5jaGVyRGF0YS5nZXRGd0phcigpLmdldFBhcmVudEZpbGUoKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBnZXRQbHVnaW5OYW1lKGxvY2F0aW9uKTsKLQkJU3RyaW5nIHJldCA9IGdldEVjbGlwc2VQbHVnaW5GdWxsTG9jYXRpb24ocGx1Z2luTmFtZSwgcGx1Z2luc0Rpcik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbk5hbWUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWludCBwb3NpdGlvbiA9IGxvY2F0aW9uLmluZGV4T2YoIl8iKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBsb2NhdGlvbjsKLQkJaWYgKHBvc2l0aW9uID49IDApCi0JCQlwbHVnaW5OYW1lID0gbG9jYXRpb24uc3Vic3RyaW5nKDAsIHBvc2l0aW9uKTsKLQkJcmV0dXJuIHBsdWdpbk5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVhbExvY2F0aW9uKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBmaW5hbCBTdHJpbmcgbG9jYXRpb24sIGJvb2xlYW4gdXNlRWNsaXBzZSkgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmV0ID0gbG9jYXRpb247Ci0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJyZWZlcmVuY2U6IikpIHsKLQkJCXJldCA9IGxvY2F0aW9uLnN1YnN0cmluZygicmVmZXJlbmNlOiIubGVuZ3RoKCkpOwotCQkJaWYgKHJldC5lbmRzV2l0aCgiLmphci8iKSkgewotCQkJCXJldCA9IHJldC5zdWJzdHJpbmcoMCwgcmV0Lmxlbmd0aCgpIC0gIi8iLmxlbmd0aCgpKTsKLQkJCQlpZiAocmV0LnN0YXJ0c1dpdGgoImZpbGU6IikpCi0JCQkJCXJldCA9IHJldC5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoImluaXRpYWxAIikpCi0JCQlyZXQgPSBsb2NhdGlvbi5zdWJzdHJpbmcoImluaXRpYWxAIi5sZW5ndGgoKSk7Ci0KLQkJaWYgKHJldCA9PSBsb2NhdGlvbikKLQkJCXJldHVybiB1c2VFY2xpcHNlID8gRmlsZVV0aWxzLmdldEVjbGlwc2VSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGxvY2F0aW9uKSA6IGxvY2F0aW9uOwotCQlyZXR1cm4gZ2V0UmVhbExvY2F0aW9uKG1hbmlwdWxhdG9yLCByZXQsIHVzZUVjbGlwc2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyBzdCwgU3RyaW5nIG9sZFN0LCBTdHJpbmcgbmV3U3QpIHsKLQkJaWYgKG9sZFN0LmVxdWFscyhuZXdTdCkpCi0JCQlyZXR1cm4gc3Q7Ci0JCWludCBpbmRleCA9IC0xOwotCQl3aGlsZSAoKGluZGV4ID0gc3QuaW5kZXhPZihvbGRTdCkpICE9IC0xKSB7Ci0JCQlzdCA9IHN0LnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdTdCArIHN0LnN1YnN0cmluZyhpbmRleCArIG9sZFN0Lmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gc3Q7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBidW5kbGUgb2YgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpcyBpbiB0aGUgRWNsaXBzZSBwbHVnaW4gZm9ybWF0IChlaXRoZXIgcGx1Z2luLW5hbWVfdmVyc2lvbi5qYXIgCi0JICogb3IgYXMgYSBmb2xkZXIgbmFtZWQgcGx1Z2luLW5hbWVfdmVyc2lvbiApLCByZXR1cm4gdmVyc2lvbiBzdHJpbmcuT3RoZXJ3aXNlLCByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIHBsdWdpbk5hbWUKLQkgKiBAcmV0dXJuIHZlcnNpb24gc3RyaW5nLiBJZiBpbnZhbGlkIGZvcm1hdCwgcmV0dXJuIG51bGwuIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFY2xpcHNlTmFtaW5nVmVyc2lvbihVUkwgdXJsLCBmaW5hbCBTdHJpbmcgcGx1Z2luTmFtZSwgYm9vbGVhbiBpc0ZpbGUpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gdXJsLmdldEZpbGUoKTsKLQkJbG9jYXRpb24gPSByZXBsYWNlQWxsKGxvY2F0aW9uLCBGaWxlLnNlcGFyYXRvciwgIi8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoIjoiKSA9PSAtMSkKLQkJCWZpbGVuYW1lID0gbG9jYXRpb247Ci0JCWVsc2UKLQkJCWZpbGVuYW1lID0gbG9jYXRpb24uc3Vic3RyaW5nKGxvY2F0aW9uLmxhc3RJbmRleE9mKCI6IikgKyAxKTsKLQotCQkvLyBmaWxlbmFtZSBtdXN0IGJlICJqYXJOYW1lIl8idmVyc2lvbiIuamFyCi0JCWlmIChpc0ZpbGUpIHsKLQkJCWlmICghZmlsZW5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuamFyIikpOwotCQl9IGVsc2UgewotCQkJLy8gZGlyZWN0b3J5IC0gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoCi0JCQlmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDEpOwotCQl9Ci0KLQkJaWYgKGZpbGVuYW1lLmluZGV4T2YoIi8iKSAhPSAtMSkKLQkJCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKLQotCQlpZiAoIWZpbGVuYW1lLnN0YXJ0c1dpdGgocGx1Z2luTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgcGx1Z2lubmFtZUxlbmd0aCA9IHBsdWdpbk5hbWUubGVuZ3RoKCk7Ci0JCWlmIChmaWxlbmFtZS5sZW5ndGgoKSA8PSBwbHVnaW5uYW1lTGVuZ3RoIHx8IGZpbGVuYW1lLmNoYXJBdChwbHVnaW5OYW1lLmxlbmd0aCgpKSAhPSAnXycpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gZmlsZW5hbWUuc3Vic3RyaW5nKHBsdWdpbm5hbWVMZW5ndGggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFY2xpcHNlUGx1Z2luRnVsbExvY2F0aW9uKFN0cmluZyBwbHVnaW5OYW1lLCBGaWxlIGJ1bmRsZXNEaXIpIHsKLQkJRmlsZVtdIGxpc3RzID0gYnVuZGxlc0Rpci5saXN0RmlsZXMoKTsKLQkJVVJMIHJldCA9IG51bGw7Ci0JCUVjbGlwc2VWZXJzaW9uIG1heFZlcnNpb24gPSBudWxsOwotCQlpZiAobGlzdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybCA9IGxpc3RzW2ldLnRvVVJMKCk7Ci0JCQkJU3RyaW5nIHZlcnNpb24gPSBnZXRFY2xpcHNlTmFtaW5nVmVyc2lvbih1cmwsIHBsdWdpbk5hbWUsIGxpc3RzW2ldLmlzRmlsZSgpKTsKLQkJCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJCUVjbGlwc2VWZXJzaW9uIGVjbGlwc2VWZXJzaW9uID0gbmV3IEVjbGlwc2VWZXJzaW9uKHZlcnNpb24pOwotCQkJCQlpZiAobWF4VmVyc2lvbiA9PSBudWxsIHx8IGVjbGlwc2VWZXJzaW9uLmNvbXBhcmVUbyhtYXhWZXJzaW9uKSA+IDApIHsKLQkJCQkJCXJldCA9IHVybDsKLQkJCQkJCW1heFZlcnNpb24gPSBlY2xpcHNlVmVyc2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChyZXQgPT0gbnVsbCA/IG51bGwgOiByZXQudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2I0ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODg2NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q5MGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0jRnJpIEZlYiAyMiAxMTowODowNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBmZDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNXZWQgT2N0IDI0IDEwOjE0OjAyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMWY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgT2N0IDI0IDEwOjExOjE5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L0ZyYW1ld29yayBBZG1pbiBUZXN0LmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L0ZyYW1ld29yayBBZG1pbiBUZXN0LmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyZWViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9GcmFtZXdvcmsgQWRtaW4gVGVzdC5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3Nsb2ciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvcGRlLWp1bml0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImRlc2VsZWN0ZWRfd29ya3NwYWNlX3BsdWdpbnMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIuYXBwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLG9yZy5lY2xpcHNlLmVjZixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeW9wdGltaXplcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLGllLndvbWJhdC5qYmRpZmYsaWUud29tYmF0LmpiZGlmZi50ZXN0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGFyZ2V0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIudGVzdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IudGVzdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMsb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSx6elRlc3Qsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scyxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Asb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly4uL2p1bml0LXdvcmtzcGFjZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ii8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjQiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iPW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5wcm9kdWN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRfdGFyZ2V0X3BsdWdpbnMiIHZhbHVlPSJjb20uaWJtLmljdSxqYXZheC5zZXJ2bGV0LG9yZy5lY2xpcHNlLmFudC5jb3JlLG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSxvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMsb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS53aW4zMi54ODYsb3JnLmVjbGlwc2UuY29yZS5qb2JzLG9yZy5lY2xpcHNlLmNvcmUubmV0LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHksb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnksb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LG9yZy5lY2xpcHNlLmhlbHAsb3JnLmVjbGlwc2UuamZhY2Usb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcsb3JnLmVjbGlwc2UuamZhY2UudGV4dCxvcmcuZWNsaXBzZS5vc2dpLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMsb3JnLmVjbGlwc2Uuc3d0LG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYsb3JnLmVjbGlwc2UudGV4dCxvcmcuZWNsaXBzZS51aSxvcmcuZWNsaXBzZS51aS5mb3JtcyxvcmcuZWNsaXBzZS51aS5pZGUsb3JnLmVjbGlwc2UudWkudmlld3Msb3JnLmVjbGlwc2UudWkud2luMzIsb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLG9yZy5lY2xpcHNlLnVwZGF0ZS51aSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRlbXBsYXRlQ29uZmlnIiB2YWx1ZT0iJHt0YXJnZXRfaG9tZX1cY29uZmlndXJhdGlvblxjb25maWcuaW5pIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjcxNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBUZXN0IFBsdWctaW4gZm9yIEZyYW1ld29yayBBZG1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0cy5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS40LjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkODY5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGRhdGFGaWxlLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvZGF0YUZpbGUvYnVuZGxlXzEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9idW5kbGVfMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MzViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9idW5kbGVfMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQnVuZGxlIDEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1bmRsZV8xCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MzFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNhMjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaV8zLjQuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzYWQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Fic3RyYWN0RndrQWRtaW5UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9BYnN0cmFjdEZ3a0FkbWluVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmI3ODM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Fic3RyYWN0RndrQWRtaW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkZyYW1ld29ya0FkbWluOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RndrQWRtaW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgZndBZG1pblRyYWNrZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3RGd2tBZG1pblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbiBpbnB1dCBzdHJlYW0gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiBPcHRpb25hbGx5IGNsb3NlIHRoZSBzdHJlYW1zIHdoZW4gZG9uZS4KLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvcHlTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gY2xvc2VJbiwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBjbG9zZU91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWludCB3cml0dGVuID0gMDsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxNiAqIDEwMjRdOwotCQkJaW50IGxlbjsKLQkJCXdoaWxlICgobGVuID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0JCQkJd3JpdHRlbiArPSBsZW47Ci0JCQl9Ci0JCQlyZXR1cm4gd3JpdHRlbjsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNsb3NlSW4pIHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbG9zZU91dCkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRnJhbWV3b3JrQWRtaW4gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBGSUxURVJfT0JKRUNUQ0xBU1MgPSAiKCIgKyBDb25zdGFudHMuT0JKRUNUQ0xBU1MgKyAiPSIgKyBGcmFtZXdvcmtBZG1pbi5jbGFzcy5nZXROYW1lKCkgKyAiKSI7Ci0JCWZpbmFsIFN0cmluZyBmaWx0ZXJGd05hbWUgPSAiKCIgKyBGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0ZXX05BTUUgKyAiPUVxdWlub3gpIjsKLQkJZmluYWwgU3RyaW5nIGZpbHRlckxhdW5jaGVyTmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfTkFNRSArICI9RWNsaXBzZS5leGUpIjsKLQkJZmluYWwgU3RyaW5nIGZpbHRlckZ3QWRtaW4gPSAiKCYiICsgRklMVEVSX09CSkVDVENMQVNTICsgZmlsdGVyRndOYW1lICsgZmlsdGVyTGF1bmNoZXJOYW1lICsgIikiOwotCi0JCVN0cmluZyBGV0tfQURNSU5fRVEgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IjsKLQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoRldLX0FETUlOX0VRKTsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJ1bmRsZTogIiArIEZXS19BRE1JTl9FUSArICIgaXMgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCIpOwotCQliLnN0YXJ0KCk7Ci0KLQkJaWYgKGZ3QWRtaW5UcmFja2VyID09IG51bGwpIHsKLQkJCUZpbHRlciBmaWx0ZXI7Ci0JCQl0cnkgewotCQkJCWZpbHRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuY3JlYXRlRmlsdGVyKGZpbHRlckZ3QWRtaW4pOwotCQkJCWZ3QWRtaW5UcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIGZpbHRlciwgbnVsbCk7Ci0JCQkJZndBZG1pblRyYWNrZXIub3BlbigpOwotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbmV2ZXIgaGFwcGVucwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChGcmFtZXdvcmtBZG1pbikgZndBZG1pblRyYWNrZXIuZ2V0U2VydmljZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWlmIChmd0FkbWluVHJhY2tlciAhPSBudWxsKSB7Ci0JCQlmd0FkbWluVHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0SXNGaWxlKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlmYWlsKCJGaWxlOiAiICsgZmlsZS50b1N0cmluZygpICsgIiBjYW4ndCBiZSBmb3VuZC4iKTsKLQkJaWYgKCFmaWxlLmlzRmlsZSgpKQotCQkJZmFpbCgiRmlsZTogIiArIGZpbGUudG9TdHJpbmcoKSArICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlLiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2VydElzRGlyZWN0b3J5KEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlmYWlsKCJEaXJlY3Rvcnk6ICIgKyBmaWxlLnRvU3RyaW5nKCkgKyAiIGNhbid0IGJlIGZvdW5kLiIpOwotCQlpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCWZhaWwoIkRpcmVjdG9yeTogIiArIGZpbGUudG9TdHJpbmcoKSArICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnkuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0Tm90aGluZyhGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQlmYWlsKCJObyBmaWxlIG9yIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlcmU6ICIgKyBmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnROb3RDb250ZW50KEZpbGUgZmlsZSwgU3RyaW5nIHNlYXJjaCkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlmYWlsKCJGaWxlOiAiICsgZmlsZS50b1N0cmluZygpICsgIiBjYW4ndCBiZSBmb3VuZC4iKTsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0JCQkJd2hpbGUgKHJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCWlmIChsaW5lLmluZGV4T2Yoc2VhcmNoKSA+PSAwKQotCQkJCQkJZmFpbCgiVGhlIHN0cmluZzogIiArIHNlYXJjaCArICIgd2FzIG5vdCBleHBlY3RlZCBpbiB0aGlzIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZSwgY2F1Z2h0IGJlZm9yZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJTdHJpbmc6ICIgKyBzZWFyY2ggKyAiIG5vdCBmb3VuZCBpbiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRDb250ZW50KEZpbGUgZmlsZSwgU3RyaW5nIHNlYXJjaCkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlmYWlsKCJGaWxlOiAiICsgZmlsZS50b1N0cmluZygpICsgIiBjYW4ndCBiZSBmb3VuZC4iKTsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0JCQkJd2hpbGUgKHJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCWlmIChsaW5lLmluZGV4T2Yoc2VhcmNoKSA+PSAwKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKQotCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlLCBjYXVnaHQgYmVmb3JlCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlN0cmluZzogIiArIHNlYXJjaCArICIgbm90IGZvdW5kIGluICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlmYWlsKCJTdHJpbmc6IiArIHNlYXJjaCArICIgbm90IGZvdW5kIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKSB7Ci0JCWZpbmFsIFN0cmluZyBTSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiOwotCQlCdW5kbGUgbWFuaXB1bGF0b3JCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SKTsKLQkJaWYgKG1hbmlwdWxhdG9yQnVuZGxlID09IG51bGwpCi0JCQlmYWlsKCJCdW5kbGU6ICIgKyBTSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IgKyAiIGlzIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QiKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yQnVuZGxlLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gd2hpbGUgc3RhcnRpbmcgdXAgIiArIFNJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiArICcgJyArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKSB7Ci0JCWZpbmFsIFN0cmluZyBTSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiOwotCQlCdW5kbGUgbWFuaXB1bGF0b3JCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SKTsKLQkJaWYgKG1hbmlwdWxhdG9yQnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvckJ1bmRsZS5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gd2hpbGUgc3RhcnRpbmcgdXAgIiArIFNJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiArICcgJyArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjQ0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY3R4OwotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3R4ID0gY29udGV4dDsgCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWN0eCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjdHg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQnVnMTk2NTI1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9CdWcxOTY1MjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZjUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9CdWcxOTY1MjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQnVnMTk2NTI1IGV4dGVuZHMgQWJzdHJhY3RGd2tBZG1pblRlc3QgewotCXByaXZhdGUgRmlsZSBpbnN0YWxsRm9sZGVyID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lID0gImVjbGlwc2UiOwotCXByaXZhdGUgRmlsZSBidW5kbGVUWFQ7Ci0JcHJpdmF0ZSBGaWxlIGNvbmZpZ0lOSTsKLQotCXB1YmxpYyBCdWcxOTY1MjUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3RhcnRTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKTsKLQkJLy9jcmVhdGUgYSBjb25maWd1cmF0aW9uIHdpdGggb3NnaSBhbmQgc2ltcGxlY29uZmlndXJhdG9yIGluIGl0Ci0KLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCWluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKEJ1ZzE5NjUyNS5jbGFzcy5nZXROYW1lKCkpOwotCQljb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQotCQlidW5kbGVUWFQgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVuZGxlcy5pbmZvIik7Ci0JCWNvbmZpZ0lOSSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJjb25maWcuaW5pIik7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mbyBvc2dpQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjMuMSIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaS5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSk7Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG9zZ2lCaSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoY29uZmlndXJhdG9yQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdDb250ZW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUZpbGUgaW5zdGFsbEZvbGRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoQnVnMTk2NTI1LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWd1cmF0aW9uIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZWNsaXBzZSI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mbyBidW5kbGUxQmkgPSBuZXcgQnVuZGxlSW5mbygiYnVuZGxlXzEiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL2J1bmRsZV8xIikpLnRvRXh0ZXJuYWxGb3JtKCksIDIsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoYnVuZGxlMUJpKTsKLQotCQltYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQotCQlhc3NlcnRDb250ZW50KGJ1bmRsZVRYVCwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Q29udGVudChjb25maWdJTkksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JCWFzc2VydENvbnRlbnQoYnVuZGxlVFhULCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKTsKLQkJYXNzZXJ0Q29udGVudChjb25maWdJTkksICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpOwotCQlhc3NlcnRDb250ZW50KGJ1bmRsZVRYVCwgImJ1bmRsZV8xIik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0NsZWFudXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9DbGVhbnVwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFjNjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0NsZWFudXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwVGVzdCBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0KLQlwdWJsaWMgQ2xlYW51cFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JTWFuaXB1bGF0b3IgbSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQltID0gY3JlYXRlTWluaW1hbENvbmZpZ3VyYXRpb24oQ2xlYW51cFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ29uZmlndXJhdG9yUmVtb3ZhbCgpIHsKLQkJQnVuZGxlSW5mb1tdIGJpcyA9IG0uZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChiaXNbaV0uZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKQotCQkJCW0uZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShiaXNbaV0pOwotCQl9Ci0JCXRyeSB7Ci0JCQltLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBzYXZpbmciKTsKLQkJfQotCQlhc3NlcnROb3RoaW5nKG5ldyBGaWxlKGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIikpOwotCQlhc3NlcnRJc0RpcmVjdG9yeShnZXRDb25maWd1cmF0aW9uRm9sZGVyKCkpOwotCi0JCS8vTm93IHJlbW92ZSBvc2dpCi0JCWJpcyA9IG0uZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChiaXNbaV0uZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5vc2dpIikpCi0JCQkJbS5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJpc1tpXSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW0uc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkVycm9yIHdoaWxlIHNhdmluZyIpOwotCQl9Ci0JCWFzc2VydE5vdGhpbmcoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpKTsKLQkJYXNzZXJ0Tm90aGluZyhuZXcgRmlsZShnZXRJbnN0YWxsRm9sZGVyKCksIGdldExhdW5jaGVyTmFtZSgpICsgIi5pbmkiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9TR2lSZW1vdmFsKCkgewotCQlCdW5kbGVJbmZvW10gYmlzID0gbS5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJpc1tpXS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLm9zZ2kiKSkKLQkJCQltLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYmlzW2ldKTsKLQkJfQotCQl0cnkgewotCQkJbS5zYXZlKGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXJyb3Igd2hpbGUgc2F2aW5nIik7Ci0JCX0KLQkJYXNzZXJ0SXNEaXJlY3RvcnkobmV3IEZpbGUoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKSk7Ci0JCWFzc2VydElzRGlyZWN0b3J5KGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSk7Ci0JCWFzc2VydE5vdENvbnRlbnQobmV3IEZpbGUoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVuZGxlcy5pbmZvIiksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0KLQkJYmlzID0gbS5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJpc1tpXS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIikpCi0JCQkJbS5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJpc1tpXSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW0uc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkVycm9yIHdoaWxlIHNhdmluZyIpOwotCQl9Ci0JCWFzc2VydE5vdGhpbmcoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpKTsKLQkJYXNzZXJ0Tm90aGluZyhuZXcgRmlsZShnZXRJbnN0YWxsRm9sZGVyKCksIGdldExhdW5jaGVyTmFtZSgpICsgIi5pbmkiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdpdGhNdXRpcGxlQnVuZGxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZUluZm8gYmkgPSBuZXcgQnVuZGxlSW5mbyhGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL2J1bmRsZV8xIikpLnRvRXh0ZXJuYWxGb3JtKCksIDIpOwotCQltLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoYmkpOwotCQltLnNhdmUoZmFsc2UpOwotCi0JCUJ1bmRsZUluZm9bXSBiaXMgPSBtLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKSkKLQkJCQltLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYmlzW2ldKTsKLQkJfQotCQltLnNhdmUoZmFsc2UpOwotCi0JCWFzc2VydE5vdGhpbmcoZ2V0QnVuZGxlVHh0KCkpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiYnVuZGxlXzEiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9Gd2tBZG1pbkFuZFNpbXBsZUNvbmZpZ3VyYXRvclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Z3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNlNGM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Z3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RGd2tBZG1pblRlc3QgewotCXByaXZhdGUgRmlsZSBpbnN0YWxsRm9sZGVyOwotCXByaXZhdGUgRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyOwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyTmFtZTsKLQotCXB1YmxpYyBGd2tBZG1pbkFuZFNpbXBsZUNvbmZpZ3VyYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJc3RhcnRTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFuaXB1bGF0b3IgZ2V0TmV3TWFuaXB1bGF0b3IoU3RyaW5nIHdvcmtBcmVhKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCWluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKHdvcmtBcmVhKTsKLQkJY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWd1cmF0aW9uIik7Ci0JCWxhdW5jaGVyTmFtZSA9ICJlY2xpcHNlIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJcmV0dXJuIG1hbmlwdWxhdG9yOwotCX0KLQotCXByb3RlY3RlZCBNYW5pcHVsYXRvciBjcmVhdGVNaW5pbWFsQ29uZmlndXJhdGlvbihTdHJpbmcgd29ya0FyZWEpIHRocm93cyBFeGNlcHRpb24gewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGdldE5ld01hbmlwdWxhdG9yKHdvcmtBcmVhKTsKLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlKTsKLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUob3NnaUJpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShjb25maWd1cmF0b3JCaSk7Ci0KLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0KLQkJcmV0dXJuIG1hbmlwdWxhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWlmIChpbnN0YWxsRm9sZGVyICE9IG51bGwpCi0JCQlkZWxldGUoaW5zdGFsbEZvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZShGaWxlIHRvRGVsZXRlKSB7Ci0JCWlmICh0b0RlbGV0ZS5pc0ZpbGUoKSkgewotCQkJdG9EZWxldGUuZGVsZXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRvRGVsZXRlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IHRvRGVsZXRlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWRlbGV0ZShjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCQl0b0RlbGV0ZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWxlIGdldEluc3RhbGxGb2xkZXIoKSB7Ci0JCXJldHVybiBpbnN0YWxsRm9sZGVyOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uRm9sZGVyOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEJ1bmRsZVR4dCgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idW5kbGVzLmluZm8iKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRDb25maWdJbmkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAiY29uZmlnLmluaSIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZXJOYW1lKCkgewotCQlyZXR1cm4gbGF1bmNoZXJOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9Ob0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGY1M2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE5vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pIGV4dGVuZHMgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IHsKLQotCXB1YmxpYyBOb0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzZW5jZU9mQ29uZmlndXJhdGlvbkluRWNsaXBzZUlOSSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVNaW5pbWFsQ29uZmlndXJhdGlvbihOb0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaS5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGxhdW5jaGVySW5pID0gbmV3IEZpbGUoZ2V0SW5zdGFsbEZvbGRlcigpLCBnZXRMYXVuY2hlck5hbWUoKSArICIuaW5pIik7Ci0JCWFzc2VydE5vdENvbnRlbnQobGF1bmNoZXJJbmksICItY29uZmlndXJhdGlvbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVzZW5jZU9mQ29uZmlndXJhdGlvbkluRWNsaXBzZUlOSSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgiYmlzIiArIE5vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWcyIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZWNsaXBzZSI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCi0JCUJ1bmRsZUluZm8gb3NnaUJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLm9zZ2kiLCAiMy4zLjEiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQotCQl0cnkgewotCQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJRmlsZSBsYXVuY2hlckluaSA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSArICIuaW5pIik7Ci0JCWFzc2VydENvbnRlbnQobGF1bmNoZXJJbmksICItY29uZmlndXJhdGlvbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTm9SZW5hbWluZ0xhdW5jaGVySW5pLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDAyNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTm9SZW5hbWluZ0xhdW5jaGVySW5pLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE5vUmVuYW1pbmdMYXVuY2hlckluaSBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBOb1JlbmFtaW5nTGF1bmNoZXJJbmkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ0ZpbGVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJc3RhcnRTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKTsKLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUZpbGUgaW5zdGFsbEZvbGRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoTm9SZW5hbWluZ0xhdW5jaGVySW5pLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWd1cmF0aW9uIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZm9vIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlKTsKLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUob3NnaUJpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShjb25maWd1cmF0b3JCaSk7Ci0KLQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJRmlsZSBmb29JTkkgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiZm9vLmluaSIpOwotCQlhc3NlcnRFcXVhbHMoZm9vSU5JLmV4aXN0cygpLCB0cnVlKTsKLQotCQlNYW5pcHVsYXRvciBtMiA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YTIgPSBtMi5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhMi5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEyLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCi0JCXRyeSB7Ci0JCQltMi5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJbGF1bmNoZXJEYXRhMi5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiYmFyIikpOwotCQltMi5zYXZlKGZhbHNlKTsKLQotCQlhc3NlcnRFcXVhbHMoZm9vSU5JLmV4aXN0cygpLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiYmFyLmluaSIpLmV4aXN0cygpLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9PU0dpVmVyc2lvbkNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvT1NHaVZlcnNpb25DaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZjhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9PU0dpVmVyc2lvbkNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBPU0dpVmVyc2lvbkNoYW5nZSBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JcHJpdmF0ZSBNYW5pcHVsYXRvciBkZWZhdWx0TWFuaXB1bGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHdvcmtBcmVhID0gT1NHaVZlcnNpb25DaGFuZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIE9TR2lWZXJzaW9uQ2hhbmdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWRlZmF1bHRNYW5pcHVsYXRvciA9IGNyZWF0ZU1pbmltYWxDb25maWd1cmF0aW9uKHdvcmtBcmVhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZhbFVzaW5nU2FtZU1hbmlwdWxhdG9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gZGVmYXVsdE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShvc2dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnROb3RDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnROb3RDb250ZW50KGdldENvbmZpZ0luaSgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmFsVXNpbmdPdGhlck1hbmlwdWxhdG9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJTWFuaXB1bGF0b3IgbmV3TWFuaXB1bGF0b3IgPSBnZXROZXdNYW5pcHVsYXRvcih3b3JrQXJlYSk7Ci0JCUJ1bmRsZUluZm9bXSBpbmZvcyA9IG5ld01hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluZXdNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQluZXdNYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Tm90Q29udGVudChnZXRCdW5kbGVUeHQoKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Tm90Q29udGVudChnZXRDb25maWdJbmkoKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkaXRpb25Vc2luZ090aGVyTWFuaXB1bGF0b3IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlSW5mbyBvc2dpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2dpIi5lcXVhbHMoaW5mb3NbaV0uZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJb3NnaSA9IGluZm9zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWRlZmF1bHRNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJTWFuaXB1bGF0b3IgbmV3TWFuaXB1bGF0b3IgPSBnZXROZXdNYW5pcHVsYXRvcih3b3JrQXJlYSk7Ci0KLQkJbmV3TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpKTsKLQkJbmV3TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0QnVuZGxlVHh0KCksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVZlcnNpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlSW5mbyBvc2dpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2dpIi5lcXVhbHMoaW5mb3NbaV0uZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJb3NnaSA9IGluZm9zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWRlZmF1bHRNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJLy9UaGVzZSB0d28gY29uc3RhbnRzIGRlc2NyaWJlIHRoZSBkYXRhIGZpbGUgdXNlZCBpbiB0aGUgdGVzdAotCQlmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAib3JnLmVjbGlwc2Uub3NnaV8zLjQuMC5qYXIiOwotCQlmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIzLjQuMC52MjAwNzExMDUiOwotCQlCdW5kbGVJbmZvIG5ld09TR2kgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjQuMC52MjAwNzExMDUiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlLyIgKyBGSUxFTkFNRSkpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShuZXdPU0dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldEJ1bmRsZVR4dCgpLCBWRVJTSU9OKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgRklMRU5BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlnV2l0aG91dE9TR2koKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQkvL0ZpcnN0IENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluIE9TR2kKLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gZGVmYXVsdE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShvc2dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnROb3RDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnROb3RDb250ZW50KGdldENvbmZpZ0luaSgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCi0JCU1hbmlwdWxhdG9yIG5ld01hbmlwdWxhdG9yID0gZ2V0TmV3TWFuaXB1bGF0b3Iod29ya0FyZWEpOwotCQlhc3NlcnRFcXVhbHMobmV3TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKS5sZW5ndGgsIDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbGF0aXZlUGF0aFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbGF0aXZlUGF0aFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MmI2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9SZWxhdGl2ZVBhdGhUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVQYXRoVGVzdCBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JcHVibGljIFJlbGF0aXZlUGF0aFRlc3QoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVQYXRocygpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbGF0aXZlUGF0aFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQkvL0ZpcnN0IHdlIGNvcHkgc29tZSBqYXJzIGludG8gYSB3ZWxsCi0JCUZpbGUgb3NnaUphciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJwbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kuamFyIik7Ci0JCW9zZ2lKYXIuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQlGaWxlIHNjSmFyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgInBsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIik7Ci0KLQkJY29weVN0cmVhbShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3NnaUphciksIHRydWUpOwotCQljb3B5U3RyZWFtKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oc2NKYXIpLCB0cnVlKTsKLQotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJlY2xpcHNlIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgb3NnaUphci50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgc2NKYXIudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0KLQotCQkvLyI6cGF0aC5qYXIiIGlzIGEgIHBvb3IgbWFuIGFwcHJvYWNoIHRvIHRlc3QgcmVsYXRpdmUgcGF0aHMgCi0JCWFzc2VydE5vdENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKSwgaW5zdGFsbEZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydE5vdENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpLCBpbnN0YWxsRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYXNzZXJ0Q29udGVudChuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAiY29uZmlnLmluaSIpLCAiOm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpOwotCQlhc3NlcnRDb250ZW50KG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idW5kbGVzLmluZm8iKSwgIjpwbHVnaW5zXFxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKTsKLQkJYXNzZXJ0Q29udGVudChuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVuZGxlcy5pbmZvIiksICI6cGx1Z2luc1xcb3JnLmVjbGlwc2Uub3NnaS5qYXIiKTsKLQotCQlCdW5kbGVJbmZvIGJpID0gbmV3IEJ1bmRsZUluZm8oRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9idW5kbGVfMSIpKS50b0V4dGVybmFsRm9ybSgpLCAyKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShiaSk7Ci0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotLy8JCWFzc2VydENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL2J1bmRsZV8xIikpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCi0JCU1hbmlwdWxhdG9yIG5ld01hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJTGF1bmNoZXJEYXRhIG5ld0xhdW5jaGVyRGF0YSA9IG5ld01hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQluZXdMYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbmV3TGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9SZW1vdmluZ0FsbEJ1bmRsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbW92aW5nQWxsQnVuZGxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE3NTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbW92aW5nQWxsQnVuZGxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmluZ0FsbEJ1bmRsZXMgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0KLQlwdWJsaWMgUmVtb3ZpbmdBbGxCdW5kbGVzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdGaWxlcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbW92aW5nQWxsQnVuZGxlcy5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gImZvbyI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mbyBvc2dpQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjMuMSIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaS5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSk7Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG9zZ2lCaSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoY29uZmlndXJhdG9yQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCi0JCUZpbGUgZm9vSU5JID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImZvby5pbmkiKTsKLQkJYXNzZXJ0RXF1YWxzKGZvb0lOSS5leGlzdHMoKSwgdHJ1ZSk7Ci0KLQkJTWFuaXB1bGF0b3IgbTIgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEyID0gbTIuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YTIuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhMi5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQotCQl0cnkgewotCQkJbTIubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gbTIuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJbTIuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShpbmZvc1tpXSk7Ci0JCX0KLQkJbTIuc2F2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIgKyAiL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgImJ1bmRsZXMuaW5mbyIpLmV4aXN0cygpLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDJmMjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbmFtaW5nTGF1bmNoZXJJbmkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1pbmdMYXVuY2hlckluaSBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBSZW5hbWluZ0xhdW5jaGVySW5pKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdGaWxlcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbmFtaW5nTGF1bmNoZXJJbmkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJmb28iOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oY29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCi0JCUJ1bmRsZUluZm8gb3NnaUJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLm9zZ2kiLCAiMy4zLjEiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQotCQltYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQotCQlGaWxlIGZvb0lOSSA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJmb28uaW5pIik7Ci0JCWFzc2VydEVxdWFscyhmb29JTkkuZXhpc3RzKCksIHRydWUpOwotCi0JCU1hbmlwdWxhdG9yIG0yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhMiA9IG0yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEyLnNldEZ3Q29uZmlnTG9jYXRpb24oY29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YTIuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0KLQkJdHJ5IHsKLQkJCW0yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCQlsYXVuY2hlckRhdGEyLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJmb28iKSk7Ci0JCW0yLnNhdmUoZmFsc2UpOwotCi0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiZm9vLmluaSIpLmV4aXN0cygpLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaW1wbGVDb25maWd1cmF0b3JDb21pbmdBbmRHb2luZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvU2ltcGxlQ29uZmlndXJhdG9yQ29taW5nQW5kR29pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MzFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaW1wbGVDb25maWd1cmF0b3JDb21pbmdBbmRHb2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb25maWd1cmF0b3JDb21pbmdBbmRHb2luZyBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JTWFuaXB1bGF0b3IgbSA9IG51bGw7Ci0KLQlwdWJsaWMgU2ltcGxlQ29uZmlndXJhdG9yQ29taW5nQW5kR29pbmcoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJbSA9IGNyZWF0ZU1pbmltYWxDb25maWd1cmF0aW9uKFNpbXBsZUNvbmZpZ3VyYXRvckNvbWluZ0FuZEdvaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdpdGhNdXRpcGxlQnVuZGxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlSW5mbyBiaSA9IG5ldyBCdW5kbGVJbmZvKEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvYnVuZGxlXzEiKSkudG9FeHRlcm5hbEZvcm0oKSwgMik7Ci0JCW0uZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShiaSk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJpcyA9IG0uZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChiaXNbaV0uZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKQotCQkJCW0uZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShiaXNbaV0pOwotCQl9Ci0JCW0uc2F2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0Tm90aGluZyhnZXRCdW5kbGVUeHQoKSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJidW5kbGVfMSIpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCi0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG5ld01hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbmV3TWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShnZXRJbnN0YWxsRm9sZGVyKCksIGdldExhdW5jaGVyTmFtZSgpKSk7Ci0JCXRyeSB7Ci0JCQluZXdNYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQluZXdNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG5ldyBCdW5kbGVJbmZvKEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpKTsKLQkJbmV3TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0Q29udGVudChnZXRCdW5kbGVUeHQoKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Q29udGVudChnZXRCdW5kbGVUeHQoKSwgImJ1bmRsZV8xIik7Ci0JCWFzc2VydENvbnRlbnQoZ2V0QnVuZGxlVHh0KCksICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1NpbXBsZUNvbmZpZ3VyYXRvclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1NpbXBsZUNvbmZpZ3VyYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzZDA1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaW1wbGVDb25maWd1cmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0KLQlwdWJsaWMgU2ltcGxlQ29uZmlndXJhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnRmlsZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpOwotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShTaW1wbGVDb25maWd1cmF0b3JUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWd1cmF0aW9uIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZWNsaXBzZSI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mbyBvc2dpQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjMuMSIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaS5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSk7Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG9zZ2lCaSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoY29uZmlndXJhdG9yQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCi0JCUZpbGUgYnVuZGxlVFhUID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpOwotCQlGaWxlIGNvbmZpZ0lOSSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJjb25maWcuaW5pIik7Ci0JCWFzc2VydENvbnRlbnQoYnVuZGxlVFhULCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnRDb250ZW50KGNvbmZpZ0lOSSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Q29udGVudChidW5kbGVUWFQsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpOwotCQlhc3NlcnRDb250ZW50KGNvbmZpZ0lOSSwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvVGVzdEVjbGlwc2VEYXRhQXJlYS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvVGVzdEVjbGlwc2VEYXRhQXJlYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I3NzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1Rlc3RFY2xpcHNlRGF0YUFyZWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEVjbGlwc2VEYXRhQXJlYSBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JTWFuaXB1bGF0b3IgbSA9IG51bGw7Ci0KLQlwdWJsaWMgVGVzdEVjbGlwc2VEYXRhQXJlYShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQltID0gY3JlYXRlTWluaW1hbENvbmZpZ3VyYXRpb24oVGVzdEVjbGlwc2VEYXRhQXJlYS5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RwMkRhdGFBcmVhKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQltLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AoImVjbGlwc2UucDIuZGF0YS5hcmVhIiwgIkBjb25maWcuZGlyLy4uL3AyIik7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJAY29uZmlnLmRpci8uLi9wMiIpOwotCQltLmxvYWQoKTsKLQkJbS5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgIkBjb25maWcuZGlyLy4uL3AyIik7Ci0KLQkJbS5nZXRDb25maWdEYXRhKCkuc2V0RndEZXBlbmRlbnRQcm9wKCJlY2xpcHNlLnAyLmRhdGEuYXJlYSIsIG5ldyBGaWxlKGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSwgInAyIikuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJbS5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgIkBjb25maWcuZGlyL3AyIik7Ci0JCW0ubG9hZCgpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiQGNvbmZpZy5kaXIvcDIiKTsKLQotCQltLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AoImVjbGlwc2UucDIuZGF0YS5hcmVhIiwgbmV3IEZpbGUoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpLCAiLi4vcDIiKS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiQGNvbmZpZy5kaXIvLi4vcDIiKTsKLQkJbS5sb2FkKCk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJAY29uZmlnLmRpci8uLi9wMiIpOwotCi0JCW0uZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiLCAiZmlsZTpkOi90bXAvZm9vL2Jhci9wMiIpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiL3RtcC9mb28vYmFyL3AyIik7Ci0JCW0ubG9hZCgpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiL3RtcC9mb28vYmFyL3AyIik7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9UZXN0UnVubmluZ0luc3RhbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9UZXN0UnVubmluZ0luc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDc2MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvVGVzdFJ1bm5pbmdJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJ1bm5pbmdJbnN0YW5jZSBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBUZXN0UnVubmluZ0luc3RhbmNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW5uaW5nSW5zdGFuY2UoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbSA9IGZ3a0FkbWluLmdldFJ1bm5pbmdNYW5pcHVsYXRvcigpOwotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBtLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmZvc1tpXSk7Ci0JCX0KLQkJCi0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhidW5kbGVzLmxlbmd0aCwgaW5mb3MubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGluZm9zLmxlbmd0aCAmJiBmb3VuZCA9PSBmYWxzZTsgaisrKSB7Ci0JCQkJZm91bmQgPSBzYW1lKGluZm9zW2pdLCBidW5kbGVzW2ldKTsKLQkJCX0KLQkJCWlmIChmb3VuZCA9PSBmYWxzZSkgewotCQkJCWZhaWwoIkNhbid0IGZpbmQ6ICIgKyBidW5kbGVzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2FtZShCdW5kbGVJbmZvIGluZm8sIEJ1bmRsZSBidW5kbGUpIHsKLQkJaWYgKGluZm8uZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKLQkJCWlmIChuZXcgVmVyc2lvbigoU3RyaW5nKSBidW5kbGUuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKS5lcXVhbHMobmV3IFZlcnNpb24oaW5mby5nZXRWZXJzaW9uKCkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvVXRpbHNUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9VdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMDJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9VdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vLyoqCi0vLyAqIAotLy8gKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS5pbmN1YmF0b3IuY29uZmlndXJhdG9yLnV0aWw7Ci0vLwotLy9pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotLy9pbXBvcnQgamF2YS5uZXQuVVJMOwotLy8KLS8vaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMuKjsKLS8vCi0vLy8qKgotLy8gKiBAYXV0aG9yIGl5YW1hc2FrCi0vLyAqCi0vLyAqLwotLy9wdWJsaWMgY2xhc3MgVXRpbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotLy8KLS8vCS8qKgotLy8JICogQHBhcmFtIG5hbWUKLS8vCSAqLwotLy8JcHVibGljIFV0aWxzVGVzdChTdHJpbmcgbmFtZSkgewotLy8JCXN1cGVyKG5hbWUpOwotLy8JfQotLy8KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlzdXBlci5zZXRVcCgpOwotLy8JfQotLy8KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlzdXBlci50ZWFyRG93bigpOwotLy8JfQotLy8KLS8vCS8vCS8qKgotLy8JLy8JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5jb25maWdNYW4uaW50ZXJuYWwudXRpbC5VdGlscyNnZXRVcmwoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyl9LgotLy8JLy8JICovCi0vLwkvLwlwdWJsaWMgdm9pZCB0ZXN0R2V0VXJsKCkgewotLy8JLy8JCWZhaWwoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLS8vCS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgVXRpbHMjZ2V0UmVsYXRpdmVQYXRoKGphdmEubmV0LlVSTCwgamF2YS5uZXQuVVJMKX0uCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWxhdGl2ZVBhdGgoKSB7Ci0vLwkJLy9VUkwgdGFyZ2V0OwotLy8JCS8vVVJMIGZyb207Ci0vLwkJdHJ5IHsKLS8vCQkJVVJMIHRhcmdldCA9IG5ldyBVUkwoImh0dHAiLCAid3d3Lm50dC5jby5qcCIsICJkaXIxL2RpcjIvdGFyZ2V0Lmh0bWwiKTsKLS8vCQkJVVJMIGZyb20gPSBuZXcgVVJMKCJodHRwIiwgInd3dy5udHQuY28uanAiLCAiZGlyMS9kaXIzL2RpcjQvZnJvbS5odG1sIik7Ci0vLwkJCVN0cmluZyBleHBlY3RlZCA9ICIuLi8uLi8uLi9kaXIyL3RhcmdldC5odG1sIjsKLS8vCQkJU3RyaW5nIHJldCA9IFV0aWxzLmdldFJlbGF0aXZlUGF0aCh0YXJnZXQsIGZyb20pOwotLy8JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJldCk7Ci0vLwotLy8JCQlleHBlY3RlZCA9ICIuLi8uLi9kaXIzL2RpcjQvZnJvbS5odG1sIjsKLS8vCQkJcmV0ID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKGZyb20sIHRhcmdldCk7Ci0vLwkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmV0KTsKLS8vCi0vLwkJCXRyeSB7Ci0vLwkJCQl0YXJnZXQgPSBuZXcgVVJMKCJodHRwIiwgInd3dy5udHQuY28uanAiLCAiZGlyMS9kaXIyL3RhcmdldC5odG1sIik7Ci0vLwkJCQlmcm9tID0gbmV3IFVSTCgiaHR0cCIsICJ3d3cuaWJtLmNvbSIsICJkaXIxL2RpcjMvZGlyNC9mcm9tLmh0bWwiKTsKLS8vCQkJCXJldCA9IFV0aWxzLmdldFJlbGF0aXZlUGF0aCh0YXJnZXQsIGZyb20pOwotLy8JCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7Ci0vLwkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0vLwotLy8JCQl9Ci0vLwkJCXRyeSB7Ci0vLwkJCQl0YXJnZXQgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgImRpcjIvdGFyZ2V0Lmh0bWwiKTsKLS8vCQkJCWZyb20gPSBuZXcgVVJMKCJodHRwIiwgInd3dy5udHQuY28uanAiLCAiZGlyMS9kaXIzL2RpcjQvZnJvbS5odG1sIik7Ci0vLwkJCQlyZXQgPSBVdGlscy5nZXRSZWxhdGl2ZVBhdGgodGFyZ2V0LCBmcm9tKTsKLS8vCQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biIpOwotLy8JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8KLS8vCQkJfQotLy8JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwotLy8JCX0KLS8vCi0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIFV0aWxzI3JlcGxhY2VBbGwoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyl9LgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbCgpIHsKLS8vCQlTdHJpbmcgc3QgPSAidGVyZS9lZXJlcmUvL3R5L2QiOwotLy8JCVN0cmluZyBleHBlY3RlZCA9ICJ0ZXJlXFxlZXJlcmVcXFxcdHlcXGQiOwotLy8JCVN0cmluZyBvbGRTdCA9ICIvIjsKLS8vCQlTdHJpbmcgbmV3U3QgPSAiXFwiOwotLy8JCVN0cmluZyByZXQgPSBVdGlscy5yZXBsYWNlQWxsKHN0LCBvbGRTdCwgbmV3U3QpOwotLy8JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmV0KTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgVXRpbHMjZ2V0VG9rZW5zKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpfS4KLS8vCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldFRva2VucygpIHsKLS8vCQlTdHJpbmcgc3QgPSAiL0FBQUEvQkIvL0NDL0QvIjsKLS8vCQlTdHJpbmdbXSBleHBlY3RlZCA9IHsiQUFBQSIsICJCQiIsICJDQyIsICJEIn07Ci0vLwkJU3RyaW5nIGRlbGltID0gIi8iOwotLy8JCVN0cmluZ1tdIHJldCA9IFV0aWxzLmdldFRva2VucyhzdCwgZGVsaW0pOwotLy8JCWFzc2VydEVxdWFscygibGVuZ3RocyBtdXN0IGVxdWFsLiIsIHJldC5sZW5ndGgsIGV4cGVjdGVkLmxlbmd0aCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspCi0vLwkJCWFzc2VydEVxdWFscygiZWFjaCBlbGVtZW50cyBtdXN0IGVxdWFsLiIsIGV4cGVjdGVkW2ldLCByZXRbaV0pOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBVdGlscyNyZW1vdmVMYXN0Q2goU3RyaW5nIHRhcmdldCwgY2hhciBjaCl9LgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoKCkgewotLy8JCVN0cmluZyB0YXJnZXQgPSAiZGRkZGFhYWFhYWFhIjsKLS8vCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZGRkZCI7Ci0vLwkJY2hhciBjaCA9ICdhJzsKLS8vCQlTdHJpbmcgcmV0ID0gVXRpbHMucmVtb3ZlTGFzdENoKHRhcmdldCwgY2gpOwotLy8JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmV0KTsKLS8vCX0KLS8vfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4NzIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczNTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotI01vbiBPY3QgMjIgMTM6MTc6MjggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2I5NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1NzoyNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkYjBmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBGcmFtZXdvcmtBZG1pbiBTZXJ2aWNlIElGCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWw7dmVyc2lvbj0iMS4wLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlsczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExZGE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vdXRpbHMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vdXRpbHMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2JkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5wbHVnaW5jb252ZXJzaW9uLlBsdWdpbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlidW5kbGVDb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEFjcXVpcmUgdGhlIHBsdWctaW4gY29udmVyc2lvbiBzZXJ2aWNlIG9yIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGx1Z2luQ29udmVydGVyIGFjcXVpcmVQbHVnaW5Db252ZXJ0ZXIoKSB7Ci0JCWlmIChidW5kbGVDb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBidW5kbGVDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGx1Z2luQ29udmVydGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlQbHVnaW5Db252ZXJ0ZXIgcmVzdWx0ID0gKFBsdWdpbkNvbnZlcnRlcikgYnVuZGxlQ29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWJ1bmRsZUNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vdXRpbHMvU2ltcGxlQnVuZGxlc1N0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vdXRpbHMvU2ltcGxlQnVuZGxlc1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjRmNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL1NpbXBsZUJ1bmRsZXNTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIEJ1bmRsZXNTdGF0ZSBkb2Vzbid0IHN1cHBvcnQgYW55IG9mCi0gKiAtIHJlc29sdmluZyBidW5kbGVzLAotICogLSByZXRyaWV2aW5nIGZ3IHBlcnNpc3RlbnQgZGF0YS4gCi0gKiAKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgZm9yIHRob3NlIGNhc2VzLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQnVuZGxlc1N0YXRlIGltcGxlbWVudHMgQnVuZGxlc1N0YXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJ1bmRsZUluZm9bXSBOVUxMX0JVTkRMRUlORk9TID0gbmV3IEJ1bmRsZUluZm9bMF07Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIEZyYW1ld29ya0FkbWluIGlzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZndBZG1pbgotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQXZhaWxhYmlsaXR5KEZyYW1ld29ya0FkbWluIGZ3QWRtaW4pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlpZiAoIWZ3QWRtaW4uaXNBY3RpdmUoKSkKLQkJCXRocm93IG5ldyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24oIkZyYW1ld29ya0FkbWluIGNyZWF0ZXMgdGhpcyBvYmplY3QgaXMgbm8gbW9yZSBhdmFpbGFibGUuIiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLkZSQU1FV09SS0FETUlOX1VOQVZBSUxBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICogQHBhcmFtIGxhdW5jaGVyRGF0YQotCSAqIEByZXR1cm4gRmlsZSBvZiBmd0phciB0byBiZSB1c2VkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICovCi0Jc3RhdGljIEZpbGUgZ2V0RndKYXIoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgewotCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgIT0gbnVsbCkKLQkJCXJldHVybiBsYXVuY2hlckRhdGEuZ2V0RndKYXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3lzdGVtQnVuZGxlU3ltYm9saWNOYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3lzdGVtQnVuZGxlTmFtZTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN5c3RlbUJ1bmRsZVZlbmRvcjsKLQlMaXN0IGJ1bmRsZUluZm9zTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlGcmFtZXdvcmtBZG1pbiBmd0FkbWluID0gbnVsbDsKLQotCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIElmIHRoZSBtYW5pZmVzdCBvZiB0aGUgdGFyZ2V0IGZ3IGltcGxlbWVudGF0aW9uIGhhcyBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSBoZWFkZXIsCi0JICogdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZC4gCi0JICogCi0JICogQHBhcmFtIE1hbmlwdWxhdG9yQWRtaW4KLQkgKiBAcGFyYW0gTWFuaXB1bGF0b3IKLQkgKiBAcGFyYW0gc3lzdGVtQnVuZGxlU3ltYm9saWNOYW1lCi0JICovCi0JcHVibGljIFNpbXBsZUJ1bmRsZXNTdGF0ZShGcmFtZXdvcmtBZG1pbiBNYW5pcHVsYXRvckFkbWluLCBNYW5pcHVsYXRvciBNYW5pcHVsYXRvciwgU3RyaW5nIHN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZ3QWRtaW4gPSBNYW5pcHVsYXRvckFkbWluOwotCQkvLwkJIGNvcHkgTWFuaXB1bGF0b3Igb2JqZWN0IGZvciBhdm9pZGluZyBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIE1hbmlwdWxhdG9yLgotCQl0aGlzLm1hbmlwdWxhdG9yID0gTWFuaXB1bGF0b3JBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQl0aGlzLm1hbmlwdWxhdG9yLnNldENvbmZpZ0RhdGEoTWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRMYXVuY2hlckRhdGEoTWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpOwotCQl0aGlzLnN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZSA9IHN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZTsKLQkJdGhpcy5zeXN0ZW1CdW5kbGVOYW1lID0gbnVsbDsKLQkJdGhpcy5zeXN0ZW1CdW5kbGVWZW5kb3IgPSBudWxsOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIG1hbmlmZXN0IG9mIHRoZSB0YXJnZXQgZncgaW1wbGVtZW50YXRpb24gaGFzIG5vdCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSBoZWFkZXIKLQkgKiBidXQgLCBDb25zdGFudHMuQlVORExFX05BTUUgYW5kIEJVTkRMRV9WRVJTSU9OLCAKLQkgKiB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkLiAKLQkgKiAKLQkgKiBAcGFyYW0gTWFuaXB1bGF0b3JBZG1pbgotCSAqIEBwYXJhbSBNYW5pcHVsYXRvcgotCSAqIEBwYXJhbSBzeXN0ZW1CdW5kbGVOYW1lCi0JICogQHBhcmFtIHN5c3RlbUJ1bmRsZVZlbmRlcgotCSAqLwotCXB1YmxpYyBTaW1wbGVCdW5kbGVzU3RhdGUoRnJhbWV3b3JrQWRtaW4gTWFuaXB1bGF0b3JBZG1pbiwgTWFuaXB1bGF0b3IgTWFuaXB1bGF0b3IsIFN0cmluZyBzeXN0ZW1CdW5kbGVOYW1lLCBTdHJpbmcgc3lzdGVtQnVuZGxlVmVuZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZndBZG1pbiA9IE1hbmlwdWxhdG9yQWRtaW47Ci0JCS8vCQkgY29weSBNYW5pcHVsYXRvciBvYmplY3QgZm9yIGF2b2lkaW5nIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgTWFuaXB1bGF0b3IuCi0JCXRoaXMubWFuaXB1bGF0b3IgPSBNYW5pcHVsYXRvckFkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0JCXRoaXMubWFuaXB1bGF0b3Iuc2V0Q29uZmlnRGF0YShNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkpOwotCQl0aGlzLm1hbmlwdWxhdG9yLnNldExhdW5jaGVyRGF0YShNYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKSk7Ci0JCXRoaXMuc3lzdGVtQnVuZGxlU3ltYm9saWNOYW1lID0gbnVsbDsKLQkJdGhpcy5zeXN0ZW1CdW5kbGVOYW1lID0gc3lzdGVtQnVuZGxlTmFtZTsKLQkJdGhpcy5zeXN0ZW1CdW5kbGVWZW5kb3IgPSBzeXN0ZW1CdW5kbGVWZW5kZXI7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEV4cGVjdGVkU3RhdGUoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJaWYgKCFmd0FkbWluLmlzQWN0aXZlKCkpCi0JCQl0aHJvdyBuZXcgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKCJGcmFtZXdvcmtBZG1pbiBjcmVhdGVzIHRoaXMgb2JqZWN0IGlzIG5vIG1vcmUgYXZhaWxhYmxlLiIsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5GUkFNRVdPUktBRE1JTl9VTkFWQUlMQUJMRSk7Ci0JCXJldHVybiBVdGlscy5nZXRCdW5kbGVJbmZvc0Zyb21MaXN0KHRoaXMuYnVuZGxlSW5mb3NMaXN0KTsKLQl9Ci0KLQkvKiAKLQkgKiBKdXN0IHJldHVybiByZXF1aXJlZCBidW5kbGVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVzU3RhdGUjZ2V0UHJlcmVxdWlzdGVCdW5kbGVzKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbykKLQkgKi8KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldFByZXJlcXVpc3RlQnVuZGxlcyhCdW5kbGVJbmZvIGJJbmZvKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCWZpbmFsIFN0cmluZyByZXF1aXJlZEJ1bmRsZXMgPSBVdGlscy5nZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUpOwotCQlpZiAocmVxdWlyZWRCdW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZUluZm9bXSB7dGhpcy5nZXRTeXN0ZW1CdW5kbGUoKX07Ci0KLQkJU3RyaW5nW10gY2xhdXNlcyA9IFV0aWxzLmdldENsYXVzZXMocmVxdWlyZWRCdW5kbGVzKTsKLQkJTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGF1c2VzLmxlbmd0aDsgaSsrKQotCQkJbGlzdC5hZGQoVXRpbHMuZ2V0UGF0aEZyb21DbGF1c2UoY2xhdXNlc1tpXSkpOwotCi0JCUxpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0LmFkZCh0aGlzLmdldFN5c3RlbUJ1bmRsZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGUgPSB0aGlzLmJ1bmRsZUluZm9zTGlzdC5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCQkJQnVuZGxlSW5mbyBjdXJyZW50QkluZm8gPSAoQnVuZGxlSW5mbykgaXRlLm5leHQoKTsKLQkJCVN0cmluZyBjdXJyZW50TG9jYXRpb24gPSBjdXJyZW50QkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJCVN0cmluZyBjdXJyZW50U3ltYm9saWNOYW1lID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhjdXJyZW50TG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWlmIChjdXJyZW50U3ltYm9saWNOYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQljdXJyZW50U3ltYm9saWNOYW1lID0gVXRpbHMuZ2V0UGF0aEZyb21DbGF1c2UoY3VycmVudFN5bWJvbGljTmFtZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZTIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZTIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSAoU3RyaW5nKSBpdGUyLm5leHQoKTsKLQkJCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscyhjdXJyZW50U3ltYm9saWNOYW1lKSkgewotCQkJCQlyZXQuYWRkKGN1cnJlbnRCSW5mbyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdChyZXQpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvIGdldFN5c3RlbUJ1bmRsZSgpIHsKLQkJaWYgKHRoaXMuc3lzdGVtQnVuZGxlU3ltYm9saWNOYW1lID09IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQkJLy8JCQlpZiAoYkluZm8uZ2V0U3RhcnRMZXZlbCgpICE9IDEpCi0JCQkJLy8JCQkJcmV0dXJuIG51bGw7OwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSBVdGlscy5nZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX05BTUUpOwotCQkJCWlmIChzeXN0ZW1CdW5kbGVOYW1lLmVxdWFscyhidW5kbGVOYW1lKSkgewotCQkJCQlTdHJpbmcgYnVuZGxlVmVuZG9yID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9WRU5ET1IpOwotCQkJCQlpZiAoc3lzdGVtQnVuZGxlVmVuZG9yLmVxdWFscyhidW5kbGVWZW5kb3IpKQotCQkJCQkJcmV0dXJuIGJJbmZvOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlLm5leHQoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJc3ltYm9saWNOYW1lID0gVXRpbHMuZ2V0UGF0aEZyb21DbGF1c2Uoc3ltYm9saWNOYW1lKTsKLQkJCWlmICh0aGlzLnN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSkKLQkJCQlyZXR1cm4gYkluZm87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRTeXN0ZW1GcmFnbWVudGVkQnVuZGxlcygpIHsKLQkJQnVuZGxlSW5mbyBzeXN0ZW1CSW5mbyA9IHRoaXMuZ2V0U3lzdGVtQnVuZGxlKCk7Ci0JCWlmIChzeXN0ZW1CSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIE5VTExfQlVORExFSU5GT1M7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGUgPSB0aGlzLmJ1bmRsZUluZm9zTGlzdC5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJCVN0cmluZyBtYW5pZmVzdFZlcnNpb24gPSBVdGlscy5nZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTik7Ci0JCQlpZiAobWFuaWZlc3RWZXJzaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobWFuaWZlc3RWZXJzaW9uLmVxdWFscygiMSIpIHx8IG1hbmlmZXN0VmVyc2lvbi5lcXVhbHMoIjEuMCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgZnJhZ21lbnRIb3N0ID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QpOwotCQkJaWYgKGZyYWdtZW50SG9zdCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaW50IGluZGV4ID0gZnJhZ21lbnRIb3N0LmluZGV4T2YoIjsiKTsKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBmcmFnbWVudEhvc3Quc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7Ci0JCQlTdHJpbmcgcGFyYW1ldGVyID0gZnJhZ21lbnRIb3N0LnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKTsKLQkJCS8vIFRPRE8gV2hhdCB0byBkbyAsaW4gY2FzZSBvZiBhbGlhcyBuYW1lIG9mIHN5c3RlbSBidW5kbGUgaXMgbm90IHVzZWQgPwotCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoQ29uc3RhbnRzLlNZU1RFTV9CVU5ETEVfU1lNQk9MSUNOQU1FKSkKLQkJCQlpZiAocGFyYW1ldGVyLmVxdWFscyhDb25zdGFudHMuRVhURU5TSU9OX0RJUkVDVElWRSArICI6PSIgKyBDb25zdGFudHMuRVhURU5TSU9OX0ZSQU1FV09SSykpIHsKLQkJCQkJbGlzdC5hZGQobG9jYXRpb24pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIFV0aWxzLmdldEJ1bmRsZUluZm9zRnJvbUxpc3QobGlzdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoQnVuZGxlSW5mbyBiSW5mbykgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24oImdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoQnVuZGxlSW5mbyBiSW5mbykgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLlVOU1VQUE9SVEVEX09QRVJBVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYnVuZGxlSW5mb3NMaXN0LmNsZWFyKCk7Ci0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJQ29uZmlnRGF0YSBjb25maWdEYXRhID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpOwotCQlGaWxlIGZ3SmFyID0gZ2V0RndKYXIobGF1bmNoZXJEYXRhKTs7Ci0KLQkJaWYgKGZ3SmFyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXJDb25maWdGaWxlKCkgPT0gbnVsbCAmJiBmd0phciBpcyBub3Qgc2V0LiIpOwotCQkvLyBObyBmdyBwZXJzaXN0ZW50IGRhdGEgbG9jYXRpb24gaXMgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLgotCi0JCUJ1bmRsZUluZm9bXSBiSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBiSW5mb3MubGVuZ3RoOyBqKyspCi0JCQl0aGlzLmluc3RhbGxCdW5kbGUoYkluZm9zW2pdKTsKLQotCQlpZiAoZ2V0U3lzdGVtQnVuZGxlKCkgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlCdW5kbGVJbmZvIHN5c0JJbmZvID0gbmV3IEJ1bmRsZUluZm8obGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlLCAwKTsKLQkJCQl0aGlzLmluc3RhbGxCdW5kbGUoc3lzQkluZm8pOwotCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIE5vdGhpZ24gdG8gZG8gYmVjYXVzZSBuZXZlciBoYXBwZW5zLgotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCi0JCVN0cmluZyBuZXdMb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCURpY3Rpb25hcnkgbmV3TWFuaWZlc3QgPSBVdGlscy5nZXRPU0dpTWFuaWZlc3QobmV3TG9jYXRpb24pOwotCQlpZiAobmV3TWFuaWZlc3QgPT0gbnVsbCkgewotCQkJLy8gVE9ETyBsb2cgc29tZXRoaW5nIGhlcmUKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbmV3U3ltYm9saWNOYW1lID0gKFN0cmluZykgbmV3TWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSAoU3RyaW5nKSBuZXdNYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIj4gY3VycmVudEluc3RhbGxlZEJ1bmRsZXMubGVuZ3RoPSIgKyBjdXJyZW50SW5zdGFsbGVkQnVuZGxlcy5sZW5ndGgpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gY3VycmVudEJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjdXJyZW50QkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChuZXdMb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IFV0aWxzLmdldE9TR2lNYW5pZmVzdChsb2NhdGlvbik7Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQlpZiAobmV3U3ltYm9saWNOYW1lICE9IG51bGwgJiYgbmV3VmVyc2lvbiAhPSBudWxsKQotCQkJCWlmIChuZXdTeW1ib2xpY05hbWUuZXF1YWxzKHN5bWJvbGljTmFtZSkgJiYgbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgewotCQkJdGhpcy5idW5kbGVJbmZvc0xpc3QuYWRkKGJJbmZvKTsKLQkJfQotCX0KLQotCS8vCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JLy8JCWlmIChzdGF0ZSA9PSBudWxsKQotCS8vCQkJcmV0dXJuIG51bGw7Ci0JLy8JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLwkJQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVEZXNjcmlwdGlvbnMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlRGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQlzYi5hcHBlbmQoYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldEJ1bmRsZUlkKCkgKyAiOiIpOwotCS8vCQkJc2IuYXBwZW5kKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS50b1N0cmluZygpICsgIigiKTsKLQkvLwkJCXNiLmFwcGVuZChidW5kbGVEZXNjcmlwdGlvbnNbaV0uaXNSZXNvbHZlZCgpICsgIikiKTsKLQkvLwkJCVN0cmluZ1tdIGVlcyA9IGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkvLwkJCWZvciAoaW50IGogPSAwOyBqIDwgZWVzLmxlbmd0aDsgaisrKQotCS8vCQkJCXNiLmFwcGVuZChlZXNbal0gKyAiICIpOwotCS8vCQkJc2IuYXBwZW5kKCJcbiIpOwotCS8vCQl9Ci0JLy8JCXNiLmFwcGVuZCgiUGxhdGZvcm1Qcm9wZXJ0aWVzOlxuIik7Ci0JLy8JCURpY3Rpb25hcnlbXSBkaWNzID0gc3RhdGUuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZGljcy5sZW5ndGg7IGkrKykgewotCS8vCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gZGljc1tpXS5rZXlzKCk7IGVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JLy8JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLQkvLwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBkaWNzW2ldLmdldChrZXkpOwotCS8vCQkJCXNiLmFwcGVuZCgiICgiICsga2V5ICsgIiwiICsgdmFsdWUgKyAiKVxuIik7Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwkJc2IuYXBwZW5kKCJcbiIpOwotCS8vCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkvLwl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5U3VwcG9ydGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKCJpc1Jlc29sdmVkKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLlVOU1VQUE9SVEVEX09QRVJBVElPTik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZChCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbigiaXNSZXNvbHZlZChCdW5kbGVJbmZvIGJJbmZvKSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24iLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24uVU5TVVBQT1JURURfT1BFUkFUSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKGJvb2xlYW4gaW5jcmVtZW50KSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbigicmVzb2x2ZShib29sZWFuIGluY3JlbWVudCkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLlVOU1VQUE9SVEVEX09QRVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlTdHJpbmcgdGFyZ2V0TG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChJdGVyYXRvciBpdGUgPSB0aGlzLmJ1bmRsZUluZm9zTGlzdC5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCQkJaW5kZXgrKzsKLQkJCUJ1bmRsZUluZm8gY3VycmVudEJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjdXJyZW50QkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJCWlmICh0YXJnZXRMb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJdGhpcy5idW5kbGVJbmZvc0xpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi91dGlscy9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTgzNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb24uUGx1Z2luQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbi5QbHVnaW5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFV0aWxzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVAgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nW10ge307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfTUFOSUZFU1QgPSAiZmVhdHVyZS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX01BTklGRVNUID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX01BTklGRVNUID0gInBsdWdpbi54bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPdmVyd3JpdGUgYWxsIHByb3BlcnRpZXMgb2YgZnJvbSB0byB0aGUgcHJvcGVydGllcyBvZiB0by4gUmV0dXJuIHRoZSByZXN1bHQgb2YgdG8uCi0JICogCi0JICogQHBhcmFtIHRvIFByb3BlcnRpZXMgd2hvc2Uga2V5cyBhbmQgdmFsdWVzIG9mIG90aGVyIFByb3BlcnRpZXMgd2lsbCBiZSBhcHBlbmRlZCB0by4KLQkgKiBAcGFyYW0gZnJvbSBQcm9wZXJ0aWVzIHdob3NlIGtleXMgYW5kIHZhbHVlcyB3aWxsIGJlIHNldCB0byB0aGUgb3RoZXIgcHJvcGVydGllcy4KLQkgKiBAcmV0dXJuIFByb3BlcnRpZXMgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBhcHBlbmRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgdG8sIFByb3BlcnRpZXMgZnJvbSkgewotCQlpZiAoZnJvbSAhPSBudWxsKSB7Ci0JCQlpZiAodG8gPT0gbnVsbCkKLQkJCQl0byA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkvLwkJCXByaW50b3V0UHJvcGVydGllcyhTeXN0ZW0ub3V0LCAidG8iLCB0byk7Ci0JCQkvLwkJCXByaW50b3V0UHJvcGVydGllcyhTeXN0ZW0ub3V0LCAiZnJvbSIsIGZyb20pOwotCi0JCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZnJvbS5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJCXRvLnNldFByb3BlcnR5KGtleSwgZnJvbS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCX0KLQkJfQotCQkvLwkJcHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJ0byIsIHRvKTsKLQkJcmV0dXJuIHRvOwotCX0KLQotCS8vUmV0dXJuIGEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgYSBtYW5pZmVzdC4gVGhlIGRhdGEgbWF5IHJlc3VsdCBmcm9tIHBsdWdpbi54bWwgY29udmVyc2lvbiAgCi0JcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeSBiYXNpY0xvYWRNYW5pZmVzdChGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCUlucHV0U3RyZWFtIG1hbmlmZXN0U3RyZWFtID0gbnVsbDsKLQkJWmlwRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnRpb24gPSBidW5kbGVMb2NhdGlvbi5nZXROYW1lKCk7Ci0JCQkJZmlsZUV4dGVudGlvbiA9IGZpbGVFeHRlbnRpb24uc3Vic3RyaW5nKGZpbGVFeHRlbnRpb24ubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJCS8vIEhhbmRsZSBhIEpBUidkIGJ1bmRsZQotCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVFeHRlbnRpb24pICYmIGJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JCQkJCVppcEVudHJ5IG1hbmlmZXN0RW50cnkgPSBqYXJGaWxlLmdldEVudHJ5KEphckZpbGUuTUFOSUZFU1RfTkFNRSk7Ci0JCQkJCWlmIChtYW5pZmVzdEVudHJ5ICE9IG51bGwpIHsKLQkJCQkJCW1hbmlmZXN0U3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShtYW5pZmVzdEVudHJ5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIGhhdmUgYSBkaXJlY3RvcnktYmFzZWQgYnVuZGxlCi0JCQkJCUZpbGUgYnVuZGxlTWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIEphckZpbGUuTUFOSUZFU1RfTkFNRSk7Ci0JCQkJCWlmIChidW5kbGVNYW5pZmVzdEZpbGUuZXhpc3RzKCkpCi0JCQkJCQltYW5pZmVzdFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIEphckZpbGUuTUFOSUZFU1RfTkFNRSkpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJCS8vIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhbiBPU0dpIG1hbmlmZXN0IGZpbGUgc28gdHJ5IGFuZCBjb252ZXJ0IGFuIG9sZC1zdHlsZSBtYW5pZmVzdAotCQkJaWYgKG1hbmlmZXN0U3RyZWFtID09IG51bGwpCi0JCQkJcmV0dXJuIGNvbnZlcnRQbHVnaW5NYW5pZmVzdChidW5kbGVMb2NhdGlvbiwgdHJ1ZSk7Ci0KLQkJCS8vIEl0IGlzIG5vdCBhIG1hbmlmZXN0LCBidXQgYSBwbHVnaW4gb3IgYSBmcmFnbWVudAotCQkJdHJ5IHsKLQkJCQlNYW5pZmVzdCBtID0gbmV3IE1hbmlmZXN0KG1hbmlmZXN0U3RyZWFtKTsKLQkJCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gbWFuaWZlc3RUb1Byb3BlcnRpZXMobS5nZXRNYWluQXR0cmlidXRlcygpKTsKLQkJCQkvLyBhZGQgdGhpcyBjaGVjayB0byBoYW5kbGUgdGhlIGNhc2Ugd2VyZSB3ZSByZWFkIGEgbm9uLU9TR2kgbWFuaWZlc3QKLQkJCQlpZiAobWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gY29udmVydFBsdWdpbk1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCB0cnVlKTsKLQkJCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1hbmlmZXN0U3RyZWFtICE9IG51bGwpCi0JCQkJCW1hbmlmZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChqYXJGaWxlICE9IG51bGwpCi0JCQkJCWphckZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0Fic29sdXRlRGlyKEZpbGUgZmlsZSwgU3RyaW5nIGRpck5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJOYW1lICsgIiBpcyBudWxsIik7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGRpck5hbWUgKyAiIGlzIG5vdCBhYnNvbHV0ZSBwYXRoLiBmaWxlPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGRpck5hbWUgKyAiIGlzIG5vdCBkaXJlY3RvcnkuIGZpbGU9IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0Fic29sdXRlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBkaXJOYW1lKSB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJOYW1lICsgIiBpcyBudWxsIik7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGRpck5hbWUgKyAiIGlzIG5vdCBhYnNvbHV0ZSBwYXRoLiBmaWxlPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZGlyTmFtZSArICIgaXMgbm90IGZpbGUgYnV0IGRpcmVjdG9yeSIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGNoZWNrRnVsbFVybChVUkwgdXJsLCBTdHJpbmcgdXJsTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlpZiAodXJsID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiIGlzIG51bGwiKTsKLQkJaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lbmRzV2l0aCgiZmlsZSIpKQotCQkJcmV0dXJuIHVybDsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiKCIgKyB1cmwgKyAiKSBkb2VzIG5vdCBoYXZlIGFic29sdXRlIHBhdGgiKTsKLQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChQQVRIX1NFUCkpCi0JCQlyZXR1cm4gdXJsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFVybCgiZmlsZSIsIG51bGwsIFBBVEhfU0VQICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiKCIgKyAiZmlsZToiICsgUEFUSF9TRVAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIikgaXMgbm90IGZ1bGx5IHF1YWxsaWZpZWQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQYXJlbnREaXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXBhcmVudC5ta2RpcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlIHJlY3Vyc2l2ZWx5LCBhZGRpbmcgZmFpbHVyZSBpbmZvIHRvCi0JICogdGhlIHByb3ZpZGVkIHN0YXR1cyBvYmplY3QuICBUaGUgZmlsZVBhdGggaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyCi0JICogdG8gb3B0aW1pemUgamF2YS5pby5GaWxlIG9iamVjdCBjcmVhdGlvbi4KLQkgKi8KLQkvLyBJbXBsZW1lbnRhdGlvbiB0YWtlbiBmcm9tIHRoZSBFY2xpcHNlIEZpbGUgc3l0ZW0gYnVuZGxlIGNsYXNzIExvY2FsRmlsZS4KLQkvLyAgVE9ETyBjb25zaWRlciBwdXR0aW5nIGJhY2sgdGhlIHByb2dyZXNzIGFuZCBjYW5jZWxhdGlvbiBzdXBwb3J0LgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxEZWxldGUoRmlsZSB0YXJnZXQsIFN0cmluZyBwYXRoVG9EZWxldGUpIHsKLQkJLy9maXJzdCB0cnkgdG8gZGVsZXRlIC0gdGhpcyBzaG91bGQgc3VjY2VlZCBmb3IgZmlsZXMgYW5kIHN5bWJvbGljIGxpbmtzIHRvIGRpcmVjdG9yaWVzCi0JCWlmICh0YXJnZXQuZGVsZXRlKCkgfHwgIXRhcmdldC5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodGFyZ2V0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGxpc3QgPSB0YXJnZXQubGlzdCgpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlsaXN0ID0gRU1QVFlfU1RSSU5HX0FSUkFZOwotCQkJaW50IHBhcmVudExlbmd0aCA9IHBhdGhUb0RlbGV0ZS5sZW5ndGgoKTsKLQkJCWJvb2xlYW4gZmFpbGVkUmVjdXJzaXZlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMCwgaW1heCA9IGxpc3QubGVuZ3RoOyBpIDwgaW1heDsgaSsrKSB7Ci0JCQkJLy9vcHRpbWl6ZWQgY3JlYXRpb24gb2YgY2hpbGQgcGF0aCBvYmplY3QKLQkJCQlTdHJpbmdCdWZmZXIgY2hpbGRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudExlbmd0aCArIGxpc3RbaV0ubGVuZ3RoKCkgKyAxKTsKLQkJCQljaGlsZEJ1ZmZlci5hcHBlbmQocGF0aFRvRGVsZXRlKTsKLQkJCQljaGlsZEJ1ZmZlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCQljaGlsZEJ1ZmZlci5hcHBlbmQobGlzdFtpXSk7Ci0JCQkJU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJLy8gdHJ5IGJlc3QgZWZmb3J0IG9uIGFsbCBjaGlsZHJlbiBzbyBwdXQgbG9naWNhbCBPUiBhdCBlbmQKLQkJCQlmYWlsZWRSZWN1cnNpdmUgPSAhaW50ZXJuYWxEZWxldGUobmV3IGphdmEuaW8uRmlsZShjaGlsZE5hbWUpLCBjaGlsZE5hbWUpIHx8IGZhaWxlZFJlY3Vyc2l2ZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gZG9uJ3QgdHJ5IHRvIGRlbGV0ZSB0aGUgcm9vdCBpZiBvbmUgb2YgdGhlIGNoaWxkcmVuIGZhaWxlZAotCQkJCWlmICghZmFpbGVkUmVjdXJzaXZlICYmIHRhcmdldC5kZWxldGUoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIHdlIGNhdWdodCBhIHJ1bnRpbWUgZXhjZXB0aW9uIHNvIGxvZyBpdAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLwkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmNvdWxkbm90RGVsZXRlLCB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcihGaWxlIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50ZXJuYWxEZWxldGUodGFyZ2V0LCB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWwgdG8gZGVsZXRlIERpcigiICsgdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpICsgIikiKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJzdCwgaXQgcmVwbGFjZXMgRmlsZS5zZXBlcmF0b3Igb2YgcmVsYXRpdmVQYXRoIHRvICIvIi4KLQkgKiBJZiByZWxhdGl2ZVBhdGggaXMgaW4gVVJMIGZvcm1hdCwgcmV0dXJuIGl0cyBVUkwuCi0JICogT3RoZXJ3aXNlLCBjcmVhdGUgYWJzb2x1dGUgVVJMIGJhc2VkIG9uIHRoZSBiYXNlVXJsLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiBAcGFyYW0gYmFzZVVybAotCSAqIEByZXR1cm4gVVJMIAotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZm9ybWF0VXJsKFN0cmluZyByZWxhdGl2ZVBhdGgsIFVSTCBiYXNlVXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsvL3Rocm93cyBNYW5pcHVsYXRvckV4Y2VwdGlvbiB7Ci0JCXJlbGF0aXZlUGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwocmVsYXRpdmVQYXRoLCBGaWxlLnNlcGFyYXRvciwgIi8iKTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHJlbGF0aXZlUGF0aCk7Ci0JCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpCi0JCQkJaWYgKCEobmV3IEZpbGUodXJsLmdldEZpbGUoKSkpLmlzQWJzb2x1dGUoKSkKLQkJCQkJdXJsID0gZ2V0VXJsSW5GdWxsKHJlbGF0aXZlUGF0aCwgYmFzZVVybCk7Ci0JCQlyZXR1cm4gdXJsOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFVybEluRnVsbChyZWxhdGl2ZVBhdGgsIGJhc2VVcmwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVJbmZvW10gZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdChMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQnVuZGxlSW5mb1swXTsKLQkJQnVuZGxlSW5mb1tdIHJldCA9IG5ldyBCdW5kbGVJbmZvW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDbGF1c2VzKFN0cmluZyBoZWFkZXIpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuID0gbmV3IFN0cmluZ1Rva2VuaXplcihoZWFkZXIsICIsIik7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXdoaWxlICh0b2tlbi5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHRva2VuLm5leHRUb2tlbigpKTsKLQkJfQotCQlTdHJpbmdbXSByZXQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDbGF1c2VzTWFuaWZlc3RNYWluQXR0cmlidXRlcyhTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRDbGF1c2VzKGdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIG5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IFV0aWxzLmdldE9TR2lNYW5pZmVzdChsb2NhdGlvbik7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBsb2NhdGUgYnVuZGxlIG1hbmlmZXN0OiAiICsgbG9jYXRpb24pOwotCQlyZXR1cm4gKFN0cmluZykgbWFuaWZlc3QuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeSBnZXRPU0dpTWFuaWZlc3QoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGlmIHdlIGhhdmUgYSBmaWxlLWJhc2VkIFVSTCB0aGF0IGRvZXNuJ3QgZW5kIGluICIuamFyIiB0aGVuLi4uCi0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpICYmICFsb2NhdGlvbi5lbmRzV2l0aCgiLmphciIpKQotCQkJcmV0dXJuIGJhc2ljTG9hZE1hbmlmZXN0KG5ldyBGaWxlKGxvY2F0aW9uLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKSkpOwotCi0JCXRyeSB7Ci0JCQlKYXJGaWxlIGphciA9IG51bGw7Ci0JCQlGaWxlIGZpbGUgPSBudWxsOwotCQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQlmaWxlID0gbmV3IEZpbGUobG9jYXRpb24uc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpKTsKLQkJCQlqYXIgPSBuZXcgSmFyRmlsZShmaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwoImphcjoiICsgbG9jYXRpb24gKyAiIS8iKTsKLQkJCQlKYXJVUkxDb25uZWN0aW9uIGphckNvbm5lY3Rpb24gPSAoSmFyVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJamFyID0gamFyQ29ubmVjdGlvbi5nZXRKYXJGaWxlKCk7Ci0JCQkJLy8gdG9kbyBzaG91bGQgc2V0IHRoaXMgdmFyIGlmIHBvc3NpYmxlCi0JCQkJLy8gZmlsZSA9IDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBqYXIuZ2V0TWFuaWZlc3QoKTsKLQkJCQkvLyB3ZSBtaWdodCBoYXZlIGFuIG9sZC1zdHlsZSBwbHVnLWluIHNvIGxvb2sgZm9yIGFuIG9sZCBwbHVnLWluIG1hbmlmZXN0Ci0JCQkJaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gY29udmVydAotCQkJCQlKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShQTFVHSU5fTUFOSUZFU1QpOwotCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJCWVudHJ5ID0gamFyLmdldEphckVudHJ5KEZSQUdNRU5UX01BTklGRVNUKTsKLQkJCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJcmV0dXJuIGNvbnZlcnRQbHVnaW5NYW5pZmVzdChmaWxlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJCQkvLyBpZiB3ZSBoYXZlIGEgSkFSJ2QgYnVuZGxlIHRoYXQgaGFzIGEgbm9uLU9TR2kgbWFuaWZlc3QgZmlsZSAobGlrZQotCQkJCS8vIHRoZSBvbmVzIHByb2R1Y2VkIGJ5IEFudCwgdGhlbiB0cnkgYW5kIGNvbnZlcnQgdGhlIHBsdWdpbi54bWwKLQkJCQlpZiAoYXR0cmlidXRlcy5nZXRWYWx1ZShDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgPT0gbnVsbCkgewotCQkJCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCXJldHVybiBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoZmlsZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCURpY3Rpb25hcnkgcmVzdWx0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKS50b1N0cmluZygpOwotCQkJCQlyZXN1bHQucHV0KGtleSwgYXR0cmlidXRlcy5nZXRWYWx1ZShrZXkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJamFyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kuZGVidWciKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJsb2NhdGlvbj0iICsgbG9jYXRpb24pOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgaW4gdGhlIG1ldGFkYXRhIGdlbmVyYXRvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5IGNvbnZlcnRQbHVnaW5NYW5pZmVzdChGaWxlIGJ1bmRsZUxvY2F0aW9uLCBib29sZWFuIGxvZ0NvbnZlcnNpb25FeGNlcHRpb24pIHsKLQkJUGx1Z2luQ29udmVydGVyIGNvbnZlcnRlcjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnRlciA9IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMuQWN0aXZhdG9yLmFjcXVpcmVQbHVnaW5Db252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCW5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gYXF1aXJlIFBsdWdpbkNvbnZlcnRlciBzZXJ2aWNlIGR1cmluZyBnZW5lcmF0aW9uIGZvcjogIiArIGJ1bmRsZUxvY2F0aW9uKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0TWFuaWZlc3QoYnVuZGxlTG9jYXRpb24sIGZhbHNlLCBudWxsLCB0cnVlLCBudWxsKTsKLQkJfSBjYXRjaCAoUGx1Z2luQ29udmVyc2lvbkV4Y2VwdGlvbiBjb252ZXJ0RXhjZXB0aW9uKSB7Ci0JCQkvLyBvbmx5IGxvZyB0aGUgZXhjZXB0aW9uIGlmIHdlIGhhZCBhIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sIGFuZCB3ZSBmYWlsZWQgY29udmVyc2lvbgotCQkJaWYgKGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKS5lcXVhbHMoRkVBVFVSRV9NQU5JRkVTVCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIW5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBQTFVHSU5fTUFOSUZFU1QpLmV4aXN0cygpICYmICFuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgRlJBR01FTlRfTUFOSUZFU1QpLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGxvZ0NvbnZlcnNpb25FeGNlcHRpb24pIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIsIDAsICJFcnJvciBjb252ZXJ0aW5nIGJ1bmRsZSBtYW5pZmVzdC4iLCBjb252ZXJ0RXhjZXB0aW9uKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzKTsKLQkJCQkvL1RPRE8gTmVlZCB0byBmaW5kIGEgd2F5IHRvIGdldCBhIGxvZ2dpbmcgc2VydmljZSB0byBsb2cKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aEZyb21DbGF1c2UoU3RyaW5nIGNsYXVzZSkgewotCQlpZiAoY2xhdXNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNsYXVzZS5pbmRleE9mKCI7IikgIT0gLTEpCi0JCQljbGF1c2UgPSBjbGF1c2Uuc3Vic3RyaW5nKDAsIGNsYXVzZS5pbmRleE9mKCI7IikpOwotCQlyZXR1cm4gY2xhdXNlLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSB0YXJnZXQsIEZpbGUgZnJvbSkgewotCi0JCVN0cmluZyB0YXJnZXRQYXRoID0gVXRpbHMucmVwbGFjZUFsbCh0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCksIEZpbGUuc2VwYXJhdG9yLCBQQVRIX1NFUCk7Ci0JCVN0cmluZyBmcm9tUGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwoZnJvbS5nZXRBYnNvbHV0ZVBhdGgoKSwgRmlsZS5zZXBhcmF0b3IsIFBBVEhfU0VQKTsKLQotCQlTdHJpbmdbXSB0YXJnZXRUb2tlbnMgPSBVdGlscy5nZXRUb2tlbnModGFyZ2V0UGF0aCwgUEFUSF9TRVApOwotCQlTdHJpbmdbXSBmcm9tVG9rZW5zID0gVXRpbHMuZ2V0VG9rZW5zKGZyb21QYXRoLCBQQVRIX1NFUCk7Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21Ub2tlbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAoZnJvbVRva2Vuc1tpXS5lcXVhbHModGFyZ2V0VG9rZW5zW2ldKSkKLQkJCQlpbmRleCA9IGk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gaW5kZXggKyAxOyBpIDwgZnJvbVRva2Vucy5sZW5ndGg7IGkrKykKLQkJCXNiLmFwcGVuZCgiLi4iICsgUEFUSF9TRVApOwotCi0JCWZvciAoaW50IGkgPSBpbmRleCArIDE7IGkgPCB0YXJnZXRUb2tlbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAoaSAhPSB0YXJnZXRUb2tlbnMubGVuZ3RoIC0gMSkKLQkJCQlzYi5hcHBlbmQodGFyZ2V0VG9rZW5zW2ldICsgUEFUSF9TRVApOwotCQkJZWxzZQotCQkJCXNiLmFwcGVuZCh0YXJnZXRUb2tlbnNbaV0pOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoVVJMIHRhcmdldCwgVVJMIGZyb20pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0JCWlmICghdGFyZ2V0LmdldFByb3RvY29sKCkuZXF1YWxzKGZyb20uZ2V0UHJvdG9jb2woKSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm90b2NvbHMgb2YgdGFyZ2V0KD0iICsgdGFyZ2V0ICsgIikgYW5kIGZyb20oPSIgKyBmcm9tICsgIikgZG9lcyBOT1QgZXF1YWwiKTsKLQotCQlpZiAodGFyZ2V0LmdldEhvc3QoKSAhPSBudWxsICYmIHRhcmdldC5nZXRIb3N0KCkubGVuZ3RoKCkgIT0gMCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldC5nZXRIb3N0KCk9IiArIHRhcmdldC5nZXRIb3N0KCkpOwotCQkJaWYgKGZyb20uZ2V0SG9zdCgpICE9IG51bGwgJiYgZnJvbS5nZXRIb3N0KCkubGVuZ3RoKCkgIT0gMCkgewotCQkJCWlmICghdGFyZ2V0LmdldEhvc3QoKS5lcXVhbHMoZnJvbS5nZXRIb3N0KCkpKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIb3N0cyBvZiB0YXJnZXQoPSIgKyB0YXJnZXQgKyAiKSBhbmQgZnJvbSg9IiArIGZyb20gKyAiKSBkb2VzIE5PVCBlcXVhbCIpOwotCQkJCWlmICh0YXJnZXQuZ2V0UG9ydCgpICE9IChmcm9tLmdldFBvcnQoKSkpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBvcnRzIG9mIHRhcmdldCg9IiArIHRhcmdldCArICIpIGFuZCBmcm9tKD0iICsgZnJvbSArICIpIGRvZXMgTk9UIGVxdWFsIik7Ci0JCQl9IGVsc2UKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXaGlsZSBIb3N0IG9mIHRhcmdldCg9IiArIHRhcmdldCArICIpIGlzIHNldCwgSG9zdCBvZiBmcm9tIGlzIG51bGwudGFyZ2V0LmdldEhvc3QoKT0iICsgdGFyZ2V0LmdldEhvc3QoKSk7Ci0JCX0gZWxzZSBpZiAoZnJvbS5nZXRIb3N0KCkgIT0gbnVsbCAmJiBmcm9tLmdldEhvc3QoKS5sZW5ndGgoKSAhPSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV2hpbGUgSG9zdCBvZiBmcm9tKD0iICsgZnJvbSArICIpIGlzIHNldCwgSG9zdCBvZiB0YXJnZXQgaXMgbnVsbCIpOwotCi0JCVN0cmluZyB0YXJnZXRQYXRoID0gdGFyZ2V0LmdldEZpbGUoKTsKLQkJU3RyaW5nIGZyb21QYXRoID0gZnJvbS5nZXRGaWxlKCk7Ci0KLQkJU3RyaW5nW10gdGFyZ2V0VG9rZW5zID0gVXRpbHMuZ2V0VG9rZW5zKHRhcmdldFBhdGgsIFBBVEhfU0VQKTsKLQkJU3RyaW5nW10gZnJvbVRva2VucyA9IFV0aWxzLmdldFRva2Vucyhmcm9tUGF0aCwgUEFUSF9TRVApOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tVG9rZW5zLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZyb21Ub2tlbnNbaV0uZXF1YWxzKHRhcmdldFRva2Vuc1tpXSkpCi0JCQkJaW5kZXggPSBpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IGluZGV4ICsgMTsgaSA8IGZyb21Ub2tlbnMubGVuZ3RoOyBpKyspCi0JCQlzYi5hcHBlbmQoIi4uIiArIFBBVEhfU0VQKTsKLQotCQlmb3IgKGludCBpID0gaW5kZXggKyAxOyBpIDwgdGFyZ2V0VG9rZW5zLmxlbmd0aDsgaSsrKQotCQkJaWYgKGkgIT0gdGFyZ2V0VG9rZW5zLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKHRhcmdldFRva2Vuc1tpXSArIFBBVEhfU0VQKTsKLQkJCWVsc2UKLQkJCQlzYi5hcHBlbmQodGFyZ2V0VG9rZW5zW2ldKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8JcHVibGljIHN0YXRpYyBVUkwgZ2V0QWJzb2x1dGVVcmwoU3RyaW5nIHJlbGF0aXZlUGF0aCwgVVJMIGJhc2VVcmwpIHRocm93cyBGd0xhdW5jaGVyRXhjZXB0aW9uIHsKLQkvLwkJcmVsYXRpdmVQYXRoID0gVXRpbHMucmVwbGFjZUFsbChyZWxhdGl2ZVBhdGgsIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCS8vCQl0cnkgewotCS8vCQkJcmV0dXJuIG5ldyBVUkwoYmFzZVVybCwgcmVsYXRpdmVQYXRoKTsKLQkvLwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkvLwkJCXRocm93IG5ldyBGd0xhdW5jaGVyRXhjZXB0aW9uKCJBYnNvbHV0ZSBVUkwgY2Fubm90IGJlIGNyZWF0ZWQuIFxucmVsYXRpdmVQYXRoPSIgKyByZWxhdGl2ZVBhdGggKyAiLGJhc2VVcmw9IiArIGJhc2VVcmwsIGUsIEZ3TGF1bmNoZXJFeGNlcHRpb24uVVJMX0ZPUk1BVF9FUlJPUik7Ci0JLy8JCX0KLQkvLwl9Ci0KLQkvLwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHRvLCBQcm9wZXJ0aWVzIGZyb20sIFN0cmluZyBrZXkpIHsKLQkvLwkJaWYgKGZyb20gIT0gbnVsbCkgewotCS8vCQkJU3RyaW5nIHZhbHVlID0gZnJvbS5nZXRQcm9wZXJ0eShrZXkpOwotCS8vCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkvLwkJCQlpZiAodG8gIT0gbnVsbCkKLQkvLwkJCQkJdG8gPSBuZXcgUHJvcGVydGllcygpOwotCS8vCQkJCXRvLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCS8vCQkJfQotCS8vCQl9Ci0JLy8JfQotCi0JLy8JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzLCBTdHJpbmcga2V5KSB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCS8vCQlpZiAocHJvcHMgPT0gbnVsbCkKLQkvLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3BzID09IG51bGwiKTsKLQkvLwkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkvLwkJdHJ5IHsKLQkvLwkJCXZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkvLwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkvLwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCS8vCQkJdGhyb3cgbmV3IE1hbmlwdWxhdG9yRXhjZXB0aW9uKCJrZXk9IiArIGtleSArICIsdmFsdWU9IiArIHZhbHVlLCBuZmUsIE1hbmlwdWxhdG9yRXhjZXB0aW9uLk9USEVSUyk7Ci0JLy8JCX0KLQkvLwl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmb3IgY3JlYXRlIGEgYmFja3VwIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGFyZ2V0IGZpbGUKLQkgKiBAcmV0dXJuIEZpbGUgYmFja3VwIGZpbGUgd2hvc2UgZmlsZW5hbWUgY29uc2lzdHMgb2YgImhvZ2Vob2dlLnl5eXlNTWRkSEhtbXNzLmV4dCIgb3IgCi0JICogCSJob2dlaG9nZS55eXl5TU1kZEhIbW1zcyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFNpbXBsZURhdGFGb3JtYXR0ZWRGaWxlKEZpbGUgZmlsZSkgewotCQlTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXlNTWRkSEhtbXNzIik7Ci0JCVN0cmluZyBkYXRlID0gZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi4iICsgZGF0ZSArICIuIiArIGZpbGVuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQllbHNlCi0JCQlmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi4iICsgZGF0ZTsKLQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGZpbGVuYW1lKTsKLQkJcmV0dXJuIGRlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIG1zZywgU3RyaW5nIGRlbGltKSB7Ci0JCXJldHVybiBnZXRUb2tlbnMobXNnLCBkZWxpbSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBtc2csIFN0cmluZyBkZWxpbSwgYm9vbGVhbiByZXR1cm5EZWxpbXMpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRhcmdldFNUID0gbmV3IFN0cmluZ1Rva2VuaXplcihtc2csIGRlbGltLCByZXR1cm5EZWxpbXMpOwotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3RhcmdldFNULmNvdW50VG9rZW5zKCldOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QodGFyZ2V0U1QuY291bnRUb2tlbnMoKSk7Ci0JCXdoaWxlICh0YXJnZXRTVC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHRhcmdldFNULm5leHRUb2tlbigpKTsKLQkJfQotCQlsaXN0LnRvQXJyYXkodG9rZW5zKTsKLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRVcmwoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gey8vIHRocm93cyBNYW5pcHVsYXRvckV4Y2VwdGlvbiB7Ci0JCWZpbGUgPSBVdGlscy5yZXBsYWNlQWxsKGZpbGUsIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCQlyZXR1cm4gbmV3IFVSTChwcm90b2NvbCwgaG9zdCwgZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0VXJsSW5GdWxsKFN0cmluZyBwYXRoLCBVUkwgZnJvbSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlVdGlscy5jaGVja0Z1bGxVcmwoZnJvbSwgImZyb20iKTsKLQkJcGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwocGF0aCwgRmlsZS5zZXBhcmF0b3IsICIvIik7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJmcm9tLnRvRXh0ZXJuYWxGb3JtKCk9IiArIGZyb20udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCVN0cmluZyBmcm9tU3QgPSBVdGlscy5yZW1vdmVMYXN0Q2goZnJvbS50b0V4dGVybmFsRm9ybSgpLCAnLycpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZnJvbVN0PSIgKyBmcm9tU3QpOwotCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLQkJCVN0cmluZyBmaWxlU3QgPSBmcm9tLmdldEZpbGUoKTsKLQkJCXJldHVybiBuZXcgVVJMKGZyb21TdC5zdWJzdHJpbmcoMCwgZnJvbVN0Lmxhc3RJbmRleE9mKGZpbGVTdCkgLSAxKSArIHBhdGgpOwotCQl9Ci0JCXJldHVybiBuZXcgVVJMKGZyb21TdCArICIvIiArIHBhdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgbWFuaWZlc3RUb1Byb3BlcnRpZXMoQXR0cmlidXRlcyBkKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlBdHRyaWJ1dGVzLk5hbWUga2V5ID0gKEF0dHJpYnV0ZXMuTmFtZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQucHV0KGtleS50b1N0cmluZygpLCBkLmdldChrZXkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEp1c3QgdXNlZCBmb3IgZGVidWcuCi0JICogCi0JICogQHBhcmFtIHBzIHByaW50c3RyZWFtCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiBwcm9wZXJ0aWVzIAotCSAqIEBwYXJhbSBwcm9wcyBwcm9wZXJ0aWVzIHdob3NlIGtleXMgYW5kIHZhbHVlcyB3aWxsIGJlIHByaW50ZWQgb3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludG91dFByb3BlcnRpZXMoUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBuYW1lLCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCWlmIChwcm9wcyA9PSBudWxsIHx8IHByb3BzLnNpemUoKSA9PSAwKSB7Ci0JCQlwcy5wcmludGxuKCJQcm9wcygiICsgbmFtZSArICIpIGlzIGVtcHR5Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHMucHJpbnRsbigiUHJvcHMoIiArIG5hbWUgKyAiKT0iKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BzLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCXBzLnByaW50KCJcdGtleT0iICsga2V5KTsKLQkJCXBzLnByaW50bG4oIlx0dmFsdWU9IiArIHByb3BzLmdldFByb3BlcnR5KGtleSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGFzdENoKFN0cmluZyB0YXJnZXQsIGNoYXIgY2gpIHsKLQkJd2hpbGUgKHRhcmdldC5jaGFyQXQodGFyZ2V0Lmxlbmd0aCgpIC0gMSkgPT0gY2gpIHsKLQkJCXRhcmdldCA9IHRhcmdldC5zdWJzdHJpbmcoMCwgdGFyZ2V0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyBzdCwgU3RyaW5nIG9sZFN0LCBTdHJpbmcgbmV3U3QpIHsKLQkJaWYgKG9sZFN0LmVxdWFscyhuZXdTdCkpCi0JCQlyZXR1cm4gc3Q7Ci0JCWludCBpbmRleCA9IC0xOwotCQl3aGlsZSAoKGluZGV4ID0gc3QuaW5kZXhPZihvbGRTdCkpICE9IC0xKSB7Ci0JCQlzdCA9IHN0LnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdTdCArIHN0LnN1YnN0cmluZyhpbmRleCArIG9sZFN0Lmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hyaW5rUGF0aChTdHJpbmcgdGFyZ2V0KSB7Ci0JCVN0cmluZyB0YXJnZXRQYXRoID0gVXRpbHMucmVwbGFjZUFsbCh0YXJnZXQsIEZpbGUuc2VwYXJhdG9yLCBQQVRIX1NFUCk7Ci0JCVN0cmluZ1tdIHRhcmdldFRva2VucyA9IFV0aWxzLmdldFRva2Vucyh0YXJnZXRQYXRoLCBQQVRIX1NFUCk7Ci0JCS8vU3RyaW5nW10gZnJvbVRva2VucyA9IFV0aWxzLmdldFRva2Vucyhmcm9tUGF0aCwgUEFUSF9TRVApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFRva2Vucy5sZW5ndGg7IGkrKykKLQkJCWlmICh0YXJnZXRUb2tlbnNbaV0uZXF1YWxzKCIiKSkgewotCQkJCXRhcmdldFRva2Vuc1tpXSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldFRva2Vuc1tpXS5lcXVhbHMoIi4iKSkgewotCQkJCXRhcmdldFRva2Vuc1tpXSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldFRva2Vuc1tpXS5lcXVhbHMoIi4uIikpIHsKLQkJCQlpbnQgaWQgPSBpIC0gMTsKLQkJCQl3aGlsZSAodGFyZ2V0VG9rZW5zW2lkXSA9PSBudWxsKSB7Ci0JCQkJCWlkLS07Ci0JCQkJfQotCQkJCXRhcmdldFRva2Vuc1tpZF0gPSBudWxsOwotCQkJfQotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aChQQVRIX1NFUCkpCi0JCQlzYi5hcHBlbmQoUEFUSF9TRVApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFRva2Vucy5sZW5ndGg7IGkrKykKLQkJCWlmICh0YXJnZXRUb2tlbnNbaV0gIT0gbnVsbCkKLQkJCQlzYi5hcHBlbmQodGFyZ2V0VG9rZW5zW2ldICsgUEFUSF9TRVApOwotCQlTdHJpbmcgcmV0ID0gc2IudG9TdHJpbmcoKTsKLQkJaWYgKCF0YXJnZXRQYXRoLmVuZHNXaXRoKFBBVEhfU0VQKSkKLQkJCXJldCA9IHJldC5zdWJzdHJpbmcoMCwgcmV0Lmxhc3RJbmRleE9mKFBBVEhfU0VQKSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogU29ydCBieSBpbmNyZWFzaW5nIG9yZGVyIG9mIHN0YXJ0bGV2ZWxzLgotCSAqIAotCSAqIEBwYXJhbSBiSW5mb3MgYXJyYXkgb2YgQnVuZGxlSW5mb3MgdG8gYmUgc29ydGVkLgotCSAqIEBwYXJhbSBpbml0aWFsQlNMIGluaXRpYWwgYnVuZGxlIHN0YXJ0IGxldmVsIHRvIGJlIHVzZWQuCi0JICogQHJldHVybiBzb3J0ZWQgYXJyYXkgb2YgQnVuZGxlSW5mb3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUluZm9bXSBzb3J0QnVuZGxlSW5mb3MoQnVuZGxlSW5mb1tdIGJJbmZvcywgaW50IGluaXRpYWxCU0wpIHsKLQkJU29ydGVkTWFwIGJzbFRvTGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbnRlZ2VyIHNMID0gbmV3IEludGVnZXIoYkluZm9zW2ldLmdldFN0YXJ0TGV2ZWwoKSk7Ci0JCQlpZiAoc0wuaW50VmFsdWUoKSA9PSBCdW5kbGVJbmZvLk5PX0xFVkVMKQotCQkJCXNMID0gbmV3IEludGVnZXIoaW5pdGlhbEJTTCk7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgYnNsVG9MaXN0LmdldChzTCk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQkJYnNsVG9MaXN0LnB1dChzTCwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChiSW5mb3NbaV0pOwotCQl9Ci0KLQkJLy8gYnNsVG9MaXN0IGlzIHNvcnRlZCBieSB0aGUga2V5IChTdGFydExldmVsKS4KLQkJTGlzdCBidW5kbGVJbmZvTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gYnNsVG9MaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIHNMID0gKEludGVnZXIpIGl0ZS5uZXh0KCk7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgYnNsVG9MaXN0LmdldChzTCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZTIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZTIuaGFzTmV4dCgpOykgewotCQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlMi5uZXh0KCk7Ci0JCQkJYnVuZGxlSW5mb0xpc3QuYWRkKGJJbmZvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdChidW5kbGVJbmZvTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiBwcm9wZXJ0aWVzIAotCSAqIEBwYXJhbSBwcm9wcyBwcm9wZXJ0aWVzIHdob3NlIGtleXMgYW5kIHZhbHVlcyB3aWxsIGJlIHByaW50ZWQgb3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nUHJvcGVydGllcyhTdHJpbmcgbmFtZSwgUHJvcGVydGllcyBwcm9wcykgewotCQlpZiAocHJvcHMgPT0gbnVsbCB8fCBwcm9wcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuICJQcm9wcygiICsgbmFtZSArICIpIGlzIGVtcHR5XG4iOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJQcm9wcygiICsgbmFtZSArICIpIGlzIFxuIik7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQlzYi5hcHBlbmQoIlx0a2V5PSIgKyBrZXkgKyAiXHR2YWx1ZT0iICsgcHJvcHMuZ2V0UHJvcGVydHkoa2V5KSArICJcbiIpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVVybChVUkwgdXJsKSB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQl0cnkgey8vdGVzdAotCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQljb25uZWN0aW9uLmNvbm5lY3QoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVVJMKCIgKyB1cmwgKyAiKSBjYW5ub3QgYmUgY29ubmVjdGVkLiIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3JtYW5pcHVsYXRvci9Db25maWd1cmF0b3JNYW5pcHVsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAwZTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3JtYW5pcHVsYXRvci9Db25maWd1cmF0b3JNYW5pcHVsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci0KLS8qKgotICogCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRoYXQgZW5hYmxlIGNsaWVudCBidW5kbGVzIHRvIAotICogbWFuaXB1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyBDb25maWd1cmF0b3JCdW5kbGUuCi0gKiAKLSAqICBAc2VlIENvbmZpZ3VyYXRvcgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgewotCVN0cmluZyBTRVJWSUNFX1BST1BfS0VZX0NPTkZJR1VSQVRPUl9CVU5ETEVTWU1CT0xJQ05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5jb25maWd1cmF0b3IuQnVuZGxlU3ltYm9saWNOYW1lIjsKLQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yIEJ1bmRsZSBzbyB0aGF0IAotCSAqIEJ1bmRsZXMga2VwdCBieSB0aGUgc3BlY2lmaWVkIHtAbGluayBNYW5pcHVsYXRvcn0gd291bGQgYmUgaW5zdGFsbGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgYSBsYXVuY2guCi0JICogVGhlIGxvY2F0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlIGlzIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgc2V0IHRvIHRoZSBNYW5pcHVsYXRvciBvYmplY3QKLQkgKiBhbmQgaXQgZGVwZW5kcyBvbiB0aGUgY29ycmVzcG9uZGluZyBDb25maWd1cmF0b3JCdW5kbGUgaW1wbGVtZW50YXRpb24uCi0JICogCi0JICogV2hpbGUgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZSB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCB3aWxsIGJlIG1vZGlmaWVkIChmb3Igc2V0dGluZyBpbmZvIGFib3V0IHRoZSAKLQkgKiBsb2NhdGlvbiB0aGUgQ29uZmlndXJhdG9yQnVuZGxlIHdvdWxkIGJlIGFibGUgdG8gcmVmZXIgaW4gYSBmdXR1cmUgbGF1bmNoKSwgCi0JICogdGhlIEJ1bmRsZXMga2VwdCBieSB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAKLQkgKiBJbnN0ZWFkLCBpdCB3aWxsIHJldHVybiBCdW5kbGVJbmZvW10gdG8gYmUgbWFuYWdlZCBub3QgYnkgdGhlIENvbmZpZ3VyYXRvckJ1bmRsZS4KLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHNhdmVkIGludG8gZncgY29uZmlnIGZpbGVzLgotCSAqIAotCSAqIElmIGJhY2t1cCBmbGFnIGlzIHRydWUsIGEgZmlsZSBoYXZlIGV4aXN0ZWQgYWxyZWFkeSB1bmRlciB0aGUgc2FtZSBuYW1lCi0JICogd2lsbCBiZSByZW5hbWVkIGludG8gYW5vdGhlciBuYW1lIGFzIGEgYmFja3VwLiAKLQkgKiAKLQkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1hbmlwdWxhdG9yI3NhdmUoYm9vbGVhbil9IHdpbGwgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiAgCi0JICogQHJldHVybiBhcnJheSBvZiBCdW5kbGVJbmZvIHRvIGJlIHNhdmVkIGFzIGluc3RhbGxpbmcgYnVuZGxlcyBpbiBmdyBjb25maWcgZmlsZXMuCi0JICogQHBhcmFtIG1hbmlwdWxhdG9yIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBidW5kbGVzIHRvIGJlIGluc3RhbGxlZCBmaW5hbGx5LgotCSAqIEBwYXJhbSBiYWNrdXAgaWYgZmlsZXMgZXhpc3RzIGF0IHRoZSBsb2NhdGlvbiB0byBzYXZlLCBpdCB3aWxsIGJlIGNvcGllZCBhcyBhIGJhY2t1cC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gSWYgZmFpbCB0byBzYXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIENvbmZpZ3VyYXRvciBCdW5kbGUuCi0JICovCi0JQnVuZGxlSW5mb1tdIHNhdmUoTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVcGRhdGUgYnVuZGxlcyBrZXB0IGJ5IHRoZSBzcGVjaWZpZWQge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QgaW50byBpbnN0YWxsZWQgYnVuZGxlcwotCSAqIGlmIHtAbGluayBGcmFtZXdvcmtBZG1pbiNsYXVuY2goTWFuaXB1bGF0b3IsIEZpbGUpfSB3aXRoIHRoZSBzcGVjaWZpZWQgCi0JICoge0BsaW5rIE1hbmlwdWxhdG9yfSBpcyBjYWxsZWQgdGFraW5nIHRoZSBjb3JyZXNwb25kaW5nIENvbmZpZ3VyYXRvckJ1bmRsZSBiZWhhaXZpb3IgaW50byBhY2NvdW50LgotCSAqIAotCSAqIElmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yQnVuZGxlIGluIE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCksCi0JICoganVzdCByZXR1cm4uCi0JICogCi0JICogVGhlIEJ1bmRsZUluZm9bXSBvZiB0aGUgc3BlY2lmaWVkIE1hbmlwdWxhdG9yIG9iamVjdCB3aWxsIGJlIG1vZGlmaWVkLgotCSAqCi0JICogVGhpcyBtZXRob2QgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQgZnJvbSB7QGxpbmsgTWFuaXB1bGF0b3IjbG9hZCgpfS4KLQkgKiAgCi0JICogQHBhcmFtIG1hbmlwdWxhdG9yIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IHRvIGJlIHVzZWQgYW5kIHVwZGF0ZWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIGZhaWwgdG8gcmVhZCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBDb25maWd1cmF0b3IgQnVuZGxlLgotCSAqLwotCXZvaWQgdXBkYXRlQnVuZGxlcyhNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBjbGVhbnVwKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3JtYW5pcHVsYXRvci9Db25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3JtYW5pcHVsYXRvci9Db25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMjQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3JtYW5pcHVsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW47Ci0KLS8qKgotICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3Igb2JqZWN0IGZyb20gSmF2YSBwcm9ncmFtcy4KLSAqIAotICogIEBzZWUgRnJhbWV3b3JrQWRtaW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1lTVEVNX1BST1BFUlRZX0tFWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeSI7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgY3JlYXRlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkgZmFjdG9yeSA9IChDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9CdW5kbGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQnVuZGxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWRlYTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9CdW5kbGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIGluZm9ybWF0aW9uIG9mIGEgYnVuZGxlLgotICoKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZUluZm8gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0xFVkVMID0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQlVORExFSUQgPSAtMTsKLQotCXByaXZhdGUgU3RyaW5nIHN5bWJvbGljTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0JcHJpdmF0ZSBsb25nIGJ1bmRsZUlkID0gTk9fQlVORExFSUQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFya2VkQXNTdGFydGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRMZXZlbCA9IE5PX0xFVkVMOwotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWFuaWZlc3Q7Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbygpIHsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvKFN0cmluZyBsb2NhdGlvbiwgYm9vbGVhbiBzdGFydGVkKSB7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQkJdGhpcy5tYXJrZWRBc1N0YXJ0ZWQgPSBzdGFydGVkOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvKFN0cmluZyBsb2NhdGlvbiwgaW50IHN0YXJ0TGV2ZWwpIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvKFN0cmluZyBsb2NhdGlvbiwgaW50IHN0YXJ0TGV2ZWwsIGJvb2xlYW4gc3RhcnRlZCkgewotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbi50cmltKCk7Ci0JCXRoaXMuc3RhcnRMZXZlbCA9IHN0YXJ0TGV2ZWw7Ci0JCXRoaXMubWFya2VkQXNTdGFydGVkID0gc3RhcnRlZDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgbG9jYXRpb24sIGludCBzdGFydExldmVsLCBib29sZWFuIHN0YXJ0ZWQsIGxvbmcgYnVuZGxlSWQpIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCQl0aGlzLm1hcmtlZEFzU3RhcnRlZCA9IHN0YXJ0ZWQ7Ci0JCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgc3ltYm9saWMsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbG9jYXRpb24sIGludCBzdGFydExldmVsLCBib29sZWFuIHN0YXJ0ZWQpIHsKLQkJdGhpcy5zeW1ib2xpY05hbWUgPSBzeW1ib2xpYzsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQl0aGlzLm1hcmtlZEFzU3RhcnRlZCA9IHN0YXJ0ZWQ7Ci0JCXRoaXMuc3RhcnRMZXZlbCA9IHN0YXJ0TGV2ZWw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRvQ29tcGFyZSkgewotCQlpZiAodG9Db21wYXJlIGluc3RhbmNlb2YgQnVuZGxlSW5mbykgewotCQkJQnVuZGxlSW5mbyBpbmZvID0gKEJ1bmRsZUluZm8pIHRvQ29tcGFyZTsKLQkJCS8vaWYgKGluZm8uc3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGluZm8udmVyc2lvbi5lcXVhbHModmVyc2lvbikgJiYgKGluZm8udXJsID09IG51bGwgfHwgdXJsID09IG51bGwgPyB0cnVlIDogaW5mby51cmwuZXF1YWxzKHVybCkpKQotCQkJaWYgKGluZm8uc3ltYm9saWNOYW1lICE9IG51bGwgJiYgaW5mby52ZXJzaW9uICE9IG51bGwgJiYgc3ltYm9saWNOYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gVE9ETzogdGhlIGVxdWFsc0lnbm9yZUNhc2UgZm9yIGxvY2F0aW9uIGNvbXBhcmlzb24gaXMgYSBidWc7Ci0JCQkJLy8JCSBuZWVkIGEgcGxhdGZvcm0gc2Vuc2l0aXZlIGxvY2F0aW9uIGNvbXBhcmlzb24gbWV0aG9kCi0JCQkJaWYgKGluZm8uc3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGluZm8udmVyc2lvbi5lcXVhbHModmVyc2lvbikgJiYgKGluZm8ubG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbiA9PSBudWxsID8gdHJ1ZSA6IG5ldyBQYXRoKGluZm8ubG9jYXRpb24pLnRvRmlsZSgpLmVxdWFscyhuZXcgUGF0aChsb2NhdGlvbikudG9GaWxlKCkpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAoaW5mby5sb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uID09IG51bGwgPyBmYWxzZSA6IG5ldyBQYXRoKGluZm8ubG9jYXRpb24pLnRvRmlsZSgpLmVxdWFscyhuZXcgUGF0aChsb2NhdGlvbikudG9GaWxlKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0QnVuZGxlSWQoKSB7Ci0JCXJldHVybiBidW5kbGVJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdCgpIHsKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRMZXZlbCgpIHsKLQkJcmV0dXJuIHN0YXJ0TGV2ZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiBzeW1ib2xpY05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gc3ltYm9saWNOYW1lID09IG51bGwgPyAwIDogc3ltYm9saWNOYW1lLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCA9IHJlc3VsdCArICh2ZXJzaW9uID09IG51bGwgPyAwIDogdmVyc2lvbi5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcmVzdWx0ICsgKGxvY2F0aW9uID09IG51bGwgPyAwIDogbmV3IFBhdGgobG9jYXRpb24pLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFya2VkQXNTdGFydGVkKCkgewotCQlyZXR1cm4gbWFya2VkQXNTdGFydGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdW5kbGVJZChsb25nIGJ1bmRsZUlkKSB7Ci0JCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IChsb2NhdGlvbiAhPSBudWxsID8gbG9jYXRpb24udHJpbSgpIDogbnVsbCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChTdHJpbmcgbWFuaWZlc3QpIHsKLQkJdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcmtlZEFzU3RhcnRlZChib29sZWFuIG1hcmtlZEFzU3RhcnRlZCkgewotCQl0aGlzLm1hcmtlZEFzU3RhcnRlZCA9IG1hcmtlZEFzU3RhcnRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZChib29sZWFuIHJlc29sdmVkKSB7Ci0JCXRoaXMucmVzb2x2ZWQgPSByZXNvbHZlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydExldmVsKGludCBsZXZlbCkgewotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBsZXZlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQl0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZlcnNpb24gPSB2YWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJCdW5kbGVJbmZvKCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc3ltYm9saWNOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh2ZXJzaW9uKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJsb2NhdGlvbj0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxvY2F0aW9uKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBzdGFydExldmVsPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoc3RhcnRMZXZlbCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgdG9CZVN0YXJ0ZWQ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChtYXJrZWRBc1N0YXJ0ZWQpOwotCQlidWZmZXIuYXBwZW5kKCIsIHJlc29sdmVkPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQocmVzb2x2ZWQpOwotCQlidWZmZXIuYXBwZW5kKCIsIGlkPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy5idW5kbGVJZCk7Ly8JCWJ1ZmZlci5hcHBlbmQoJywnKS5hcHBlbmQobWFuaWZlc3QgPT0gbnVsbCA/ICJubyBtYW5pZmVzdCIgOiAibWFuaWZlc3QgYXZhaWxhYmxlIik7Ci0JCWJ1ZmZlci5hcHBlbmQoJywnKS5hcHBlbmQobWFuaWZlc3QgPT0gbnVsbCA/ICJubyBtYW5pZmVzdCIgOiAibWFuaWZlc3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQnVuZGxlc1N0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQnVuZGxlc1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTM3M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0J1bmRsZXNTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi0vKioKLSAqIFRoaXMgQVBJIGlzIHVzZWQgZm9yIGV4cGVjdGluZyBidW5kbGVzIHN0YXRlIHZpcnR1YWxseS4KLSAqIAotICogVGhpcyBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGJ5IHtAbGluayBNYW5pcHVsYXRvciNnZXRCdW5kbGVzU3RhdGUoKX0uCi0gKiBBdCBpdHMgaW5zdGFudGlhdGlvbiwgc3RhdGUgb2YgdGhlIGJ1bmRsZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgb2JqZWN0IAotICogYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIHRoZSBjYWxsaW5nIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IGhhcy4KLSAqIEZvciBpdHMgY3JlYXRpb24sIGluZm9ybWF0aW9uIGluIHRoZSBmdyBwZXJzaXN0ZW50IGRhdGEgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQuIAotICogCi0gKiBNb2RpZmljYXRpb24gb2YgdGhpcyBvYmplY3QgYWZ0ZXIgaXRzIGluc3RhbnRpYXRpb24gbmV2ZXIgYWZmZWN0cyB0aGUgcGFyYW1ldGVycwotICogaW4gdGhlIGNhbGxpbmcge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QuICAKLSAqICAKLSAqIFhYWCBJbXBsZW1lbnRhdGlvbiBvZiBTaW1wbGUgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgbmVlZHMgdGhlIGZ1bmN0aW9ucy4gICAKLSAqICAKLSAqIEBzZWUgTWFuaXB1bGF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBCdW5kbGVzU3RhdGUgewotCi0JLyoqIFJldHVybiBleHBlY3RlZCBidW5kbGVzIHN0YXRlIGN1cnJlbnRseSBrZXB0IGluIHRoaXMgb2JqZWN0LiAKLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCB0cnkgdG8gcmVzb2x2ZSB0aGUgc3RhdGUKLQkgKiBpZiByZXNvbHZpbmcgYSBzdGF0ZSBpcyBzdXBwb3J0ZWQuCi0JICogCi0JICogQHJldHVybiBidW5kbGUgYXJyYXkgb2YgQnVuZGxlSW5mbyBjdXJyZW50bHkgY29tcG9zZWQgaW4gdGhpcyBvYmplY3QuCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gLSBJZiB0aGUge0BsaW5rIEZyYW1ld29ya0FkbWlufSBzZXJ2aWNlIGNyZWF0ZWQgdGhlIHBhcmVudCB7QGxpbmsgTWFuaXB1bGF0b3J9IGlzIHVucmVnaXN0ZXJlZC4gCi0JICovCi0JQnVuZGxlSW5mb1tdIGdldEV4cGVjdGVkU3RhdGUoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCQotCSAqIFJldHVybiByZXF1aXJlZCBidW5kbGVzIHRvIGJlIHJlc29sdmUgdGhlIHNwZWNpZmllZCBiSW5mbwotCSAqIHVuZGVyIHRoZSBzdGF0ZSBjdXJyZW50bHkgY29tcG9zZWQuICAKLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCB0cnkgdG8gcmVzb2x2ZSB0aGUgc3RhdGUKLQkgKiBpZiByZXNvbHZpbmcgYSBzdGF0ZSBpcyBzdXBwb3J0ZWQuIAotCSAqIAotCSAqIEBwYXJhbSBiSW5mbyBidW5kbGVpbmZvIHdob3NlIHByZXJlcXVpc2l0ZSBidW5kbGVzIHdpbGwgYmUgc2VhcmNoZWQuCi0JICogQHJldHVybiBidW5kbGUgYXJyYXkgb2YgQnVuZGxlSW5mb3MgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQgYkluZm8gdG8gYmUgcmVzb2x2ZWQuIAotCSAqLwotCUJ1bmRsZUluZm9bXSBnZXRQcmVyZXF1aXN0ZUJ1bmRsZXMoQnVuZGxlSW5mbyBiSW5mbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBidW5kbGUgdG8gYmUgdXNlZCBhcyBhIGZyYW1ld29yayB1bmRlciB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkLiAgCi0JICogQHJldHVybiBhIGJ1bmRsZSB0byBiZSB1c2VkIGFzIGEgZnJhbWV3b3JrIHVuZGVyIHRoZSBzdGF0ZSBjdXJyZW50bHkgY29tcG9zZWQuIAotCSAqLwotCXB1YmxpYyBCdW5kbGVJbmZvIGdldFN5c3RlbUJ1bmRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGJ1bmRsZXMgd2hpY2ggYXJlIGZyYWdtZW50IGJ1bmRsZXMgb2YgdGhlIGZyYW1ld29yayB1bmRlciB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkLiAgCi0JICogQHJldHVybiBhcnJheSBvZiBCdW5kbGVJbmZvcyB3aGljaCBhcmUgZnJhZ21lbnQgYnVuZGxlcyBvZiB0aGUgZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0U3lzdGVtRnJhZ21lbnRlZEJ1bmRsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhcnJheSBvZiBTdHJpbmdzIHdoaWNoIHRlbGxzIHRoZSB1bnNhdGlzZmllZCBjb25zdGFpbnRzCi0JICogdG8gcmVzb2x2ZSB0aGUgc3BlY2lmaWVkIGJJbmZvIHVuZGVyIHRoZSBzdGF0ZSBjdXJyZW50bHkgY29tcG9zZWQuICAKLQkgKiAKLQkgKiBJZiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCByZXNvbHZpbmcgc3RhdGUsCi0JICogRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogWFhYIHRoaXMgbWV0aG9kIGlzIHByZXBhcmVkIG1haW5seSBmb3IgZGVidWdnaW5nLiAKLQkgKiAKLQkgKiBAcGFyYW0gYkluZm8KLQkgKiBAcmV0dXJuIGFycmF5IG9mIFN0cmluZ3Mgd2hpY2ggdGVsbHMgdGhlIHVuc2F0aXNmaWVkIGNvbnN0YWludHMuCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgcmVzb2x2aW5nIHN0YXRlLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gd2l0aCBhIGNhdXNlIG9mIHtAdmFsdWUgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uI1VOU1VQUE9SVEVEX09QRVJBVElPTn0gIHdpbGwgYmUgdGhyb3duLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgYkluZm8gYXMgYSBpbnN0YWxsZWQgYnVuZGxlIHRvIHRoZSBjdXJyZW50IHN0YXRlIHZpcnR1YWxseS4KLQkgKiBOb3RlIHRoYXQgcmVzb2x2ZSB0aGlzIGJ1bmRsZSBpcyBub3QgZG9uZSBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBiSW5mbyBCdW5kbGVJbmZvIHRvIGJlIGluc3RhbGxlZAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoZSBwYXJlbnQge0BsaW5rIE1hbmlwdWxhdG9yfSBpcyB1bnJlZ2lzdGVyZWQuIAotCSAqLwotCXZvaWQgaW5zdGFsbEJ1bmRsZShCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmdWxsIGZ1bmN0aW9ucywKLQkgKiAgc3VjaCBhcyByZXNvbHZpbmcgYnVuZGxlcyBhbmQgLgotCSAqIE90aGVyd2lzZSBmYWxzZSB3aWxsIGJlIHJldHVyZW5kLgotCSAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZXNvbHZpbmcgc3RhdGUuIE90aGVyd2lzZSBmYWxzZS4KLQkgKi8KLQlib29sZWFuIGlzRnVsbHlTdXBwb3J0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSBjdXJyZW50bHkgY29tcG9zZWQgaXMgcmVzb2x2ZWQgYWZ0ZXIgdGhlIGxhc3QgY2hhbmdlIG9mIHRoZSBzdGF0ZS4KLQkgKiBPdGhlcndpc2UgZmFsc2UuIAotCSAqIAotCSAqIElmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwKLQkgKiBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gd2l0aCBhIGNhdXNlIG9mIHtAdmFsdWUgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uI1VOU1VQUE9SVEVEX09QRVJBVElPTn0KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YXRlIGN1cnJlbnRseSBjb21wb3NlZCBpcyByZXNvbHZlZCBhZnRlciB0aGUgbGFzdCBjaGFuZ2Ugb2YgdGhlIHN0YXRlLiBPdGhlcndpc2UgZmFsc2UuIAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059ICB3aWxsIGJlIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYnVuZGxlIGlzIHJlc29sdmVkLgotCSAqIE90aGVyd2lzZSBmYWxzZS4gCi0JICogCi0JICogSWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgcmVzb2x2aW5nIHN0YXRlLAotCSAqIEZ3TGF1bmNoZXJFeGNlcHRpb24gd2l0aCBhIGNhdXNlIG9mIHtAdmFsdWUgRndMYXVuY2hlckV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYnVuZGxlIGlzIHJlc29sdmVkLiBPdGhlcndpc2UgZmFsc2UuIAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059ICB3aWxsIGJlIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioJCi0JICogUmVzb2x2ZXMgdGhlIGNvbnN0cmFpbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHN0YXRlLgotCSAqIAotCSAqIElmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwKLQkgKiBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gd2l0aCBhIGNhdXNlIG9mIHtAdmFsdWUgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uI1VOU1VQUE9SVEVEX09QRVJBVElPTn0KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiAJIAotCSAqIEBwYXJhbSBpbmNyZW1lbnRhbCBhIGZsYWcgY29udHJvbGxpbmcgd2hldGhlciByZXNvbHV0aW9uIHNob3VsZCBiZSBpbmNyZW1lbnRhbAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIAotCSAqLwotCXZvaWQgcmVzb2x2ZShib29sZWFuIGluY3JlbWVudCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVuaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJJbmZvIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgdmlydHVhbGx5LiAKLQkgKiAKLQkgKiBAcGFyYW0gYkluZm8gQnVuZGxlSW5mbyB0byBiZSB1bmluc3RhbGxlZAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoZSBwYXJlbnQge0BsaW5rIE1hbmlwdWxhdG9yfSBpcyB1bnJlZ2lzdGVyZWQuIAotCSAqLwotCXZvaWQgdW5pbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0NvbmZpZ0RhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9Db25maWdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTZiZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0NvbmZpZ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGJ5IHtAbGluayBNYW5pcHVsYXRvciNnZXRDb25maWdEYXRhKCl9OwotICogVGhlIGNsYXNzIHRoYXQga2VlcHMgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZSB7QGxpbmsgTWFuaXB1bGF0b3J9Ci0gKiBjcmVhdGVkIHRoaXMgb2JqZWN0LiBUaGUgbWFuaXB1bGF0aW5nIG9mIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYWZmZWN0Ci0gKiB0aGUgIHtAbGluayBNYW5pcHVsYXRvcn0uCi0gKiAgIAotICogQHNlZSBNYW5pcHVsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnRGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGFwcGVuZFByb3BlcnRpZXMoUHJvcGVydGllcyB0bywgUHJvcGVydGllcyBmcm9tKSB7Ci0JCWlmIChmcm9tICE9IG51bGwpIHsKLQkJCWlmICh0byA9PSBudWxsKQotCQkJCXRvID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCS8vCQkJcHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJ0byIsIHRvKTsKLQkJCS8vCQkJcHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJmcm9tIiwgZnJvbSk7Ci0KLQkJCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBmcm9tLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQkJdG8uc2V0UHJvcGVydHkoa2V5LCBmcm9tLmdldFByb3BlcnR5KGtleSkpOwotCQkJfQotCQl9Ci0JCS8vCQlwcmludG91dFByb3BlcnRpZXMoU3lzdGVtLm91dCwgInRvIiwgdG8pOwotCQlyZXR1cm4gdG87Ci0JfQotCi0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgZndOYW1lOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGZ3VmVyc2lvbjsKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBsYXVuY2hlck5hbWU7Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJWZXJzaW9uOwotCXByaXZhdGUgaW50IGJlZ2lubmluZ0Z3U3RhcnRMZXZlbCA9IEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JcHJpdmF0ZSBpbnQgaW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwgPSBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCS8vIExpc3Qgb2YgQnVuZGxlSW5mbwotCXByaXZhdGUgTGlua2VkSGFzaFNldCBidW5kbGVzTGlzdCA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGZ3SW5kZXBlbmRlbnRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgZndEZXBlbmRlbnRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQlwdWJsaWMgQ29uZmlnRGF0YShTdHJpbmcgZndOYW1lLCBTdHJpbmcgZndWZXJzaW9uLCBTdHJpbmcgbGF1bmNoZXJOYW1lLCBTdHJpbmcgbGF1bmNoZXJWZXJzaW9uKSB7Ci0JCXRoaXMuZndOYW1lID0gZndOYW1lOwotCQl0aGlzLmZ3VmVyc2lvbiA9IGZ3VmVyc2lvbjsKLQkJdGhpcy5sYXVuY2hlck5hbWUgPSBsYXVuY2hlck5hbWU7Ci0JCXRoaXMubGF1bmNoZXJWZXJzaW9uID0gbGF1bmNoZXJWZXJzaW9uOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGUoQnVuZGxlSW5mbyBidW5kbGVJbmZvKSB7Ci0JCXRoaXMuYnVuZGxlc0xpc3QuYWRkKGJ1bmRsZUluZm8pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QmVnaW5pbmdGd1N0YXJ0TGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJlZ2lubmluZ0Z3U3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZXMoKSB7Ci0JCWlmIChidW5kbGVzTGlzdC5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQnVuZGxlSW5mb1swXTsKLQkJQnVuZGxlSW5mb1tdIHJldCA9IG5ldyBCdW5kbGVJbmZvW2J1bmRsZXNMaXN0LnNpemUoKV07Ci0JCWJ1bmRsZXNMaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ3RGVwZW5kZW50UHJvcChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBmd0RlcGVuZGVudFByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0RndEZXBlbmRlbnRQcm9wcygpIHsKLQkJUHJvcGVydGllcyByZXQgPSBuZXcgUHJvcGVydGllcygpOwotCQlhcHBlbmRQcm9wZXJ0aWVzKHJldCwgZndEZXBlbmRlbnRQcm9wcyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd0luZGVwZW5kZW50UHJvcChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBmd0luZGVwZW5kZW50UHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRGd0luZGVwZW5kZW50UHJvcHMoKSB7Ci0JCVByb3BlcnRpZXMgcmV0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJYXBwZW5kUHJvcGVydGllcyhyZXQsIGZ3SW5kZXBlbmRlbnRQcm9wcyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ3VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZndWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmluaXRpYWxCdW5kbGVTdGFydExldmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZXJOYW1lKCkgewotCQlyZXR1cm4gbGF1bmNoZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZXJWZXJzaW9uKCkgewotCQlyZXR1cm4gbGF1bmNoZXJWZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYmVnaW5uaW5nRndTdGFydExldmVsID0gQnVuZGxlSW5mby5OT19MRVZFTDsKLQkJdGhpcy5pbml0aWFsQnVuZGxlU3RhcnRMZXZlbCA9IEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JCXRoaXMuYnVuZGxlc0xpc3QuY2xlYXIoKTsKLQkJdGhpcy5md0luZGVwZW5kZW50UHJvcHMuY2xlYXIoKTsKLQkJdGhpcy5md0RlcGVuZGVudFByb3BzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlKEJ1bmRsZUluZm8gYnVuZGxlSW5mbykgewotCQl0aGlzLmJ1bmRsZXNMaXN0LnJlbW92ZShidW5kbGVJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZWdpbm5pbmdGd1N0YXJ0TGV2ZWwoaW50IHN0YXJ0TGV2ZWwpIHsKLQkJdGhpcy5iZWdpbm5pbmdGd1N0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZXMoQnVuZGxlSW5mb1tdIGJ1bmRsZUluZm9zKSB7Ci0JCXRoaXMuYnVuZGxlc0xpc3QuY2xlYXIoKTsKLQkJaWYgKGJ1bmRsZUluZm9zICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUluZm9zLmxlbmd0aDsgaSsrKQotCQkJCWJ1bmRsZXNMaXN0LmFkZChidW5kbGVJbmZvc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RndEZXBlbmRlbnRQcm9wKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmZ3RGVwZW5kZW50UHJvcHMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RndEZXBlbmRlbnRQcm9wcyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXRoaXMuZndEZXBlbmRlbnRQcm9wcy5jbGVhcigpOwotCQlhcHBlbmRQcm9wZXJ0aWVzKGZ3RGVwZW5kZW50UHJvcHMsIHByb3BzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGd0luZGVwZW5kZW50UHJvcChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5md0luZGVwZW5kZW50UHJvcHMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RndJbmRlcGVuZGVudFByb3BzKFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJdGhpcy5md0luZGVwZW5kZW50UHJvcHMuY2xlYXIoKTsKLQkJYXBwZW5kUHJvcGVydGllcyhmd0luZGVwZW5kZW50UHJvcHMsIHByb3BzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbChpbnQgc3RhcnRMZXZlbCkgewotCQl0aGlzLmluaXRpYWxCdW5kbGVTdGFydExldmVsID0gc3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiQ2xhc3M6IiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCI9PT09PT09PT09PT1JbmRlcGVuZGVudD09PT09PT09PT09PT09PVxuIik7Ci0JCXNiLmFwcGVuZCgiZndOYW1lPSIgKyB0aGlzLmZ3TmFtZSArICJcbiIpOwotCQlzYi5hcHBlbmQoImZ3VmVyc2lvbj0iICsgdGhpcy5md1ZlcnNpb24gKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJsYXVuY2hlck5hbWU9IiArIHRoaXMubGF1bmNoZXJOYW1lICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgibGF1bmNoZXJWZXJzaW9uPSIgKyB0aGlzLmxhdW5jaGVyVmVyc2lvbiArICJcbiIpOwotCQlzYi5hcHBlbmQoImJlZ2lubmluZ0Z3U3RhcnRMZXZlbD0iICsgdGhpcy5iZWdpbm5pbmdGd1N0YXJ0TGV2ZWwgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJpbml0aWFsQnVuZGxlU3RhcnRMZXZlbD0iICsgdGhpcy5pbml0aWFsQnVuZGxlU3RhcnRMZXZlbCArICJcbiIpOwotCQlpZiAodGhpcy5idW5kbGVzTGlzdC5zaXplKCkgPT0gMCkKLQkJCXNiLmFwcGVuZCgiYnVuZGxlc0xpc3Q9bnVsbFxuIik7Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJidW5kbGVzTGlzdD1cbiIpOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5idW5kbGVzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlzYi5hcHBlbmQoIlx0YnVuZGxlc0xpc3RbIiArIGkgKyAiXT0iICsgaXRlci5uZXh0KCkudG9TdHJpbmcoKSArICJcbiIpOwotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCXNiLmFwcGVuZCgiPT09PT09PT09PT09IEZ3IEluZGVwZW5kZW50IFByb3BzID09PT09PT09PT09PT09PVxuIik7Ci0JCXNiLmFwcGVuZCgiZndJbmRlcGVuZGVudFByb3BzPSIpOwotCQlzZXRQcm9wc1N0cmluZ3Moc2IsIGZ3SW5kZXBlbmRlbnRQcm9wcyk7Ci0JCXNiLmFwcGVuZCgiPT09PT09PT09PT09IEZ3IERlcGVuZGVudCBQcm9wcyA9PT09PT09PT09PT09PT1cbiIpOwotCQlzYi5hcHBlbmQoImZ3RGVwZW5kZW50UHJvcHM9Iik7Ci0JCXNldFByb3BzU3RyaW5ncyhzYiwgZndEZXBlbmRlbnRQcm9wcyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcHNTdHJpbmdzKFN0cmluZ0J1ZmZlciBzYiwgUHJvcGVydGllcyBwcm9wcykgewotCQlpZiAocHJvcHMuc2l6ZSgpID4gMCkgewotCQkJc2IuYXBwZW5kKCJcbiIpOwotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BzLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHMoIiIpKQotCQkJCQljb250aW51ZTsKLQkJCQlzYi5hcHBlbmQoIlx0eyIgKyBrZXkgKyAiICxcdCIgKyB2YWx1ZSArICJ9XG4iKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzYi5hcHBlbmQoImVtcHR5XG4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgQVBJIHdpbGwgYmUgcmVnaXN0ZXJlZCB0byB0aGUgc2VydmljZSAKLSAqIHJlZ2lzdHJ5IGFzIGFuIE9TR2kgc2VydmljZS4KLSAqIAotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDEuIEZvciBkZXZlbG9wZXJzIHdobyBpbXBsZW1lbnQgYnVuZGxlcyB0aGF0IHJlZ2lzdGVyIHRoaXMgc2VydmljZS4KLSAqIAotICogVXBvbiByZWdpc3RyYXRpb24sIHRoZSBmb2xsb3dpbmcgc2VydmljZSBwcm9wZXJ0aWVzIG11c3QgYmUgc2V0IHRvIGFsbG93IGNsaWVudHMgdG8gCi0gKiBzZWFyY2ggdGhlIEZyYW1ld29ya0FkbWluIG9iamVjdCwgd2hpY2ggd2lsbCBjcmVhdGUgQnVuZGxlc1N0YXRlIC8gQ29uZmlnRGF0YSAvIExhdW5jaGVyRGF0YSBvYmplY3RzLgotICogCi0gKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jU0VSVklDRV9QUk9QX0tFWV9GV19OQU1FfTogU3RyaW5nOyBuYW1lIG9mIHRoZSBmcmFtZXdvcmsgCi0gKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jU0VSVklDRV9QUk9QX0tFWV9GV19WRVJTSU9OfTogU3RyaW5nOyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXdvcmsKLSAqIHtAbGluayBGcmFtZXdvcmtBZG1pbiNTRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX05BTUV9OiBTdHJpbmc7IG5hbWUgb2YgdGhlIGxhdW5jaGVyIAotICoge0BsaW5rIEZyYW1ld29ya0FkbWluI1NFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfVkVSU0lPTn06IFN0cmluZzsgdmVyc2lvbiBvZiB0aGUgbGF1bmNoZXIgCi0gKgotICogQnVuZGxlcyB0aGF0IHJlZ2lzdGVyIHRoaXMgc2VydmljZSB3aWxsIGNoZWNrIGlmIHRoZSBjdXJyZW50bHkgcnVubmluZyBzeXN0ZW0gY2FuIGJlIG1hbmlwdWxhdGVkIGJ5IAotICogdGhpcyBGcmFtZXdvcmtBZG1pbi4gSWYgeWVzIGFuZCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBjcmVhdGUgYW4gaW5pdGlhbGl6ZWQgTWFuaXB1bGF0b3Igb2JqZWN0Ci0gKiBhY2NvcmRpbmcgdG8gdGhlIHJ1bm5pbmcgZnJhbWV3b3JrIGFuZCBsYXVuY2hlciwgYWRkIHRoZSBzZXJ2aWNlIHByb3BlcnR5IGtleWVkIGJ5IAotICogCi0gKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jU0VSVklDRV9QUk9QX0tFWV9SVU5OSU5HX1NZU1RFTV9GTEFHfTogU3RyaW5nOyBpZiAidHJ1ZSIsIAotICogdGhlIHNlcnZpY2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldFJ1bm5pbmdNYW5pcHVsYXRvcigpIGlzIGZ1bGx5IGluaXRpYWxpemVkIHRvIAotICogcmVwcmVzZW50IHRoZSBzdGF0ZSBvZiB0aGUgcnVubmluZyBzeXN0ZW0uCi0gKiAgICAgCi0gKiBJdCBpcyByZWNvbW1lbmRlZCB0byBpbXBsZW1lbnQgTWFuaXB1bGF0b3Igb2JqZWN0cyBjcmVhdGVkIGJ5IGNhbGxpbmcgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZQotICogc28gdGhhdCB0aGV5IGNhbm5vdCBiZSB1c2VkIGFmdGVyIHRoaXMgc2VydmljZSBpcyB1bnJlZ2lzdGVyZWQuICAKLSAqICAgICAKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAyLiBGb3IgZGV2ZWxvcGVycyB3aG8gaW1wbGVtZW50IGNsaWVudCBidW5kbGVzIHRoYXQgdXNlIHRoaXMgc2VydmljZS4KLSAqIAotICogQSBjbGllbnQgb2YgdGhpcyBzZXJ2aWNlIGNhbiBvYnRhaW4gYSBNYW5pcHVsYXRvciBvYmplY3QgYnkgY2FsbGluZyB0aGUge0BsaW5rICNnZXRNYW5pcHVsYXRvcigpfSBtZXRob2QuCi0gKiAKLSAqIEEgY2xpZW50IGNhbiBzZWFyY2ggYW1vbmcgc2VydmljZXMgcmVnaXN0ZXJlZCBpbiBhIHNlcnZpY2UgcmVnaXN0cnkgdG8gZmluZCB0aGUgCi0gKiBkZXNpcmVkIEZyYW1ld29ya0FkbWluIGltcGxlbWVudGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmcmFtZXdvcmsgCi0gKiB0eXBlLCBmcmFtZXdvcmsgdmVyc2lvbiwgbGF1bmNoZXIgdHlwZSwgYW5kIGxhdW5jaGVyIHZlcnNpb24uCi0gKiAKLSAqIEluIG9yZGVyIGZvciBhIGNsaWVudCBidW5kbGUgdG8gbWFuaXB1bGF0ZSB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QgCi0gKiBvZiB0aGUgcnVubmluZyBmcmFtZXdvcmsgYW5kIGxhdW5jaGVyLCB0aGUgc2VydmljZSBmaWx0ZXIgKEZyYW1ld29ya0FkbWluI1NFUlZJQ0VfUFJPUF9LRVlfUlVOTklOR19GV19GTEFHPXRydWUpIAotICogc2hvdWxkIGJlIHVzZWQuICAgCi0gKiAKLSAqIEFzIHdpdGggYWxsIE9TR2kgc2VydmljZXMsIHRoZSBjbGllbnQgYnVuZGxlIHNob3VsZCB0cmFjayB0aGlzIHNlcnZpY2Ugc3RhdGUuCi0gKiBJZiB0aGUgc2VydmljZSBpcyB1bnJlZ2lzdGVyZWQsIGl0IHNob3VsZCBzdG9wIHVzaW5nIGFueSBvZiB0aGUgb2JqZWN0cyBvYnRhaW5lZCBmcm9tIHRoaXMgc2VydmljZSBhbmQgCi0gKiByZWxlYXNlIHRoZW0uIElmIGl0IGNvbnRpbnVlcyB0byB1c2UgdGhlbSwge0BsaW5rIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbn0gbWlnaHQgCi0gKiBiZSB0aHJvd24uIAotICogCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW4gYWRkaXRpb24sIEZyYW1ld29ya0FkbWluRmFjdG9yeSB3aWxsIGNyZWF0ZSB0aGlzIG9iamVjdC4gVGhpcyBpcyB1c2VkIGJ5IEphdmEgcHJvZ3JhbXMuCi0gKiAKLSAqIEBzZWUgRnJhbWV3b3JrQWRtaW5GYWN0b3J5Ci0gKiAgICAKLSAqLwotcHVibGljIGludGVyZmFjZSBGcmFtZXdvcmtBZG1pbiB7Ci0KLQlTdHJpbmcgU0VSVklDRV9QUk9QX0tFWV9GV19OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JraGFuZGxlci5mcmFtZXdvcmsubmFtZSI7Ci0JU3RyaW5nIFNFUlZJQ0VfUFJPUF9LRVlfRldfVkVSU0lPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2hhbmRsZXIuZnJhbWV3b3JrLnZlcnNpb24iOwotCi0JU3RyaW5nIFNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2hhbmRsZXIubGF1bmNoZXIubmFtZSI7Ci0JU3RyaW5nIFNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfVkVSU0lPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2hhbmRsZXIubGF1bmNoZXIudmVyc2lvbiI7Ci0JU3RyaW5nIFNFUlZJQ0VfUFJPUF9LRVlfUlVOTklOR19TWVNURU1fRkxBRyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2hhbmRsZXIucnVubmluZ2Z3ZmxhZyI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIHtAbGluayBNYW5pcHVsYXRvcn0gYW5kIHJldHVybiBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBNYW5pcHVsYXRvci4KLQkgKi8KLQlwdWJsaWMgTWFuaXB1bGF0b3IgZ2V0TWFuaXB1bGF0b3IoKTsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIE1hbmlwdWxhdG9yfSBmb3IgcnVubmluZyBzeXN0ZW0gCi0JICogYW5kIHJldHVybiBpdC4gVGhlIGluc3RhbmNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSAKLQkgKiBydW5uaW5nIGVudmlyb25tZW50LiBJZiB0aGlzIGltcGxlbWVudGF0aW9uIGNhbm5vdCBwcm92aWRlIGl0LCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBNYW5pcHVsYXRvci4KLQkgKi8KLQlwdWJsaWMgTWFuaXB1bGF0b3IgZ2V0UnVubmluZ01hbmlwdWxhdG9yKCk7Ci0KLQkvKioKLQkgKiBMYXVuY2ggYSBmcmFtZXdvcmsgaW5zdGFuY2UgdW5kZXIgdGhlIHNwZWNpZmllZCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAKLQkgKiAKLQkgKiBAcGFyYW0gbWFuaXB1bGF0b3Ige0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QgdG8gYmUgbGF1bmNoZWQuCi0JICogQHBhcmFtIGN3ZCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIGJlIHVzZWQgZm9yIGxhdW5jaGluZy4KLQkgKiBAcmV0dXJuIHByb2Nlc3MKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzcGVjaWZpZWQgYXJndW1lbnRzIGFyZSBudWxsLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55IGVycm9yIHJlbGF0ZSB3aXRoIElPIG9jY3VycwotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBGcmFtZXdvcmtBZG1pbiBzZXJ2aWNlIG9iamVjdAotCSAqIAkJIHRoYXQgY3JlYXRlZCB0aGUgc3BlY2lmaWVkIE1hbmlwdWxhdG9yIG9iamVjdCBpcyB1bnJlZ2lzdGVyZWQuCi0JICovCi0JcHVibGljIFByb2Nlc3MgbGF1bmNoKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBGaWxlIGN3ZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgYWN0aXZlLiBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MDQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjsKLQotLyoqCi0gKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBGcmFtZXdvcmtBZG1pbiBvYmplY3QgZnJvbSBKYXZhIHByb2dyYW1zLgotICogCi0gKiAgQHNlZSBGcmFtZXdvcmtBZG1pbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnJhbWV3b3JrQWRtaW5GYWN0b3J5IHsKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgRnJhbWV3b3JrQWRtaW4gY3JlYXRlRnJhbWV3b3JrQWRtaW4oKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8vIHByb3Bvc2VkIG1ldGhvZDogb25seSBmb3IgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5LCBtYWdpYyBzeXN0ZW0gcHJvcGVydHkgaXMgdXNlZC4KLQlwdWJsaWMgc3RhdGljIEZyYW1ld29ya0FkbWluIGdldEluc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJRnJhbWV3b3JrQWRtaW5GYWN0b3J5IGZhY3RvcnkgPSAoRnJhbWV3b3JrQWRtaW5GYWN0b3J5KSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJcmV0dXJuIChGcmFtZXdvcmtBZG1pbikgZmFjdG9yeS5jcmVhdGVGcmFtZXdvcmtBZG1pbigpOwotCX0KLQotCS8vICAvLyBtZXRob2QgMzogdHdvIG1hZ2ljIHN5c3RlbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotCS8vCXB1YmxpYyBzdGF0aWMgRnJhbWV3b3JrQWRtaW4gZ2V0SW5zdGFuY2UoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JLy8JCVN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uZnJhbWV3b3JrQWRtaW5GYWN0b3J5Iik7Ci0JLy8JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkvLwkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJTeXN0ZW0gcHJvcGVydHkga2V5ZWQgYnkgXCJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLmZyYW1ld29ya0FkbWluRmFjdG9yeVwiIGlzIG5vdCBzZXQuIik7Ci0JLy8JCUZyYW1ld29ya0FkbWluRmFjdG9yeSBmYWN0b3J5ID0gKEZyYW1ld29ya0FkbWluRmFjdG9yeSkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JLy8JCXJldHVybiAoRnJhbWV3b3JrQWRtaW4pIGZhY3RvcnkuY3JlYXRlRnJhbWV3b3JrQWRtaW4oKTsKLQkvLwl9Ci0KLQkvLyAgLy8gbWV0aG9kIDE6IG5vIG1hZ2ljIHN5c3RlbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotCS8vCi0JLy8JcHVibGljIHN0YXRpYyBGcmFtZXdvcmtBZG1pbiBnZXRJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCS8vCQlFeHRlbmRlZEZyYW1ld29ya0FkbWluRmFjdG9yeSBmYWN0b3J5ID0gKEV4dGVuZGVkRnJhbWV3b3JrQWRtaW5GYWN0b3J5KSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkvLwkJcmV0dXJuIChGcmFtZXdvcmtBZG1pbikgZmFjdG9yeS5jcmVhdGVGcmFtZXdvcmtBZG1pbihjb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlOYW1lKTsKLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9GcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5OTYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1wdWJsaWMgY2xhc3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjI5MjQ5ODY3NzAwMDc3MjMxN0w7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVXT1JLQURNSU5fVU5BVkFJTEFCTEUgPSAiRnJhbWV3b3JrQWRtaW4gc2VydmljZSBjcmVhdGVkIHRoaXMgb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUgYW55IG1vcmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1VQUE9SVEVEX09QRVJBVElPTiA9ICJUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4iOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhc29uOwotCXByaXZhdGUgVGhyb3dhYmxlIGNhdXNlOwotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcmVhc29uKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQkJdGhpcy5jYXVzZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UsIFN0cmluZyByZWFzb24pIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCXRoaXMucmVhc29uID0gcmVhc29uOwotCQl0aGlzLmNhdXNlICA9IGNhdXNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBTdHJpbmcgcmVhc29uKSB7Ci0JCXN1cGVyKGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCXRoaXMucmVhc29uID0gcmVhc29uOwotCQl0aGlzLmNhdXNlID0gY2F1c2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0JCXJldHVybiByZWFzb247Ci0JfQotCi0JcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLQkJcmV0dXJuIGNhdXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9MYXVuY2hlckRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9MYXVuY2hlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZmQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vTGF1bmNoZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGJ5IHtAbGluayBNYW5pcHVsYXRvciNnZXRMYXVuY2hlckRhdGEoKX07Ci0gKiBUaGUgY2xhc3MgdGhhdCBrZWVwcyBzb21lIHBhcmFtZXRlcnMgb2YgdGhlIHtAbGluayBNYW5pcHVsYXRvcn0KLSAqICBjcmVhdGVkIHRoaXMgb2JqZWN0LiBUaGUgbWFuaXB1bGF0aW5nIG9mIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYWZmZWN0Ci0gKiAgdGhlICB7QGxpbmsgTWFuaXB1bGF0b3J9LgotICogIAotICogCi0gKiBAc2VlIE1hbmlwdWxhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlckRhdGEgewotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTlVMTF9TVFJJTkdTID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIEZpbGUgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIEZpbGUganZtID0gbnVsbDsKLQlwcml2YXRlIExpc3QganZtQXJncyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IHByb2dyYW1BcmdzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBjbGVhbjsKLQlwcml2YXRlIEZpbGUgZndDb25maWdMb2NhdGlvbjsKLQlwcml2YXRlIEZpbGUgaG9tZSA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlIGZ3SmFyID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZSBsYXVuY2hlciA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlIGxhdW5jaGVyQ29uZmlnTG9jYXRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZndOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZ3VmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBsYXVuY2hlck5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJWZXJzaW9uOwotCi0JcHVibGljIExhdW5jaGVyRGF0YShTdHJpbmcgZndOYW1lLCBTdHJpbmcgZndWZXJzaW9uLCBTdHJpbmcgbGF1bmNoZXJOYW1lLCBTdHJpbmcgbGF1bmNoZXJWZXJzaW9uKSB7Ci0JCXRoaXMuZndOYW1lID0gZndOYW1lOwotCQl0aGlzLmZ3VmVyc2lvbiA9IGZ3VmVyc2lvbjsKLQkJdGhpcy5sYXVuY2hlck5hbWUgPSBsYXVuY2hlck5hbWU7Ci0JCXRoaXMubGF1bmNoZXJWZXJzaW9uID0gbGF1bmNoZXJWZXJzaW9uOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRKdm1BcmcoU3RyaW5nIGFyZykgewotCQlpZiAoYXJnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWp2bUFyZ3MuYWRkKGFyZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvZ3JhbUFyZyhTdHJpbmcgYXJnKSB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcHJvZ3JhbUFyZ3MuYWRkKGFyZyk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RndDb25maWdMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZ3Q29uZmlnTG9jYXRpb247Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RndKYXIoKSB7Ci0JCXJldHVybiBmd0phcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ3TmFtZSgpIHsKLQkJcmV0dXJuIGZ3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd1ZlcnNpb24oKSB7Ci0JCXJldHVybiBmd1ZlcnNpb247Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGhvbWU7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SnZtKCkgewotCQlyZXR1cm4ganZtOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRKdm1BcmdzKCkgewotCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tqdm1BcmdzLnNpemUoKV07Ci0JCWp2bUFyZ3MudG9BcnJheShhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0TGF1bmNoZXIoKSB7Ci0JCXJldHVybiBsYXVuY2hlcjsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoZXJDb25maWdMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyTmFtZSgpIHsKLQkJcmV0dXJuIGxhdW5jaGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyVmVyc2lvbigpIHsKLQkJcmV0dXJuIGxhdW5jaGVyVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvZ3JhbUFyZ3MoKSB7Ci0JCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW3Byb2dyYW1BcmdzLnNpemUoKV07Ci0JCXByb2dyYW1BcmdzLnRvQXJyYXkoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9IG51bGw7Ci0JCWp2bSA9IG51bGw7Ci0JCWp2bUFyZ3MuY2xlYXIoKTsKLQkJcHJvZ3JhbUFyZ3MuY2xlYXIoKTsKLQkJY2xlYW4gPSBmYWxzZTsKLQkJZndDb25maWdMb2NhdGlvbiA9IG51bGw7Ci0JCWZ3SmFyID0gbnVsbDsKLQkJbGF1bmNoZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKSB7Ci0JCXJldHVybiBjbGVhbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKdm1BcmcoU3RyaW5nIGFyZykgewotCQlqdm1BcmdzLnJlbW92ZShhcmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2dyYW1BcmcoU3RyaW5nIGFyZykgewotCQlwcm9ncmFtQXJncy5yZW1vdmUoYXJnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGd0NvbmZpZ0xvY2F0aW9uKEZpbGUgZndDb25maWdMb2NhdGlvbikgewotCQl0aGlzLmZ3Q29uZmlnTG9jYXRpb24gPSBmd0NvbmZpZ0xvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ3SmFyKEZpbGUgZndKYXIpIHsKLQkJdGhpcy5md0phciA9IGZ3SmFyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiwgYm9vbGVhbiBjbGVhbikgewotCQl0aGlzLmZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9IGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbjsKLQkJdGhpcy5jbGVhbiA9IGNsZWFuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvbWUoRmlsZSBob21lKSB7Ci0JCXRoaXMuaG9tZSA9IGhvbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SnZtKEZpbGUgZmlsZSkgewotCQl0aGlzLmp2bSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SnZtQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkgewotCQkJanZtQXJncy5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLQkJCXRoaXMuYWRkSnZtQXJnKGFyZ3NbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyKEZpbGUgbGF1bmNoZXJGaWxlKSB7Ci0JCWxhdW5jaGVyID0gbGF1bmNoZXJGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyQ29uZmlnTG9jYXRpb24oRmlsZSBsYXVuY2hlckNvbmZpZ0xvY2F0aW9uKSB7Ci0JCXRoaXMubGF1bmNoZXJDb25maWdMb2NhdGlvbiA9IGxhdW5jaGVyQ29uZmlnTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3JhbUFyZ3MoU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApIHsKLQkJCXByb2dyYW1BcmdzLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotCQkJdGhpcy5hZGRQcm9ncmFtQXJnKGFyZ3NbaV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJDbGFzczoiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcbiIpOwotCQlzYi5hcHBlbmQoImZ3TmFtZT0iICsgdGhpcy5md05hbWUgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJmd1ZlcnNpb249IiArIHRoaXMuZndWZXJzaW9uICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgibGF1bmNoZXJOYW1lPSIgKyB0aGlzLmxhdW5jaGVyTmFtZSArICJcbiIpOwotCQlzYi5hcHBlbmQoImxhdW5jaGVyVmVyc2lvbj0iICsgdGhpcy5sYXVuY2hlclZlcnNpb24gKyAiXG4iKTsKLQotCQlzYi5hcHBlbmQoImp2bT0iICsgdGhpcy5qdm0gKyAiXG4iKTsKLQkJaWYgKHRoaXMuanZtQXJncy5zaXplKCkgPT0gMCkKLQkJCXNiLmFwcGVuZCgianZtQXJncyA9IG51bGxcbiIpOwotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgianZtQXJncz1cbiIpOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGp2bUFyZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQkJc2IuYXBwZW5kKCJcdGp2bUFyZ3NbIiArIGkrKyArICJdPSIgKyBpdGVyYXRvciArICJcbiIpOwotCi0JCX0KLQkJaWYgKHRoaXMucHJvZ3JhbUFyZ3Muc2l6ZSgpID09IDApCi0JCQlzYi5hcHBlbmQoInByb2dyYW1BcmdzID0gbnVsbFxuIik7Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJwcm9ncmFtQXJncz1cbiIpOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2dyYW1BcmdzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJCXNiLmFwcGVuZCgiXHRwcm9ncmFtQXJnc1siICsgaSsrICsgIl09IiArIGl0ZXJhdG9yICsgIlxuIik7Ci0JCX0KLQkJc2IuYXBwZW5kKCJmd0NvbmZpZ0xvY2F0aW9uPSIgKyB0aGlzLmZ3Q29uZmlnTG9jYXRpb24gKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJmd0phcj0iICsgdGhpcy5md0phciArICJcbiIpOwotCQlzYi5hcHBlbmQoImZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbj0iICsgdGhpcy5md1BlcnNpc3RlbnREYXRhTG9jYXRpb24gKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJob21lPSIgKyB0aGlzLmhvbWUgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJsYXVuY2hlcj0iICsgdGhpcy5sYXVuY2hlciArICJcbiIpOwotCQlzYi5hcHBlbmQoImxhdW5jaGVyQ29uZmlnTG9jYXRpb249IiArIHRoaXMubGF1bmNoZXJDb25maWdMb2NhdGlvbiArICJcbiIpOwotCQlzYi5hcHBlbmQoImNsZWFuPSIgKyB0aGlzLmlzQ2xlYW4oKSArICJcbiIpOwotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9NYW5pcHVsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL01hbmlwdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzI5MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL01hbmlwdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci0KLS8qKgotICogQSBtYW5pcHVsYXRvciBpcyB1c2VkIHRvIHF1ZXJ5IGFuZCBtb2RpZnkgdGhlIHN0YXRlIG9mIGEgZnJhbWV3b3JrIGluc3RhbmNlLiAKLSAqIEEgbWFuaXB1bGF0b3IgaW5zdGFuY2UgaXMgb2J0YWluZWQgYnkgY2FsbGluZyB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jZ2V0TWFuaXB1bGF0b3IoKX0uCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHVzZS1jYXNlcyBvZiB0aGlzIGludGVyZmFjZToKLSAqIAotICogVXNlY2FzZSAxOiBzZXQgcGFyYW1ldGVycywgY2hlY2sgdGhlIGV4cGVjdGVkIHN0YXRlLCBzYXZlIHRoZW0gaW50byBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgbGF1bmNoLiAKLSAqIAlBLiBjcmVhdGUgYSB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCBmcm9tIGEge0BsaW5rIEZyYW1ld29ya0FkbWlufS4KLSAqICBCLiBzZXQgcGFyYW1ldGVycyB0byB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QuCi0gKiAgQy4gZ2V0RXhwZWN0ZWRTdGF0ZSgpIGFuZCBjaGVjayB3aGF0IGJ1bmRsZSBzdGF0ZSB3aWxsIGJlIHJlYWxpemVkLgotICogICAgIElmIGl0IGlzIG5vdCBzYW1lIGFzIHlvdSBkZXNpcmUsIHJlcGVhdCBCIGFuZCBDIHVudGlsIGl0IGJlY29tZXMgYXMgeW91IGRlc2lyZS4KLSAqICBELiBzYXZlIHBhcmFtZXRlcnMgaW50byBjb25maWd1cmF0aW9uIGZpbGVzIGJ5IHtAbGluayBNYW5pcHVsYXRvciNzYXZlKGJvb2xlYW4pfS4KLSAqICBFLiBsYXVuY2ggdGhlIGZyYW1ld29yayBieSB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jbGF1bmNoKE1hbmlwdWxhdG9yLCBGaWxlKX0uCi0gKiAgICAgCi0gKiBVc2VjYXNlIDI6IHNldCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBsb2FkaW5nLCBsb2FkIHBhcmFtZXRlcnMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGVzLAotICogCQkgIGNoZWNrIHRoZSBleHBlY3RlZCBzdGF0ZSwgYW5kIGxhdW5jaC4gCi0gKiAJQS4gY3JlYXRlIGEge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QgZnJvbSBhIHtAbGluayBGcmFtZXdvcmtBZG1pbn0uCi0gKiAgQi4gc2V0IHBhcmFtZXRlcnMgYWJvdXQgbGF1bmNoZXIgb3IgZnJhbWV3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZSB0byB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QuCi0gKiAgQy4gbG9hZCBwYXJhbWV0ZXJzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlcyBieSB7QGxpbmsgTWFuaXB1bGF0b3IjbG9hZCgpfTsKLSAqICBELiBnZXRFeHBlY3RlZFN0YXRlKCkgYW5kIGNoZWNrIHdoYXQgYnVuZGxlIHN0YXRlIHdpbGwgYmUgcmVhbGl6ZWQuCi0gKiAgRS4gbGF1bmNoIHRoZSBmcmFtZXdvcmsgYnkge0BsaW5rIEZyYW1ld29ya0FkbWluI2xhdW5jaChNYW5pcHVsYXRvciwgRmlsZSl9LgotICogQHNlZSBGcmFtZXdvcmtBZG1pbgotICogQHNlZSBDb25maWdEYXRhCi0gKiBAc2VlIExhdW5jaGVyRGF0YQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbmlwdWxhdG9yIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBCdW5kbGRzU3RhdGUgb2JqZWN0LAotCSAqIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycyBzZXQgdG8gdGhpcyBvYmplY3QgImluIG1lbW9yeSIuCi0JICogCi0JICogTm9uZSBvZiBsYXVuY2hlciBjb25maWcgZmlsZSwgZnJhbWV3b3JrIGNvbmZpZyBmaWxlIGFuZCBjb25maWd1cmF0b3IgY29uZmlnIGZpbGUKLQkgKiB3aWxsIGJlIHJlYWQgYnkgdGhpcyBtZXRob2QuIEhvd2V2ZXIsIHRoZSBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhIGxvY2F0aW9uIHNob3VsZCBiZQotCSAqIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIAotCSAqIHRoZSBleHBlY3RlZCB7QGxpbmsgQnVuZGxlc1N0YXRlfSBvYmplY3QgYXNzdW1pbmcgdGhhdCB0aGUgY3VycmVudCBwYXJhbWV0ZXJzIHdlcmUgc2F2ZWQgYW5kIAotCSAqIHtAbGluayBGcmFtZXdvcmtBZG1pbiNsYXVuY2goTWFuaXB1bGF0b3IsIEZpbGUpfSB3aXRoIGFuIGFyZ3VtZW50IG9mIHRoaXMgb2JqZWN0IAotCSAqIHdlcmUgY2FsbGVkLiAoSXQgd291bGQgcmVhZCB0aGUgZnJhbWV3b3JrIHBlcnNpc3RlbnQgZGF0YSBsb2NhdGlvbiBpZiByZXF1aXJlZCkuCi0JICogIAotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIGluIHRoaXMge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBmcmFtZXdvcmsgYnVuZGxlIHN0YXRlIG9iamVjdCBjcmVhdGVkIGFjY29yZGluZyB0byBoZSBjdXJyZW50IHBhcmFtZXRlcnMgc2V0LgotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoaXMgb2JqZWN0IGlzIHVucmVnaXN0ZXJlZCBvciB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4gCi0JICovCi0JQnVuZGxlc1N0YXRlIGdldEJ1bmRsZXNTdGF0ZSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlIG9mIHtAbGluayBDb25maWdEYXRhfSBvYmplY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB3aXRoIGZyYW1ld29yayBzZXR0aW5ncyB3aWxsIGJlIHJldHVybmVkLgotCSAqIFJlbWluZCB0aGF0IG1hbmlwdWxhdGluZyByZXR1cm5lZCBvYmplY3Qgd2lsbCBhZmZlY3QgdGhpcyBNYW5pcHVsYXRvciBiZWhhdmlvci4KLQkgKiAgCi0JICogQHJldHVybiBDb25maWdEYXRhIG9iamVjdCByZXByZXNlbnRpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWxhdGVkIHdpdGggZnJhbWV3b3JrIHNldHRpbmcgCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gLSBJZiB0aGUge0BsaW5rIEZyYW1ld29ya0FkbWlufSBzZXJ2aWNlIGNyZWF0ZWQgdGhpcyBvYmplY3QgaXMgdW5yZWdpc3RlcmVkIG9yIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMgbWV0aG9kLiAKLQkgKiBAc2VlIENvbmZpZ0RhdGEKLQkgKi8KLQlDb25maWdEYXRhIGdldENvbmZpZ0RhdGEoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHBlY3RlZCBCdW5kbGVJbmZvIGFycmF5IHJlcHJlc2VudGluZyBzdGF0ZSBvZiBidW5kbGVzLAotCSAqIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycyBzZXQgdG8gdGhpcyBvYmplY3QgImluIG1lbW9yeSIuCi0JICogCi0JICogTm9uZSBvZiBsYXVuY2hlciBjb25maWcgZmlsZSwgZnJhbWV3b3JrIGNvbmZpZyBmaWxlIGFuZCBjb25maWd1cmF0b3IgY29uZmlnIGZpbGUKLQkgKiB3aWxsIGJlIHJlYWQgYnkgdGhpcyBtZXRob2QuIEhvd2V2ZXIsIHRoZSBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhIGxvY2F0aW9uIHNob3VsZCBiZQotCSAqIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIAotCSAqIHRoZSBleHBlY3RlZCBidW5kbGVzIHN0YXRlIGFzc3VtaW5nIHRoYXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyB3ZXJlIHNhdmVkIGFuZCAKLQkgKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jbGF1bmNoKE1hbmlwdWxhdG9yLCBGaWxlKX0gd2l0aCBhbiBhcmd1bWVudCBvZiB0aGlzIG9iamVjdCAKLQkgKiB3ZXJlIGNhbGxlZC4gKEl0IHdvdWxkIHJlYWQgdGhlIGZyYW1ld29yayBwZXJzaXN0ZW50IGRhdGEgbG9jYXRpb24gaWYgcmVxdWlyZWQpLgotCSAqIAotCSAqIFJldHVybmVkIEJ1bmRsZUluZm9zIG11c3QgaGF2ZSByZXNvbHZlZCBmbGFnIHNldC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IG1vZGlmeSB0aGUgcGFyYW1ldGVycyBpbiB0aGlzIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0LiAKLQkgKiAKLQkgKiBjZi4gZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKSB3aWxsIHJldHVybiBhcnJheSBvZiBCdW5kbGVJbmZvIHRvby4KLQkgKiAJSG93ZXZlciB0aGUgcmVzb2x2ZWQgZmxhZyBvZiByZXR1cm5lZCBCdW5kbGVJbmZvcyBtaWdodCBub3QgYmUgcmVsaWFibGUuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGdldEJ1bmRsZXNTdGF0ZSgpLmdldEV4cGVjdGVkU3RhdGUoKS4KLQkgKiAgCi0JICogQHJldHVybiBhcnJheSBvZiBCdW5kbGVJbmZvIHJlcHJlc2VudGluZyBleHBlY3RlZCBzdGF0ZSBvZiBhbGwgYnVuZGxlcyBpbnN0YWxsZWQuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSBJZiBlaXRoZXIgb2YgZndKYXIgb3IgY3dkIGRvZXNuJ3QgZXhpc3QuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIHJlYWRpbmcgZncgY29uZmlndXJhdGlvbiBmaWxlIG9yIHJlYWRpbmcgcGVyc2lzdGVudGx5IHJlY29yZGVkIGluZm9ybWF0aW9uIAotCSAqICAgb2YgZncgZmFpbHMuIAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoaXMgb2JqZWN0IGlzIHVucmVnaXN0ZXJlZCBvciB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4gCi0JICovCi0JQnVuZGxlSW5mb1tdIGdldEV4cGVjdGVkU3RhdGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZSBvZiB7QGxpbmsgTGF1bmNoZXJEYXRhfSBvYmplY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkgKiByZWxhdGVkIHdpdGggbGF1bmNoZXIgc2V0dGluZ3Mgd2lsbCBiZSByZXR1cm5lZC4gCi0JICogUmVtZW1iZXIgdGhhdCBtYW5pcHVsYXRpbmcgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWZmZWN0IHRoaXMgTWFuaXB1bGF0b3Igb2JqZWN0IGJlaGF2aW9yLgotCSAqIAotCSAqIEByZXR1cm4gTGF1bmNoZXJEYXRhIG9iamVjdCByZXByZXNlbnRpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWxhdGVkIHdpdGggbGF1bmNoZXIgc2V0dGluZyAKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSBNYW5pcHVsYXRvckFkbWluIHNlcnZpY2UgY3JlYXRlZCB0aGlzIG9iamVjdCBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtZXRob2QuIAotCSAqIEBzZWUgTGF1bmNoZXJEYXRhCi0JICovCi0JTGF1bmNoZXJEYXRhIGdldExhdW5jaGVyRGF0YSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGltZXN0YW1wIG9mIGNvbmZpZ3VyYXRpb25zIHdoaWNoIHdpbGwgYmUgbG9hZGVkIGJ5IGxvYWQoKSBtZXRob2QKLQkgKiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0IHRvIHRoaXMgbWFuaXB1bGF0b3IgaW4gbG9uZyB2YWx1ZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNoZWNrIGxhc3QgbW9kaWZpZWQgdGltZSBvZiBhbGwgbGF1bmNoZXIgY29uZmlndXJhdGlvbiBmaWxlLCBmcmFtZXdvcmsgY29uZmlndXJhdGlvbiBmaWxlLAotCSAqIGFuZCBmcmFtZXdvcmsgcGVyc2lzdGVudCBzdG9yYWdlIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycyBzZXQuCi0JICogQHJldHVybgotCSAqLwotCWxvbmcgZ2V0VGltZVN0YW1wKCk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFsbCBpbmZvcm1hdGlvbiB0aGF0IHRoaXMgb2JqZWN0IGtlZXBzIGF0IHRoYXQgdGltZS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKTsKLQotCS8qKgotCSAqIGxvYWQgY29uZmlncyBmcm9tIGFwcHJvcHJpYXRlIGNvbmZpZyBmaWxlcywgCi0JICogaW5jbHVkaW5nIGxhdW5jaGVyIGNvbmZpZyBmaWxlLCBmdyBjb25maWcgZmlsZSwgYW5kIGNvbmZpZ3VyYXRvciBjb25maWcgZmlsZXMsIAotCSAqIHdob3NlIGxvY2F0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgY3VycmVudCBzZXR0aW5nLiBJbiBhZGRpdGlvbiwgCi0JICogdGhlIGZ3IHBlcnNpc3RlbnQgZGF0YSBsb2NhdGlvbiBzaG91bGQgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiAKLQkgKiAKLQkgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBjb250YWlucyB0aGUgbWF0dGVycyBvZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCi0JICogSG93ZXZlciwgaXQgaXMgYW4gZXhhbXBsZSBob3cgaXQgd29ya3MuCi0JICogCi0JICogMS4gaWYgbGF1bmNoZXIgb2JqZWN0IGlzIHNldCwgY29ycmVzcG9uZGluZyBsYXVuY2hlciBjb25maWcgZmlsZSB3aWxsIGJlIHJlYWQuCi0JICogQWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiByZXRyaWV2ZWQsIHNldHRpbmcgb2YgdGhpcyBvYmplY3Qgd2lsbCBiZSB1cGRhdGVkLgotCSAqIGluY2x1ZGluZyBmdyBjb25maWcgZmlsZS4KLQkgKiAKLQkgKiAyLiBJZiBmdyBjb25maWcgZmlsZSBpcyBub3Qgc3BlY2lmaWVkLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIAotCSAqIE90aGVyd2lzZSwgdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIGZ3IGNvbmZpZyBmaWxlLgotCSAqIAotCSAqIDMuIElmIGFueSBDb25maWd1cmF0b3JCdW5kbGUgaXMgaW5jbHVkZWQgaW4gdGhlIGJ1bmRsZSBsaXN0LAotCSAqIHJlYWQgYXBwcm9wcmlhdGUgY29uZmlndXJhdG9yIGNvbmZpZyBmaWxlIGJ5IAotCSAqIHtAbGluayBDb25maWd1cmF0b3JNYW5pcHVsYXRvciN1cGRhdGVCdW5kbGVzKE1hbmlwdWxhdG9yKX0sCi0JICogIHdoaWNoIHdpbGwgdXBkYXRlIHRoZSBwYXJhbWV0ZXIgYWJvdXQgaW5zdGFsbGVkIGJ1bmRsZXMgaW4gaXRzIAotCSAqICB7QGxpbmsgTWFuaXB1bGF0b3IjZ2V0Q29uZmlnRGF0YSgpfSBvYmplY3QuCi0JICogIAotCSAqIE1vc3Qgb2xkIHBhcmFtZXRlcnMgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoaXMgbWV0aG9kIGNhbGwuIAotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBJZiByZWFkaW5nIGluZm8gZnJvbSBjb25maWd1cmF0aW9uIGZpbGVzIGZhaWxzLiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIElmIGNvbmZpZyBmaWxlcyBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IHNlcnZpY2UgY3JlYXRlZCB0aGlzIG9iamVjdCBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtZXRob2QuIAotCSAqLwotCXZvaWQgbG9hZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHBhcmFtZXRlcnMgdGhhdCB0aGlzIG9iamVjdCBrZWVwcyBhdCB0aGF0IHRpbWUgaW50byBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIGZpbGVzLCAKLQkgKiB3aGljaCBpbmNsdWRlIGxhdW5jaGVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgZnJhbWV3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIGNvbmZpZ3VyYXRvciBjb25maWd1cmF0aW9uIGZpbGVzCi0JICogKGlmIHJlcXVpcmVkIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG9iamVjdCBzdXBwb3J0cyksIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZXR0aW5nIGFuZCBzaXR1YXRpb24uIAotCSAqIAotCSAqIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGNvbnRhaW5zIHRoZSBtYXR0ZXJzIG9mIGltcGxlbWVudGF0aW9uIGRldGFpbC4KLQkgKiBIb3dldmVyLCBpdCBpcyBhbiBleGFtcGxlIGhvdyBpdCB3b3Jrcy4KLQkgKiAKLQkgKiAxLiBpZiBhIGxhdW5jaGVyIGZpbGUgaXMgc2V0LAotCSAqIHRoZSBwYXJhbWV0ZXJzIHRvIGJlIHNhdmVkIGludG8gYSBMYXVuY2hlckNvbmZpZ0ZpbGUgd2lsbCBiZSBzYXZlZCBpbnRvIHRoZSBkZWZhdWx0IExhdW5jaGVyQ29uZmlnRmlsZQotCSAqIHRoYXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9jYXRpb24gb2YgdGhlIGxhdW5jaGVyIGZpbGUuCi0JICogCi0JICogCi0JICogMi4gaWYgdGhlcmUgYXJlIGFueSB7QGxpbmsgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3J9IG9iamVjdHMgYXZhaWxhYmxlIHdob3NlIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yQnVuZGxlCi0JICogaXMgc2V0IHRvIGJlIHN0YXJ0ZWQsIGNob29zZSB0aGUgQ29uZmlndXJhdG9yQnVkbmxlIHRoYXQgc3RhcnRzIHRoZSBmaXJzdCBhbW9uZyB0aGVtIGFuZCBnbyB0byBuZXh0IHN0ZXAuCi0JICogT3RoZXJ3aXNlLCBzYXZlIHRoZSBCdW5kbGVJbmZvW10gc2V0IHRvIHRoaXMgb2JqZWN0IGludG8gYSBGd0NvbmZpZ0ZpbGUgdGhhdCBpcyBkZXRlcm1pbmVkCi0JICogYnkgdGhlIHBhcmFtZXRlcnMgc2V0LiAKLQkgKiAgCi0JICogMy4gY2FsbCB7QGxpbmsgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3Ijc2F2ZShNYW5pcHVsYXRvciwgYm9vbGVhbil9IG9mIAotCSAqIHRoZSBDb25maWd1cmF0b3JNYW5pcHVsYXRvciB0aGF0IGNhbiBtYW5pcHVsYXRlIHRoZSBjaG9zZW4gQ29uZmlndXJhdG9yQnVkbmxlLiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNhdmUgY29uZmlndXJhdGlvbnMgZm9yIENvbmZpZ3VyYXRvckJ1bmRsZSB0byByZWFkIGFwcHJvcHJpYXRlbHkgIAotCSAqIGFuZCByZXR1cm4gQnVuZGxlSW5mb1tdIHRvIGJlIHNhdmVkIGluIHRoZSBGd0NvbmZpZ0ZpbGUsIHdoaWNoIGlzIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgc2V0LgotCSAqIAotCSAqIDQuIFNhdmUgdGhlIHJldHVybmVkIEJ1bmRsZUluZm9bXSBpbiB0aGUgRndDb25maWdGaWxlLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHNldC4KLQkgKiAJICAgCi0JICogQHBhcmFtIGJhY2t1cCAtIGlmIHRydWUsIGtlZXAgb2xkIGZpbGUgYnkgcmVuYW1pbmcgaWYgZXhpc3RzLiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gSWYgd3JpdGluZyBpbmZvIGludG8gY29uZmlndXJhdGlvbiBmaWxlcyBmYWlscy4gCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gLSBJZiB0aGUge0BsaW5rIEZyYW1ld29ya0FkbWlufSBzZXJ2aWNlIGNyZWF0ZWQgdGhpcyBvYmplY3QgaXMgdW5yZWdpc3RlcmVkIG9yIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMgbWV0aG9kLiAKLQkgKi8KLQl2b2lkIHNhdmUoYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29weSBhbGwgaW5mb3JtYXRpb24gdGhlIHNwZWNpZmllZCB7QGxpbmsgQ29uZmlnRGF0YX0gY29udGFpbnMgaW50byB0aGlzIG9iamVjdC4KLQkgKiBBbGwgb2Ygb2xkIHNldHRpbmdzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdEYXRhIGZ3IGNvbmZpZyBkYXRhIHRvIGJlIHNldCB0byB0aGlzIG9iamVjdC4KLQkgKi8KLQl2b2lkIHNldENvbmZpZ0RhdGEoQ29uZmlnRGF0YSBjb25maWdEYXRhKTsKLQotCS8qKgotCSAqIENvcHkgYWxsIGluZm9ybWF0aW9uIHRoZSBzcGVjaWZpZWQge0BsaW5rIExhdW5jaGVyRGF0YX0gY29udGFpbnMgaW50byB0aGlzIG9iamVjdC4KLQkgKiBBbGwgb2Ygb2xkIHNldHRpbmdzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hlckRhdGEgbGF1bmNoZXIgY29uZmlnIGRhdGEgdG8gYmUgc2V0IHRvIHRoaXMgb2JqZWN0LgotCSAqLwotCXZvaWQgc2V0TGF1bmNoZXJEYXRhKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDI2MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRjOTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTQgMTI6NDk6MjkgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU5ZWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0jTW9uIE5vdiAwNSAxNjo1MzozMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDBlNGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jTW9uIE5vdiAwNSAxNjo1MzozMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRlMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IGllLndvbWJhdC5qYmRpZmYsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5hcHA7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhciwKLSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3NvciwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTg1MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9vcHRpbWl6ZXIubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvb3B0aW1pemVyLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViZjkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9vcHRpbWl6ZXIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL29wdGltaXplciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9qcmUxLjYuMCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAtY29uc29sZWxvZyAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDBvcHRpbWl6ZXImIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmQ6L3Byb3YvcmVwbyYjMTM7JiMxMDstY29uc29sZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2lAOixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0iaWUud29tYmF0LmpiZGlmZkBkZWZhdWx0OmRlZmF1bHQsb3JnLmFwYWNoZS54ZXJjZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5hcGFjaGUueG1sLnJlc29sdmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2ZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2OTdlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBwMiBBcnRpZmFjdCBPcHRpbWl6ZXJzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMGU0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCTxleHRlbnNpb24gaWQ9ImphcmRlbHRhb3B0aW1pemVyIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+IAotICAgICAgPGFwcGxpY2F0aW9uPiAKLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYXJkZWx0YS5BcHBsaWNhdGlvbiIvPiAKLSAgICAgIDwvYXBwbGljYXRpb24+IAotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIGlkPSJwYWNrMjAwb3B0aW1pemVyIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+IAotICAgICAgPGFwcGxpY2F0aW9uPiAKLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwLkFwcGxpY2F0aW9uIi8+IAotICAgICAgPC9hcHBsaWNhdGlvbj4gCi0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gaWQ9ImpiZGlmZm9wdGltaXplciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPiAKLSAgICAgIDxhcHBsaWNhdGlvbj4gCi0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamJkaWZmLkFwcGxpY2F0aW9uIi8+IAotICAgICAgPC9hcHBsaWNhdGlvbj4gCi0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gaWQ9IlBhY2syMDBPcHRpbWl6ZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwLlBhY2syMDBPcHRpbWl6ZXJTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIGlkPSJKYXJEZWx0YU9wdGltaXplciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhLkphckRlbHRhT3B0aW1pemVyU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBpZD0iSkJEaWZmU3RlcCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIGlkPSJKQkRpZmZaaXBTdGVwIiBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamJkaWZmLkpCRGlmZlppcFN0ZXAiLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL0Fic3RyYWN0QnVmZmVyaW5nU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViNDFiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL0Fic3RyYWN0QnVmZmVyaW5nU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnVmZmVyaW5nU3RlcCBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfU1VGRklYID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DT01JTkdfUk9PVCA9ICJwMi5vcHRpbWl6ZXJzLmluY29taW5nIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9ST09UID0gInAyLm9wdGltaXplcnMucmVzdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRURFQ0VTU09SX1JPT1QgPSAicDIub3B0aW1pemVycy5wcmVkZWNlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gaW5jb21pbmdTdHJlYW07Ci0JcHJpdmF0ZSBGaWxlIHdvcmtEaXI7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RCdWZmZXJpbmdTdGVwKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gc3RyZWFtID0gZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCXN0cmVhbS53cml0ZShiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbmNvbWluZ1N0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIGluY29taW5nU3RyZWFtOwotCQkvLyBpZiBidWZmZXJpbmcsIHN0b3JlIGlucHV0IHN0cmVhbSBpbiB0ZW1wb3JhcnkgZmlsZQotCQlpbmNvbWluZ1N0cmVhbSA9IGNyZWF0ZUluY29taW5nU3RyZWFtKCk7Ci0JCXJldHVybiBpbmNvbWluZ1N0cmVhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT3V0cHV0U3RyZWFtIGNyZWF0ZUluY29taW5nU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBXaGVuIHdlIGdvIHRvIGNsb3NlIHdlIG11c3QgaGF2ZSBzZWVuIGFsbCB0aGUgY29udGVudCB3ZSBhcmUgZ29pbmcgdG8gc2VlLgotCQkvLyBJZiBubyBvbmUgd3JvdGUgdG8gdGhlIHRlbXAgc3RyZWFtIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gSWYgdGhlcmUgaXMgCi0JCS8vIGNvbnRlbnQgdGhlbiBjbG9zZSB0aGUgdGVtcG9yYXJ5IHN0cmVhbSBhbmQgcGVyZm9ybSB0aGUgb3B0aW1pemF0aW9uLgotCQkvLyBQZXJmb3JtaW5nIHRoZSBvcHRpbWl6YXRpb24gc2hvdWxkIHJlc3VsdCBpbiB0aGUgbmV3IGNvbnRlbnQgYmVpbmcgd3JpdHRlbiB0byAKLQkJLy8gdGhlIGRlc3RpbmF0aW9uLiAgTWFrZSBzdXJlIHdlIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaWYgYW55LgotCQl0cnkgewotCQkJaWYgKGluY29taW5nU3RyZWFtICE9IG51bGwpIHsKLQkJCQlpbmNvbWluZ1N0cmVhbS5jbG9zZSgpOwotCQkJCXBlcmZvcm1Qcm9jZXNzaW5nKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpbmNvbWluZ1N0cmVhbSA9IG51bGw7Ci0JCQljbGVhbnVwVGVtcEZpbGVzKCk7Ci0JCQljbGVhbnVwV29ya0RpcigpOwotCQl9Ci0KLQkJc3VwZXIuY2xvc2UoKTsKLQkJLy8gVE9ETyBuZWVkIHRvIGdldCByZWFsIHN0YXR1cyBoZXJlLiAgc29tZXRpbWVzIHRoZSBvcHRpbWl6ZXJzIGRvIG5vdCBnaXZlIAotCQkvLyBhbnkgcmVhc29uYWJsZSByZXR1cm4gc3RhdHVzCi0JCS8vIENPTU1FTlQgc3RhdHVzIGlzIGluaXRpYWxseSBzZXQgdG8gT0shCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGVtcEZpbGVzKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbnVwV29ya0RpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh3b3JrRGlyICE9IG51bGwpIHsKLQkJCUZpbGVVdGlscy5kZWxldGVBbGwod29ya0Rpcik7Ci0JCQkvLyBUT0RPIHRyeSB0d2ljZSBzaW5jZSB0aGVyZSBzZWVtcyB0byBiZSBzb21lIGNhc2VzIHdoZXJlIHRoZSBkaXIgaXMgbm90IAotCQkJLy8gZGVsZXRlZCB0aGUgZmlyc3QgdGltZS4gIEF0IGxlYXN0IG9uIFdpbmRvd3MuLi4KLQkJCUZpbGVVdGlscy5kZWxldGVBbGwod29ya0Rpcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRXb3JrRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHdvcmtEaXIgIT0gbnVsbCkKLQkJCXJldHVybiB3b3JrRGlyOwotCQl3b3JrRGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgid29yayIsICIiKTsKLQkJaWYgKCF3b3JrRGlyLmRlbGV0ZSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgZGVsZXRlIGZpbGUgZm9yIGNyZWF0aW5nIHRlbXBvcmFyeSB3b3JraW5nIGRpci4iKTsKLQkJaWYgKCF3b3JrRGlyLm1rZGlycygpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSB3b3JraW5nIGRpci4iKTsKLQkJcmV0dXJuIHdvcmtEaXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdERlbHRhU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdERlbHRhU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMyMWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvQWJzdHJhY3REZWx0YVN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogVGhlIDxjb2RlPkFic3RyYWN0RGVsdGFEaWZmU3RlcDwvY29kZT4gaXMgYW4gYWJzdHJhY3QgcHJvY2Vzc2luZyBzdGVwIHRoYXQKLSAqIHJldHJpZXZlcyBhIGxvY2FsIGFydGlmYWN0IHJlcG9zaXRvcnkgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZC9lbmNvZGVkCi0gKiBhcnRpZmFjdCBrZXkuIEl0IGFzc3VtZXMgdGhhdCB0aGUgYXJ0aWZhY3Qga2V5IGlzIHN0b3JlZCB3aXRoaW4gdGhlIGRhdGEgcHJvcGVydHkKLSAqIG9mIHRoZSBwcm9jZXNzaW5nIHN0ZXAgZGVzY3JpcHRvciBhbmQgdGhhdCBpcyBlbmNvZGVkIHdpdGggdGhlIDxjb2RlPkFydGlmYWN0S2V5U2VyaWFsaXplcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERlbHRhU3RlcCBleHRlbmRzIEFic3RyYWN0QnVmZmVyaW5nU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgSUFydGlmYWN0S2V5IGtleTsKLQlwcm90ZWN0ZWQgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCi0JcHVibGljIEFic3RyYWN0RGVsdGFTdGVwKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdERlbHRhU3RlcChJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQkJcmVhZEFydGlmYWN0S2V5KGRlc2NyaXB0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlYWRBcnRpZmFjdEtleShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0cnkgewotCQkJa2V5ID0gQXJ0aWZhY3RLZXkucGFyc2UoZGVzY3JpcHRvci5nZXREYXRhKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiUHJlZGVjZXNzb3IgYXJ0aWZhY3Qga2V5IGZvciBkZWx0YSBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkLiBTZXJpYWxpemVkIGtleSBpcyAiICsgZGVzY3JpcHRvci5nZXREYXRhKCksIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIGZldGNoUHJlZGVjZXNzb3IoQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkKLQkJCXJldHVybiAoKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSByZXBvc2l0b3J5KS5nZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JCUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoUFJFREVDRVNTT1JfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCQkJcmVzdWx0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlc3VsdCkpOwotCQkJCXNldFN0YXR1cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0KGRlc2NyaXB0b3IsIHJlc3VsdFN0cmVhbSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVzdWx0U3RyZWFtICE9IG51bGwpCi0JCQkJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDBlYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9WZXJzaW9ubGVzc0FydGlmYWN0S2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL1ZlcnNpb25sZXNzQXJ0aWZhY3RLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMjczOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL1ZlcnNpb25sZXNzQXJ0aWZhY3RLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFZlcnNpb25sZXNzQXJ0aWZhY3RLZXkgZXh0ZW5kcyBBcnRpZmFjdEtleSB7Ci0KLQlwdWJsaWMgVmVyc2lvbmxlc3NBcnRpZmFjdEtleShTdHJpbmcgY2xhc3NpZmllciwgU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGNsYXNzaWZpZXIsIGlkLCBWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIFZlcnNpb25sZXNzQXJ0aWZhY3RLZXkoSUFydGlmYWN0S2V5IGJhc2UpIHsKLQkJc3VwZXIoYmFzZS5nZXRDbGFzc2lmaWVyKCksIGJhc2UuZ2V0SWQoKSwgVmVyc2lvbi5lbXB0eVZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoYXNoID0gZ2V0SWQoKS5oYXNoQ29kZSgpOwotCQloYXNoID0gMTcgKiBoYXNoICsgZ2V0Q2xhc3NpZmllcigpLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIElBcnRpZmFjdEtleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlBcnRpZmFjdEtleSBhayA9IChJQXJ0aWZhY3RLZXkpIG9iajsKLQkJcmV0dXJuIGFrLmdldElkKCkuZXF1YWxzKGdldElkKCkpICYmIGFrLmdldENsYXNzaWZpZXIoKS5lcXVhbHMoZ2V0Q2xhc3NpZmllcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYXJkZWx0YS9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYXJkZWx0YS9BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA2OTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamFyZGVsdGE7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG9wdGltaXplciA8Y29kZT5BcHBsaWNhdGlvbjwvY29kZT4gZm9yIEpCRGlmZiBiYXNlZCBvcHRpbWl6YXRpb25zLiAKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCXByaXZhdGUgVVJMIGFydGlmYWN0UmVwb3NpdG9yeUxvY2F0aW9uOwotCXByaXZhdGUgaW50IHdpZHRoID0gMTsKLQlwcml2YXRlIGludCBkZXB0aCA9IDE7Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBzZXR1cFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24pOwotCQluZXcgT3B0aW1pemVyKHJlcG9zaXRvcnksIHdpZHRoLCBkZXB0aCkucnVuKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBzZXR1cFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQkvLyBUT0RPIGxvZyBoZXJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8geWV0Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCQkJLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1wYWNrIikpCi0JCQkvLwkJCQlwYWNrID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgCi0JCQkvLyBpZiB0aGUgbmV4dCBvbmUgaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSAKLQkJCS8vIGFuIGFyZyB3aXRoIGEgcGFyYW0gc28gY29udGludWUuCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWFydGlmYWN0UmVwb3NpdG9yeSIpIHx8IGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbiA9IG5ldyBVUkwoYXJnKTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1kZXB0aCIpKSAvLyROT04tTkxTLTEkCi0JCQkJZGVwdGggPSBJbnRlZ2VyLnBhcnNlSW50KGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItd2lkdGgiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXdpZHRoID0gSW50ZWdlci5wYXJzZUludChhcmcpOwotCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0RlbHRhQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvRGVsdGFDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyODNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvRGVsdGFDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamFyZGVsdGE7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1wdWJsaWMgY2xhc3MgRGVsdGFDb21wdXRlciB7Ci0JcHJpdmF0ZSBGaWxlIHRhcmdldDsKLQlwcml2YXRlIEZpbGUgYmFzZTsKLQlwcml2YXRlIEZpbGUgZGVzdGluYXRpb247Ci0JcHJpdmF0ZSBaaXBGaWxlIGJhc2VKYXI7Ci0JcHJpdmF0ZSBaaXBGaWxlIHRhcmdldEphcjsKLQlwcml2YXRlIFNldCBiYXNlRW50cmllczsKLQlwcml2YXRlIEFycmF5TGlzdCBhZGRpdGlvbnM7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hhbmdlczsKLQlwcml2YXRlIFppcEZpbGUgbWFuaWZlc3RKYXIgPSBudWxsOwotCi0JcHVibGljIERlbHRhQ29tcHV0ZXIoRmlsZSBiYXNlLCBGaWxlIHRhcmdldCwgRmlsZSBkZXN0aW5hdGlvbikgewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoIW9wZW5KYXJzKCkpCi0JCQkJcmV0dXJuOwotCQkJY29tcHV0ZURlbHRhKCk7Ci0JCQl3cml0ZURlbHRhKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zZUphcnMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZURlbHRhKCkgewotCQlaaXBPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbikpOwotCQkJCS8vIGlmIHRoZSBkZWx0YSBpbmNsdWRlcyB0aGUgbWFuaWZlc3QsIGJlIHN1cmUgdG8gd3JpdGUgaXQgZmlyc3QKLQkJCQlpZiAobWFuaWZlc3RKYXIgIT0gbnVsbCkKLQkJCQkJd3JpdGVFbnRyeShyZXN1bHQsIG1hbmlmZXN0SmFyLmdldEVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpLCBtYW5pZmVzdEphciwgdHJ1ZSk7Ci0JCQkJLy8gd3JpdGUgb3V0IHRoZSByZW1vdmFscy4gIFRoZXNlIGFyZSBhbGwgdGhlIGVudHJpZXMgbGVmdCBpbiB0aGUgYmFzZUVudHJpZXMKLQkJCQkvLyBzaW5jZSB0aGV5IHdlcmUgbm90IHNlZW4gaW4gdGhlIHRhcmdldEphci4gIEhlcmUganVzdCB3cml0ZSBvdXQgYW4gZW1wdHkKLQkJCQkvLyBlbnRyeSB3aXRoIGEgbmFtZSB0aGF0IHNpZ25hbHMgdGhlIGRlbHRhIHByb2Nlc3NvciB0byBkZWxldGUuCi0JCQkJZm9yIChJdGVyYXRvciBpID0gYmFzZUVudHJpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJCQl3cml0ZUVudHJ5KHJlc3VsdCwgbmV3IFppcEVudHJ5KCgoU3RyaW5nKSBpLm5leHQoKSkgKyAiLmRlbGV0ZSIpLCBudWxsLCBmYWxzZSk7Ci0JCQkJLy8gd3JpdGUgb3V0IHRoZSBhZGRpdGlvbnMuCi0JCQkJZm9yIChJdGVyYXRvciBpID0gYWRkaXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQkJd3JpdGVFbnRyeShyZXN1bHQsIChaaXBFbnRyeSkgaS5uZXh0KCksIHRhcmdldEphciwgZmFsc2UpOwotCQkJCS8vIHdyaXRlIG91dCB0aGUgY2hhbmdlcy4KLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQkJd3JpdGVFbnRyeShyZXN1bHQsIChaaXBFbnRyeSkgaS5uZXh0KCksIHRhcmdldEphciwgZmFsc2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCXJlc3VsdC5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRW50cnkoWmlwT3V0cHV0U3RyZWFtIHJlc3VsdCwgWmlwRW50cnkgZW50cnksIFppcEZpbGUgc291cmNlSmFyLCBib29sZWFuIG1hbmlmZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIW1hbmlmZXN0ICYmIGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpKQotCQkJcmV0dXJuOwotCQkvLyBhZGQgdGhlIGVudHJ5Ci0JCXJlc3VsdC5wdXROZXh0RW50cnkoZW50cnkpOwotCQl0cnkgewotCQkJLy8gaWYgdGhlcmUgaXMgYSBzb3VyY2VKYXIgY29weSBvdmVyIHRoZSBjb250ZW50IGZvciB0aGUgZW50cnkgaW50byB0aGUgcmVzdWx0Ci0JCQlpZiAoc291cmNlSmFyICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IHNvdXJjZUphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJhbnNmZXJTdHJlYW1zKGNvbnRlbnRzLCByZXN1bHQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcmVzdWx0LmNsb3NlRW50cnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zZmVycyBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0byB0aGUgZ2l2ZW4KLQkgKiBvdXRwdXQgc3RyZWFtLiBEb2VzIG5vdCBjbG9zZSBlaXRoZXIgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZmVyU3RyZWFtcyhJbnB1dFN0cmVhbSBzb3VyY2UsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc291cmNlID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJZGVzdGluYXRpb24gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pOwotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gLTE7Ci0JCQkJaWYgKChieXRlc1JlYWQgPSBzb3VyY2UucmVhZChidWZmZXIpKSA9PSAtMSkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGVzdGluYXRpb24uZmx1c2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlRGVsdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZGRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIHN0YXJ0IG91dCBhc3N1bWluZyB0aGF0IGFsbCB0aGUgYmFzZSBlbnRyaWVzIGFyZSBiZWluZyByZW1vdmVkCi0JCWJhc2VFbnRyaWVzID0gZ2V0RW50cmllcyhiYXNlSmFyKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gdGFyZ2V0SmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspCi0JCQljaGVjaygoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKSwgdGFyZ2V0SmFyKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3BlbkphcnMoKSB7Ci0JCXRyeSB7Ci0JCQliYXNlSmFyID0gbmV3IFppcEZpbGUoYmFzZSk7Ci0JCQl0YXJnZXRKYXIgPSBuZXcgWmlwRmlsZSh0YXJnZXQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSmFycygpIHsKLQkJaWYgKGJhc2VKYXIgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJYmFzZUphci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQlpZiAodGFyZ2V0SmFyICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXRhcmdldEphci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCX0KLQotCS8qKiAKLQkgKiBDb21wYXJlIHRoZSBnaXZlbiBlbnRyeSBhZ2FpbnN0IHRoZSBiYXNlIEpBUiB0byBzZWUgaWYvaG93IGl0IGRpZmZlcnMuICBVcGRhdGUgdGhlIGFwcHJvcHJpYXRlIHNldAotCSAqIGJhc2VkIG9uIHRoZSBkaXNjb3ZlcmVkIGRpZmZlcmVuY2UuCi0JICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeSB0byB0ZXN0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2soWmlwRW50cnkgZW50cnksIFppcEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgYmFzZUVudHJ5ID0gYmFzZUphci5nZXRFbnRyeShlbnRyeS5nZXROYW1lKCkpOwotCi0JCS8vIHJlbWVtYmVyIHRoZSBtYW5pZmVzdCBpZiB3ZSBzZWUgaXQKLQkJY2hlY2tGb3JNYW5pZmVzdChlbnRyeSwgZmlsZSk7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIGVudHJ5IHRoZW4gdGhpcyBpcyBhbiBhZGRpdGlvbi4gIHJlbWVtYmVyIHRoZSBhZGRpdGlvbiBhbmQgcmV0dXJuOwotCQlpZiAoYmFzZUVudHJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9ucy5hZGQoZW50cnkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG5vdyB3ZSBrbm93IGVhY2ggSkFSIGhhcyBhbiBlbnRyeSBmb3IgdGhlIG5hbWUsIGNvbXBhcmUgYW5kIHNlZSBob3cvaWYgdGhleSBkaWZmZXIKLQkJYm9vbGVhbiBjaGFuZ2VkID0gIWVxdWFscyhlbnRyeSwgYmFzZUVudHJ5KTsKLQkJaWYgKGNoYW5nZWQpCi0JCQljaGFuZ2VzLmFkZChlbnRyeSk7Ci0JCWJhc2VFbnRyaWVzLnJlbW92ZShiYXNlRW50cnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyBjb21wYXJlIHRoZSB0d28gZW50cmllcy4gIFdlIGFscmVhZHkga25vdyB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lLgotCXByaXZhdGUgYm9vbGVhbiBlcXVhbHMoWmlwRW50cnkgZW50cnksIFppcEVudHJ5IGJhc2VFbnRyeSkgewotCQlpZiAoZW50cnkuZ2V0U2l6ZSgpICE9IGJhc2VFbnRyeS5nZXRTaXplKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgZW50cmllcyBhcmUgb2YgdGhlIHNhbWUgdHlwZQotCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAhPSBiYXNlRW50cnkuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gaWYgdGhlIGVudHJpZXMgYXJlIGZpbGVzIHRoZW4gY29tcGFyZSB0aGUgdGltZXMuCi0JCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkKLQkJCWlmIChlbnRyeS5nZXRUaW1lKCkgIT0gYmFzZUVudHJ5LmdldFRpbWUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgU2V0IGdldEVudHJpZXMoWmlwRmlsZSBqYXIpIHsKLQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldChqYXIuc2l6ZSgpKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gamFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQljaGVja0Zvck1hbmlmZXN0KGVudHJ5LCBqYXIpOwotCQkJcmVzdWx0LmFkZChlbnRyeS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBnaXZlbiBlbnRyeSBpcyB0aGUgbWFuaWZlc3QuICBJZiBzbywgcmVtZW1iZXIgaXQgZm9yIHVzZSB3aGVuIHdyaXRpbmcKLQkgKiB0aGUgcmVzdWx0YW50IEpBUi4KLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAcGFyYW0gamFyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yTWFuaWZlc3QoWmlwRW50cnkgZW50cnksIFppcEZpbGUgamFyKSB7Ci0JCWlmIChlbnRyeS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkKLQkJCW1hbmlmZXN0SmFyID0gamFyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvSmFyRGVsdGFPcHRpbWl6ZXJTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0phckRlbHRhT3B0aW1pemVyU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTdiNWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvSmFyRGVsdGFPcHRpbWl6ZXJTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYXJkZWx0YTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BYnN0cmFjdERlbHRhU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0vKioKLSAqIFRoZSBKQVIgZGVsdGEgZXhwZWN0cyBhbiBpbnB1dCBjb250YWluaW5nIG5vcm1hbCAiLmphciIgZGF0YS4gICAKLSAqLwotcHVibGljIGNsYXNzIEphckRlbHRhT3B0aW1pemVyU3RlcCBleHRlbmRzIEFic3RyYWN0RGVsdGFTdGVwIHsKLQotCXByaXZhdGUgRmlsZSBpbmNvbWluZzsKLQotCXByb3RlY3RlZCBKYXJEZWx0YU9wdGltaXplclN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXN1cGVyKHJlcG9zaXRvcnkpOwotCX0KLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlSW5jb21pbmdTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbmNvbWluZyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoSU5DT01JTkdfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5jb21pbmcpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGVtcEZpbGVzKCkgewotCQlzdXBlci5jbGVhbnVwVGVtcEZpbGVzKCk7Ci0JCWlmIChpbmNvbWluZyAhPSBudWxsKQotCQkJaW5jb21pbmcuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJlc3VsdEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0RmlsZSA9IG9wdGltaXplKCk7Ci0JCQkvLyBub3cgd3JpdGUgdGhlIG9wdGltaXplZCBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbgotCQkJaWYgKHJlc3VsdEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSW5wdXRTdHJlYW0gcmVzdWx0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXN1bHRGaWxlKSk7Ci0JCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0ocmVzdWx0U3RyZWFtLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVtcHR5IG9wdGltaXplZCBmaWxlOiAiICsgcmVzdWx0RmlsZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzdWx0RmlsZSAhPSBudWxsKQotCQkJCXJlc3VsdEZpbGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBvcHRpbWl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgcHJlZGVjZXNzb3IgPSBudWxsOwotCQl0cnkgewotCQkJRmlsZSByZXN1bHRGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShSRVNVTFRfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCQkvLyBnZXQgdGhlIHByZWRlY2Vzc29yIGFuZCBwZXJmb3JtIHRoZSBvcHRpbWl6YXRpb24gaW50byBhIHRlbXAgZmlsZQotCQkJcHJlZGVjZXNzb3IgPSBmZXRjaFByZWRlY2Vzc29yKG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KSk7Ci0JCQluZXcgRGVsdGFDb21wdXRlcihwcmVkZWNlc3NvciwgaW5jb21pbmcsIHJlc3VsdEZpbGUpLnJ1bigpOwotCQkJcmV0dXJuIHJlc3VsdEZpbGU7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgcHJlZGVjZXNzb3IgYW5kIGl0IGlzIG91ciB0ZW1wIGZpbGUgdGhlbiBjbGVhbiB1cCB0aGUgZmlsZQotCQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwgJiYgcHJlZGVjZXNzb3IuZ2V0QWJzb2x1dGVQYXRoKCkuaW5kZXhPZihQUkVERUNFU1NPUl9ST09UKSA+IC0xKQotCQkJCXByZWRlY2Vzc29yLmRlbGV0ZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvT3B0aW1pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL09wdGltaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I2ZGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvT3B0aW1pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBhZGFwdGF0aW9uIHRvIEpBUiBkZWx0YXMgYW5kIG9uLWdvaW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamFyZGVsdGE7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgT3B0aW1pemVyIHsKLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCXByaXZhdGUgaW50IHdpZHRoOwotCXByaXZhdGUgaW50IGRlcHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9ERUxUQV9GT1JNQVQgPSAiamFyRGVsdGEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9ERUxUQV9QQVRDSF9TVEVQID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5KYXJEZWx0YVBhdGNoU3RlcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgQVJUSUZBQ1RfREVTQ1JJUFRPUl9WRVJTSU9OX0NPTVBBUkFUT1IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yVmVyc2lvbkNvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIEFSVElGQUNUX0tFWV9WRVJTSU9OX0NPTVBBUkFUT1IgPSBuZXcgQXJ0aWZhY3RLZXlWZXJzaW9uQ29tcGFyYXRvcigpOwotCi0JLyoqCi0JICogVGhpcyBvcHRpbWl6ZXIgcGVyZm9ybXMgZGVsdGEgZ2VuZXJhdGlvbiBiYXNlZCBvbiAoY3VycmVudGx5KSBqYmRpZmYuIAotCSAqIFRoZSBvcHRpbWl6YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgtHdpZHRotCBhbmQgdGhlILRkZXB0aLQgcGFyYW1ldGVyLgotCSAqILR3aWR0aLQgZGVmaW5lcyBmb3IgaG93IG1hbnkgtHJlbGF0ZWS0IGFydGlmYWN0IGtleXMgYSBkZWx0YSBzaG91bGQgYmUgZ2VuZXJhdGVkLAotCSAqIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgdXAtdG8tZGF0ZS4KLQkgKiC0ZGVwdGi0IGRlZmluZXMgdG8gaG93IG1hbnkgcHJlZGVjZXNzb3IgYSBkZWx0YSBzaG91bGQgYmUgZ2VuZXJhdGVkLgotCSAqIAotCSAqIFdpdGggQUsoYy12KSA6IEFLIC0gYXJ0aWZhY3Qga2V5LCBjIC0gYXJ0aWZhY3QgaWQsIHYgLSBhcnRpZmFjdCB2ZXJzaW9uCi0JICogdGhlILRyZXBvc2l0b3J5IGNvbnRlbnS0IGNhbiBiZSB2aWV3ZWQgYSB0d28gZGltZW5zaW9uYWwgYXJyYXksIHdoZXJlIHRoZQotCSAqIGFydGlmYWN0IGtleXMgZm9yIHRoZSBzYW1lIGNvbXBvbmVudCBhcmUgaW4gb3JkZXIgb2YgdGhlaXIgdmVyc2lvbjogCi0JICogPHByZT48Y29kZT4KLQkgKiAgICAgdz0xICAgICAgIHc9MgotCSAqICAgICAgfCAgICAgICAgfAotCSAqICAgICAgfCArLS0tLS0tLi0tLS0tLS0tLS0tLSsgZD0yCi0JICogICAgICB8IHwgKy0tLS0uLS0tKyBkPTEgICAgfAotCSAqICAgICAgfCB8IHwgICAgfCAgIHwgICAgICAgIHYKLQkgKiBbICAgIHYgfCB8ICAgIHYgICB2ICAgICAgICB2Ci0JICogWyBBSyh4LDIuMCkgQUsoeCwxLjUpIEFLKHgsMS4xKSBdCi0JICogWyBBSyh5LDIuMCkgQUsoeSwxLjkpIF0KLQkgKiBbIEFLKHosMi4wKSBBSyh6LDEuNSkgQUsoeiwxLjMpIEFLKHosMS4wKSBdCi0JICogXQotCSAqIDwvY29kZT48L3ByZT4gIAotCSAqIEUuZzogd2l0aCBhILR3aWR0aLQgb2Ygb25lIGFuZCBhILRkZXB0aLQgb2YgdHdvIHRoZSBvcHRpbWl6ZXIgd291bGQKLQkgKiBjcmVhdGUgdHdvIGRlbHRhcyBmb3IgY29tcG9uZW50ILR4tCBmcm9tIDEuNSB0byAyLjAgYW5kIGZyb20gMS4xIHRvIDIuMC4gICAgCi0JICogCi0JICogQHBhcmFtIHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKi8KLQlwdWJsaWMgT3B0aW1pemVyKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgaW50IHdpZHRoLCBpbnQgZGVwdGgpIHsKLQkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmRlcHRoID0gZGVwdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIGRlbHRhIChqYXJkZWx0YSkgb3B0aW1pemF0aW9ucyAod2lkdGg9IiArIHdpZHRoICsgIiwgZGVwdGg9IiArIGRlcHRoICsgIikiKTsKLQkJSUFydGlmYWN0S2V5W11bXSBrZXlzID0gZ2V0U29ydGVkUmVsYXRlZEFydGlmYWN0S2V5cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0S2V5cygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoa2V5c1tpXS5sZW5ndGggPCAyKQotCQkJCS8vIE5vdGhpbmcgdG8gZGlmZiBoZXJlIQotCQkJCWNvbnRpbnVlOwotCQkJaW50IG1pbldpZHRoID0gTWF0aC5taW4od2lkdGgsIGtleXNbaV0ubGVuZ3RoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWluV2lkdGg7IGorKykgewotCQkJCUlBcnRpZmFjdEtleSBrZXkgPSBrZXlzW2ldW2pdOwotCQkJCWJvb2xlYW4gaXNBcmNoaXZlID0ga2V5LmdldENsYXNzaWZpZXIoKS5lcXVhbHMoInBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJb3B0aW1pemUoa2V5c1tpXSwga2V5KTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUuIik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3B0aW1pemUoSUFydGlmYWN0S2V5W10ga2V5cywgSUFydGlmYWN0S2V5IGtleSkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0RGVzY3JpcHRvcnMoa2V5KTsKLQkJSUFydGlmYWN0RGVzY3JpcHRvciBjYW5vbmljYWwgPSBudWxsOwotCQlmb3IgKGludCBrID0gMDsgayA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaysrKSB7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1trXTsKLQkJCWJvb2xlYW4gb3B0aW1pemVkID0gZmFsc2U7Ci0JCQlpZiAoaXNDYW5vbmljYWwoZGVzY3JpcHRvcikpCi0JCQkJY2Fub25pY2FsID0gZGVzY3JpcHRvcjsKLQkJCWVsc2UKLQkJCQlvcHRpbWl6ZWQgfD0gaXNPcHRpbWl6ZWQoZGVzY3JpcHRvcik7Ci0JCQlpZiAoIW9wdGltaXplZCkKLQkJCQlvcHRpbWl6ZShjYW5vbmljYWwsIGtleXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXkgZ2V0VmVyc2lvbmxlc3NLZXkoSUFydGlmYWN0S2V5IGtleSkgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0S2V5KGtleS5nZXRDbGFzc2lmaWVyKCksIGtleS5nZXRJZCgpLCBWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGEgbGlzdCBvZiBsaXN0IG9mIElBcnRpZmFjdEtleXMuIFRoZSBhcnRpZmFjdCBrZXlzIGluIHRoZQotCSAqIGxpc3Qgb2YgYXJ0aWZhY3Qga2V5cyBhcmUgYWxsILRzdHJvbmdseSByZWxhdGVktCB0byBlYWNoIG90aGVyIHN1Y2ggdGhhdCBhcmUgIAotCSAqIGVxdWFsIGJ1dCBub3QgY29uc2lkZXJpbmcgdGhlIHZlcnNpb25zLiBUaGlzIGxpc3QgaXMgc29ydGVkIHN1Y2ggdGhhdCB0aGUgCi0JICogbmV3ZXIgdmVyc2lvbnMgYXJlIGZpcnN0IGluIHRoZSBsaXN0LjxwPgotCSAqIFdpdGggQUsoYy12KSA6IEFLIC0gYXJ0aWZhY3Qga2V5LCBjIC0gYXJ0aWZhY3QgaWQsIHYgLSBhcnRpZmFjdCB2ZXJzaW9uCi0JICogdGhlIHJlc3VsdCBpcyB0aGFuLCBlLmcuCi0JICogPHByZT48Y29kZT4KLQkgKiBbCi0JICogWyBBSyh4LDIuMCkgQUsoeCwxLjUpIEFLKHgsMS4xKSBdCi0JICogWyBBSyh5LDIuMCkgQUsoeSwxLjkpIF0KLQkgKiBbIEFLKHosMi4wKSBBSyh6LDEuNSkgQUsoeiwxLjMpIEFLKHosMS4wKSBdCi0JICogXQotCSAqIDwvY29kZT48L3ByZT4gIAotCSAqIEBwYXJhbSBhcnRpZmFjdEtleXMKLQkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgYXJ0aWZhY3Qga2V5cwotCSAqLwotCXByaXZhdGUgSUFydGlmYWN0S2V5W11bXSBnZXRTb3J0ZWRSZWxhdGVkQXJ0aWZhY3RLZXlzKElBcnRpZmFjdEtleVtdIGFydGlmYWN0S2V5cykgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCUlBcnRpZmFjdEtleSBmcmVlS2V5ID0gZ2V0VmVyc2lvbmxlc3NLZXkoYXJ0aWZhY3RLZXlzW2ldKTsKLQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIG1hcC5nZXQoZnJlZUtleSk7Ci0JCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCQl2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbWFwLnB1dChmcmVlS2V5LCB2YWx1ZXMpOwotCQkJfQotCQkJdmFsdWVzLmFkZChhcnRpZmFjdEtleXNbaV0pOwotCQl9Ci0JCUlBcnRpZmFjdEtleVtdW10gbGlzdHMgPSBuZXcgSUFydGlmYWN0S2V5W21hcC5zaXplKCldW107Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IGFydGlmYWN0S2V5TGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSByZWxhdGVkQXJ0aWZhY3RLZXlzID0gKElBcnRpZmFjdEtleVtdKSBhcnRpZmFjdEtleUxpc3QudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W2FydGlmYWN0S2V5TGlzdC5zaXplKCldKTsKLQkJCUFycmF5cy5zb3J0KHJlbGF0ZWRBcnRpZmFjdEtleXMsIEFSVElGQUNUX0tFWV9WRVJTSU9OX0NPTVBBUkFUT1IpOwotCQkJbGlzdHNbaSsrXSA9IHJlbGF0ZWRBcnRpZmFjdEtleXM7Ci0JCX0KLQkJaW50IGNhbmRpZGF0ZXMgPSAwOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgbGlzdHMubGVuZ3RoOyBpaSsrKSB7Ci0JCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgbGlzdHNbaWldLmxlbmd0aDsgamorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0c1tpaV1bampdICsgIiwgIik7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJaWYgKGxpc3RzW2lpXS5sZW5ndGggPiAxKQotCQkJCWNhbmRpZGF0ZXMrKzsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbmRpZGF0ZXMgZm91bmQ6ICIgKyBjYW5kaWRhdGVzKTsKLQkJcmV0dXJuIGxpc3RzOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcHRpbWl6ZShJQXJ0aWZhY3REZXNjcmlwdG9yIGNhbm9uaWNhbCwgSUFydGlmYWN0S2V5W10gcmVsYXRlZEFydGlmYWN0S2V5cykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGltaXppbmcgIiArIGNhbm9uaWNhbCk7Ci0KLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0U29ydGVkQ29tcGxldGVQcmVkZWNlc3NvcnMoY2Fub25pY2FsLmdldEFydGlmYWN0S2V5KCksIHJlbGF0ZWRBcnRpZmFjdEtleXMpOwotCi0JCWludCBtaW5EZXB0aCA9IE1hdGgubWluKGRlcHRoLCBkZXNjcmlwdG9ycy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbkRlcHRoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQgd2l0aCBqYXIgZGVsdGEgYWdhaW5zdCAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7Ci0JCQlTdHJpbmcgcHJlZGVjZXNzb3JEYXRhID0gZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJQXJ0aWZhY3REZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGNhbm9uaWNhbCk7Ci0JCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgcGF0Y2hTdGVwID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcihKQVJfREVMVEFfUEFUQ0hfU1RFUCwgcHJlZGVjZXNzb3JEYXRhLCB0cnVlKTsKLQkJCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHtwYXRjaFN0ZXB9OwotCQkJbmV3RGVzY3JpcHRvci5zZXRQcm9jZXNzaW5nU3RlcHMoc3RlcHMpOwotCQkJbmV3RGVzY3JpcHRvci5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCwgSkFSX0RFTFRBX0ZPUk1BVCk7Ci0JCQlPdXRwdXRTdHJlYW0gcmVwb3NpdG9yeVN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlcG9zaXRvcnlTdHJlYW0gPSByZXBvc2l0b3J5LmdldE91dHB1dFN0cmVhbShuZXdEZXNjcmlwdG9yKTsKLQotCQkJCS8vIEFkZCBpbiBhbGwgdGhlIHByb2Nlc3Npbmcgc3RlcHMgbmVlZGVkIHRvIG9wdGltaXplIChlLmcuLCBwYWNrMjAwLCAuLi4pCi0JCQkJUHJvY2Vzc2luZ1N0ZXAgb3B0aW1pemVyU3RlcCA9IG5ldyBKYXJEZWx0YU9wdGltaXplclN0ZXAocmVwb3NpdG9yeSk7Ci0JCQkJb3B0aW1pemVyU3RlcC5pbml0aWFsaXplKHBhdGNoU3RlcCwgbmV3RGVzY3JpcHRvcik7Ci0JCQkJUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKCk7Ci0JCQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gaGFuZGxlci5saW5rKG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtvcHRpbWl6ZXJTdGVwfSwgcmVwb3NpdG9yeVN0cmVhbSwgbnVsbCk7Ci0KLQkJCQkvLyBEbyB0aGUgYWN0dWFsIHdvcmsgYnkgYXNraW5nIHRoZSByZXBvIHRvIGdldCB0aGUgYXJ0aWZhY3QgYW5kIHB1dCBpdCBpbiB0aGUgZGVzdGluYXRpb24uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KGNhbm9uaWNhbCwgZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgdGhlIGFydGlmYWN0IGlzIG5vdCBvay4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgb3B0aW1pemF0aW9uIG9mOiAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyZXBvc2l0b3J5U3RyZWFtICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlyZXBvc2l0b3J5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyhyZXBvc2l0b3J5U3RyZWFtKTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgb3B0aW1pemF0aW9uIG9mOiAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG9wdGltaXphdGlvbiBvZjogIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0U29ydGVkQ29tcGxldGVQcmVkZWNlc3NvcnMoSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5LCBJQXJ0aWZhY3RLZXlbXSByZWxhdGVkQXJ0aWZhY3RLZXlzKSB7Ci0JCS8vIGdldCBhbGwgYXJ0aWZhY3Qga2V5cwotCQlMaXN0IGNvbXBsZXRlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KHJlbGF0ZWRBcnRpZmFjdEtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGVkQXJ0aWZhY3RLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBpZiB3ZSBmaW5kILRvdXIgc2VsZrQgc2tpcAotCQkJaWYgKHJlbGF0ZWRBcnRpZmFjdEtleXNbaV0uZXF1YWxzKGFydGlmYWN0S2V5KSkKLQkJCQljb250aW51ZTsKLQkJCS8vIGxvb2sgZm9yIGEgY29tcGxldGUgYXJ0aWZhY3QgZGVzY3JpcHRvciBvZiB0aGUgY3VycmVudCBrZXkgIAotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKHJlbGF0ZWRBcnRpZmFjdEtleXNbaV0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCWlmIChpc0Nhbm9uaWNhbChkZXNjcmlwdG9yc1tqXSkpIHsKLQkJCQkJY29tcGxldGVEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcnNbal0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gY29tcGxldGVTb3J0ZWREZXNjcmlwdG9ycyA9IChJQXJ0aWZhY3REZXNjcmlwdG9yW10pIGNvbXBsZXRlRGVzY3JpcHRvcnMudG9BcnJheShuZXcgSUFydGlmYWN0RGVzY3JpcHRvcltjb21wbGV0ZURlc2NyaXB0b3JzLnNpemUoKV0pOwotCQkvLyBTb3J0LCBzbyB0byBhbGxvdyBhIGRlcHRoIGxvb2t1cCEKLQkJQXJyYXlzLnNvcnQoY29tcGxldGVTb3J0ZWREZXNjcmlwdG9ycywgQVJUSUZBQ1RfREVTQ1JJUFRPUl9WRVJTSU9OX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gY29tcGxldGVTb3J0ZWREZXNjcmlwdG9yczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPcHRpbWl6ZWQoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gSkFSX0RFTFRBX0ZPUk1BVC5lcXVhbHMoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Nhbm9uaWNhbChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJLy8gVE9ETyBsZW5ndGggIT0gMCBpcyBub3QgbmVjZXNzYXJpbHkgYW4gaW5kaWNhdG9yIGZvciBub3QgYmVpbmcgY2Fub25pY2FsISAgIAotCQlyZXR1cm4gZGVzY3JpcHRvci5nZXRQcm9jZXNzaW5nU3RlcHMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQlzdGF0aWMgZmluYWwgY2xhc3MgQXJ0aWZhY3REZXNjcmlwdG9yVmVyc2lvbkNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcnRpZmFjdERlc2NyaXB0b3IwLCBPYmplY3QgYXJ0aWZhY3REZXNjcmlwdG9yMSkgewotCQkJcmV0dXJuIC0xICogKChJQXJ0aWZhY3REZXNjcmlwdG9yKSBhcnRpZmFjdERlc2NyaXB0b3IwKS5nZXRBcnRpZmFjdEtleSgpLmdldFZlcnNpb24oKS5jb21wYXJlVG8oKChJQXJ0aWZhY3REZXNjcmlwdG9yKSBhcnRpZmFjdERlc2NyaXB0b3IxKS5nZXRBcnRpZmFjdEtleSgpLmdldFZlcnNpb24oKSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgY2xhc3MgQXJ0aWZhY3RLZXlWZXJzaW9uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFydGlmYWN0S2V5MCwgT2JqZWN0IGFydGlmYWN0S2V5MSkgewotCQkJcmV0dXJuIC0xICogKChJQXJ0aWZhY3RLZXkpIGFydGlmYWN0S2V5MCkuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbygoKElBcnRpZmFjdEtleSkgYXJ0aWZhY3RLZXkxKS5nZXRWZXJzaW9uKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmIwOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamJkaWZmOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBvcHRpbWl6ZXIgPGNvZGU+QXBwbGljYXRpb248L2NvZGU+IGZvciBKQkRpZmYgYmFzZWQgb3B0aW1pemF0aW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0KLQlwcml2YXRlIFVSTCBhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbjsKLQlwcml2YXRlIGludCB3aWR0aCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZGVwdGggPSAxOwotCXByaXZhdGUgYm9vbGVhbiBub3NhcjsKLQotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3MgPSBjb250ZXh0LmdldEFyZ3VtZW50cygpOwotCQlpbml0aWFsaXplRnJvbUFyZ3VtZW50cygoU3RyaW5nW10pIGFyZ3MuZ2V0KCJhcHBsaWNhdGlvbi5hcmdzIikpOyAvLyROT04tTkxTLTEkCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHNldHVwUmVwb3NpdG9yeShhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbik7Ci0JCW5ldyBPcHRpbWl6ZXIocmVwb3NpdG9yeSwgd2lkdGgsIGRlcHRoLCBub3NhcikucnVuKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBzZXR1cFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQkvLyBUT0RPIGxvZyBoZXJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8geWV0Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCQkJLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1wYWNrIikpCi0JCQkvLwkJCQlwYWNrID0gdHJ1ZTsKLQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItbm9zYXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCW5vc2FyID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgCi0JCQkvLyBpZiB0aGUgbmV4dCBvbmUgaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSAKLQkJCS8vIGFuIGFyZyB3aXRoIGEgcGFyYW0gc28gY29udGludWUuCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWFydGlmYWN0UmVwb3NpdG9yeSIpIHx8IGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbiA9IG5ldyBVUkwoYXJnKTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1kZXB0aCIpKSAvLyROT04tTkxTLTEkCi0JCQkJZGVwdGggPSBJbnRlZ2VyLnBhcnNlSW50KGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItd2lkdGgiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXdpZHRoID0gSW50ZWdlci5wYXJzZUludChhcmcpOwotCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9KQkRpZmZTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9KQkRpZmZTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTk3NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZjsKLQotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJEaWZmOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWJzdHJhY3REZWx0YVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLkRpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKQkRpZmZTdGVwIGV4dGVuZHMgQWJzdHJhY3REZWx0YVN0ZXAgewotCi0JcHVibGljIEpCRGlmZlN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gVE9ETyBXZSBuZWVkIGEgZGlmZmVyZW50IHdheSBvZiBpbmplY3RpbmcgdGhlIGJhc2UgYXJ0aWZhY3RzLiAgVGhpcyBhcHByb2FjaCBmb3JjZXMKLQkvLyB0aGUgdGFyZ2V0IGFuZCBiYXNlIHRvIGxpdmUgaW4gdGhlIHNhbWUgcmVwby4gIFR5cGljYWwgYnV0IG5vdCByZWFsbHkgcmVxdWlyZWQuCi0JcHJvdGVjdGVkIEpCRGlmZlN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXN1cGVyKHJlcG9zaXRvcnkpOwotCX0KLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlSW5jb21pbmdTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Qcm9jZXNzaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHByZWRlY2Vzc29yID0gZmV0Y2hQcmVkZWNlc3NvckJ5dGVzKG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KSk7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBjdXJyZW50ID0gKERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSkgaW5jb21pbmdTdHJlYW07Ci0JCWJ5dGVbXSBkaWZmID0gSkJEaWZmLmJzZGlmZihwcmVkZWNlc3Nvci5nZXRCdWZmZXIoKSwgcHJlZGVjZXNzb3IuZ2V0QnVmZmVyTGVuZ3RoKCksIGN1cnJlbnQuZ2V0QnVmZmVyKCksIGN1cnJlbnQuZ2V0QnVmZmVyTGVuZ3RoKCkpOwotCQkvLyBmcmVlIHVwIHRoZSBtZW1vcnkgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkJcHJlZGVjZXNzb3IgPSBudWxsOwotCQljdXJyZW50ID0gbnVsbDsKLQkJaW5jb21pbmdTdHJlYW0gPSBudWxsOwotCi0JCS8vIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgb3B0aW1pemF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbi4KLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRpZmYpLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZmV0Y2hQcmVkZWNlc3NvckJ5dGVzKEFydGlmYWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNldFN0YXR1cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0KGFydGlmYWN0RGVzY3JpcHRvciwgcmVzdWx0LCBnZXRQcm9ncmVzc01vbml0b3IoKSkpOwotCQlpZiAoIWdldFN0YXR1cygpLmlzT0soKSkKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgbmV3IElPRXhjZXB0aW9uKGdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSkuaW5pdENhdXNlKGdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9KQkRpZmZaaXBTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9KQkRpZmZaaXBTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzBhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmWmlwU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmY7Ci0KLWltcG9ydCBpZS53b21iYXQuamJkaWZmLkpCRGlmZjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLkRpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5TYXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKQkRpZmZaaXBTdGVwIGV4dGVuZHMgSkJEaWZmU3RlcCB7Ci0KLQlwdWJsaWMgSkJEaWZmWmlwU3RlcCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyBUT0RPIFdlIG5lZWQgYSBkaWZmZXJlbnQgd2F5IG9mIGluamVjdGluZyB0aGUgYmFzZSBhcnRpZmFjdHMuICBUaGlzIGFwcHJvYWNoIGZvcmNlcwotCS8vIHRoZSB0YXJnZXQgYW5kIGJhc2UgdG8gbGl2ZSBpbiB0aGUgc2FtZSByZXBvLiAgVHlwaWNhbCBidXQgbm90IHJlYWxseSByZXF1aXJlZC4KLQlwcm90ZWN0ZWQgSkJEaWZmWmlwU3RlcChJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJc3VwZXIocmVwb3NpdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2FycmVkQ3VycmVudCA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJU2FyVXRpbC56aXBUb1NhcigoKERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSkgaW5jb21pbmdTdHJlYW0pLmdldElucHV0U3RyZWFtKCksIHNhcnJlZEN1cnJlbnQpOwotCQlpbmNvbWluZ1N0cmVhbSA9IG51bGw7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBwcmVkZWNlc3NvciA9IGZldGNoUHJlZGVjZXNzb3JCeXRlcyhuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSkpOwotCQlieXRlW10gZGlmZiA9IEpCRGlmZi5ic2RpZmYocHJlZGVjZXNzb3IuZ2V0QnVmZmVyKCksIHByZWRlY2Vzc29yLmdldEJ1ZmZlckxlbmd0aCgpLCBzYXJyZWRDdXJyZW50LmdldEJ1ZmZlcigpLCBzYXJyZWRDdXJyZW50LmdldEJ1ZmZlckxlbmd0aCgpKTsKLQkJLy8gZnJlZSB1cCB0aGUgbWVtb3J5IGFzIHNvb24gYXMgcG9zc2libGUuCi0JCXByZWRlY2Vzc29yID0gbnVsbDsKLQkJaW5jb21pbmdTdHJlYW0gPSBudWxsOwotCQlzYXJyZWRDdXJyZW50ID0gbnVsbDsKLQotCQkvLyBjb3B5IHRoZSByZXN1bHQgb2YgdGhlIG9wdGltaXphdGlvbiB0byB0aGUgZGVzdGluYXRpb24uCi0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkaWZmKSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZldGNoUHJlZGVjZXNzb3JCeXRlcyhBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gemlwcGVkUHJlZGVjZXNzb3IgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJc2V0U3RhdHVzKHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3QoYXJ0aWZhY3REZXNjcmlwdG9yLCB6aXBwZWRQcmVkZWNlc3NvciwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJaWYgKCFnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbihnZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpLmluaXRDYXVzZShnZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKSk7Ci0KLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJU2FyVXRpbC56aXBUb1Nhcih6aXBwZWRQcmVkZWNlc3Nvci5nZXRJbnB1dFN0cmVhbSgpLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvT3B0aW1pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9PcHRpbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5MmI1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9PcHRpbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLlZlcnNpb25sZXNzQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi1wdWJsaWMgY2xhc3MgT3B0aW1pemVyIHsKLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCXByaXZhdGUgaW50IHdpZHRoOwotCXByaXZhdGUgaW50IGRlcHRoOwotCXByaXZhdGUgYm9vbGVhbiBub3NhcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQlBBVENIX1NURVBfSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5LkpCUGF0Y2hTdGVwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQlBBVENIX1NURVBfWklQX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeS5KQlBhdGNoWmlwU3RlcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgQVJUSUZBQ1RfREVTQ1JJUFRPUl9WRVJTSU9OX0NPTVBBUkFUT1IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yVmVyc2lvbkNvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIEFSVElGQUNUX0tFWV9WRVJTSU9OX0NPTVBBUkFUT1IgPSBuZXcgQXJ0aWZhY3RLZXlWZXJzaW9uQ29tcGFyYXRvcigpOwotCi0JLyoqCi0JICogVGhpcyBvcHRpbWl6ZXIgcGVyZm9ybXMgZGVsdGEgZ2VuZXJhdGlvbiBiYXNlZCBvbiAoY3VycmVudGx5KSBqYmRpZmYuIAotCSAqIFRoZSBvcHRpbWl6YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgtHdpZHRotCBhbmQgdGhlILRkZXB0aLQgcGFyYW1ldGVyLgotCSAqILR3aWR0aLQgZGVmaW5lcyBmb3IgaG93IG1hbnkgtHJlbGF0ZWS0IGFydGlmYWN0IGtleXMgYSBkZWx0YSBzaG91bGQgYmUgZ2VuZXJhdGVkLAotCSAqIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgdXAtdG8tZGF0ZS4KLQkgKiC0ZGVwdGi0IGRlZmluZXMgdG8gaG93IG1hbnkgcHJlZGVjZXNzb3IgYSBkZWx0YSBzaG91bGQgYmUgZ2VuZXJhdGVkLgotCSAqIAotCSAqIFdpdGggQUsoYy12KSA6IEFLIC0gYXJ0aWZhY3Qga2V5LCBjIC0gYXJ0aWZhY3QgaWQsIHYgLSBhcnRpZmFjdCB2ZXJzaW9uCi0JICogdGhlILRyZXBvc2l0b3J5IGNvbnRlbnS0IGNhbiBiZSB2aWV3ZWQgYSB0d28gZGltZW5zaW9uYWwgYXJyYXksIHdoZXJlIHRoZQotCSAqIGFydGlmYWN0IGtleXMgZm9yIHRoZSBzYW1lIGNvbXBvbmVudCBhcmUgaW4gb3JkZXIgb2YgdGhlaXIgdmVyc2lvbjogCi0JICogPHByZT48Y29kZT4KLQkgKiAgICAgdz0xICAgICAgIHc9MgotCSAqICAgICAgfCAgICAgICAgfAotCSAqICAgICAgfCArLS0tLS0tLi0tLS0tLS0tLS0tLSsgZD0yCi0JICogICAgICB8IHwgKy0tLS0uLS0tKyBkPTEgICAgfAotCSAqICAgICAgfCB8IHwgICAgfCAgIHwgICAgICAgIHYKLQkgKiBbICAgIHYgfCB8ICAgIHYgICB2ICAgICAgICB2Ci0JICogWyBBSyh4LDIuMCkgQUsoeCwxLjUpIEFLKHgsMS4xKSBdCi0JICogWyBBSyh5LDIuMCkgQUsoeSwxLjkpIF0KLQkgKiBbIEFLKHosMi4wKSBBSyh6LDEuNSkgQUsoeiwxLjMpIEFLKHosMS4wKSBdCi0JICogXQotCSAqIDwvY29kZT48L3ByZT4gIAotCSAqIEUuZzogd2l0aCBhILR3aWR0aLQgb2Ygb25lIGFuZCBhILRkZXB0aLQgb2YgdHdvIHRoZSBvcHRpbWl6ZXIgd291bGQKLQkgKiBjcmVhdGUgdHdvIGRlbHRhcyBmb3IgY29tcG9uZW50ILR4tCBmcm9tIDEuNSB0byAyLjAgYW5kIGZyb20gMS4xIHRvIDIuMC4gICAgCi0JICogCi0JICogQHBhcmFtIHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcGFyYW0gbm9zYXIgCi0JICovCi0JcHVibGljIE9wdGltaXplcihJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGludCB3aWR0aCwgaW50IGRlcHRoLCBib29sZWFuIG5vc2FyKSB7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5kZXB0aCA9IGRlcHRoOwotCQl0aGlzLm5vc2FyID0gbm9zYXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIGRlbHRhIChqYmRpZmYpIG9wdGltaXphdGlvbnMgKHdpZHRoPSIgKyB3aWR0aCArICIsIGRlcHRoPSIgKyBkZXB0aCArICIsIG5vc2FyPSIgKyBub3NhciArICIpIik7Ci0JCUlBcnRpZmFjdEtleVtdW10ga2V5cyA9IGdldFNvcnRlZFJlbGF0ZWRBcnRpZmFjdEtleXMocmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGtleXNbaV0ubGVuZ3RoIDwgMikKLQkJCQkvLyBOb3RoaW5nIHRvIGRpZmYgaGVyZSEKLQkJCQljb250aW51ZTsKLQkJCWludCBtaW5XaWR0aCA9IE1hdGgubWluKHdpZHRoLCBrZXlzW2ldLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG1pbldpZHRoOyBqKyspIHsKLQkJCQlJQXJ0aWZhY3RLZXkga2V5ID0ga2V5c1tpXVtqXTsKLQkJCQlib29sZWFuIGlzQXJjaGl2ZSA9IGtleS5nZXRDbGFzc2lmaWVyKCkuZXF1YWxzKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwcm9wb3NlZFN0cmF0ZWd5ID0gaXNBcmNoaXZlICYmICFub3NhciA/IEpCUEFUQ0hfU1RFUF9aSVBfSUQgOiBKQlBBVENIX1NURVBfSUQ7Ci0JCQkJb3B0aW1pemUoa2V5c1tpXSwga2V5LCBwcm9wb3NlZFN0cmF0ZWd5KTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUuIik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3B0aW1pemUoSUFydGlmYWN0S2V5W10ga2V5cywgSUFydGlmYWN0S2V5IGtleSwgU3RyaW5nIHByb3Bvc2VkU3RyYXRlZ3kpIHRocm93cyBPdXRPZk1lbW9yeUVycm9yIHsKLQkJYm9vbGVhbiByZXRyeTsKLQkJZG8gewotCQkJcmV0cnkgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCQkJSUFydGlmYWN0RGVzY3JpcHRvciBjb21wbGV0ZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGsrKykgewotCQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1trXTsKLQkJCQkJaWYgKGlzQ2Fub25pY2FsKGRlc2NyaXB0b3IpKQotCQkJCQkJY29tcGxldGUgPSBkZXNjcmlwdG9yOwotCQkJCQllbHNlIGlmIChpc09wdGltaXplZChkZXNjcmlwdG9yLCBwcm9wb3NlZFN0cmF0ZWd5KSkgewotCQkJCQkJcHJvcG9zZWRTdHJhdGVneSA9IG51bGw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocHJvcG9zZWRTdHJhdGVneSAhPSBudWxsICYmIGNvbXBsZXRlICE9IG51bGwpCi0JCQkJCW9wdGltaXplKGNvbXBsZXRlLCBwcm9wb3NlZFN0cmF0ZWd5LCBrZXlzKTsKLQkJCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJCWlmIChKQlBBVENIX1NURVBfSUQuZXF1YWxzKHByb3Bvc2VkU3RyYXRlZ3kpKQotCQkJCQl0aHJvdyBlOwotCQkJCXByb3Bvc2VkU3RyYXRlZ3kgPSBKQlBBVENIX1NURVBfSUQ7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXRyeSB3aXRoICIgKyBwcm9wb3NlZFN0cmF0ZWd5KTsKLQkJCQlyZXRyeSA9IHRydWU7Ci0JCQl9Ci0JCX0gd2hpbGUgKHJldHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYSBsaXN0IG9mIGxpc3Qgb2YgSUFydGlmYWN0S2V5cy4gVGhlIGFydGlmYWN0IGtleXMgaW4gdGhlCi0JICogbGlzdCBvZiBhcnRpZmFjdCBrZXlzIGFyZSBhbGwgtHN0cm9uZ2x5IHJlbGF0ZWS0IHRvIGVhY2ggb3RoZXIgc3VjaCB0aGF0IGFyZSAgCi0JICogZXF1YWwgYnV0IG5vdCBjb25zaWRlcmluZyB0aGUgdmVyc2lvbnMuIFRoaXMgbGlzdCBpcyBzb3J0ZWQgc3VjaCB0aGF0IHRoZSAKLQkgKiBuZXdlciB2ZXJzaW9ucyBhcmUgZmlyc3QgaW4gdGhlIGxpc3QuPHA+Ci0JICogV2l0aCBBSyhjLXYpIDogQUsgLSBhcnRpZmFjdCBrZXksIGMgLSBhcnRpZmFjdCBpZCwgdiAtIGFydGlmYWN0IHZlcnNpb24KLQkgKiB0aGUgcmVzdWx0IGlzIHRoYW4sIGUuZy4KLQkgKiA8cHJlPjxjb2RlPgotCSAqIFsKLQkgKiBbIEFLKHgsMi4wKSBBSyh4LDEuNSkgQUsoeCwxLjEpIF0KLQkgKiBbIEFLKHksMi4wKSBBSyh5LDEuOSkgXQotCSAqIFsgQUsoeiwyLjApIEFLKHosMS41KSBBSyh6LDEuMykgQUsoeiwxLjApIF0KLQkgKiBdCi0JICogPC9jb2RlPjwvcHJlPiAgCi0JICogQHBhcmFtIGFydGlmYWN0S2V5cwotCSAqIEByZXR1cm4gdGhlIHNvcnRlZCBhcnRpZmFjdCBrZXlzCi0JICovCi0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXlbXVtdIGdldFNvcnRlZFJlbGF0ZWRBcnRpZmFjdEtleXMoSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RLZXlzKSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFydGlmYWN0S2V5cy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IGZyZWVLZXkgPSBuZXcgVmVyc2lvbmxlc3NBcnRpZmFjdEtleShhcnRpZmFjdEtleXNbaV0pOwotCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgbWFwLmdldChmcmVlS2V5KTsKLQkJCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJCXZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltYXAucHV0KGZyZWVLZXksIHZhbHVlcyk7Ci0JCQl9Ci0JCQl2YWx1ZXMuYWRkKGFydGlmYWN0S2V5c1tpXSk7Ci0JCX0KLQkJSUFydGlmYWN0S2V5W11bXSBsaXN0cyA9IG5ldyBJQXJ0aWZhY3RLZXlbbWFwLnNpemUoKV1bXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUxpc3QgYXJ0aWZhY3RLZXlMaXN0ID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlBcnRpZmFjdEtleVtdIHJlbGF0ZWRBcnRpZmFjdEtleXMgPSAoSUFydGlmYWN0S2V5W10pIGFydGlmYWN0S2V5TGlzdC50b0FycmF5KG5ldyBJQXJ0aWZhY3RLZXlbYXJ0aWZhY3RLZXlMaXN0LnNpemUoKV0pOwotCQkJQXJyYXlzLnNvcnQocmVsYXRlZEFydGlmYWN0S2V5cywgQVJUSUZBQ1RfS0VZX1ZFUlNJT05fQ09NUEFSQVRPUik7Ci0JCQlsaXN0c1tpKytdID0gcmVsYXRlZEFydGlmYWN0S2V5czsKLQkJfQotCQlpbnQgY2FuZGlkYXRlcyA9IDA7Ci0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBsaXN0cy5sZW5ndGg7IGlpKyspIHsKLQkJCWZvciAoaW50IGpqID0gMDsgamogPCBsaXN0c1tpaV0ubGVuZ3RoOyBqaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGxpc3RzW2lpXVtqal0gKyAiLCAiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQlpZiAobGlzdHNbaWldLmxlbmd0aCA+IDEpCi0JCQkJY2FuZGlkYXRlcysrOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuZGlkYXRlcyBmb3VuZDogIiArIGNhbmRpZGF0ZXMpOwotCQlyZXR1cm4gbGlzdHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wdGltaXplKElBcnRpZmFjdERlc2NyaXB0b3IgY29tcGxldGUsIFN0cmluZyBzdHJhdGVneSwgSUFydGlmYWN0S2V5W10gcmVsYXRlZEFydGlmYWN0S2V5cykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGltaXppbmcgIiArIGNvbXBsZXRlKTsKLQotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRTb3J0ZWRDb21wbGV0ZVByZWRlY2Vzc29ycyhjb21wbGV0ZS5nZXRBcnRpZmFjdEtleSgpLCByZWxhdGVkQXJ0aWZhY3RLZXlzKTsKLQotCQlpbnQgbWluRGVwdGggPSBNYXRoLm1pbihkZXB0aCwgZGVzY3JpcHRvcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5EZXB0aDsgaSsrKSB7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQgd2l0aCAiICsgc3RyYXRlZ3kgKyAiIGFnYWluc3QgIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOwotCQkJU3RyaW5nIHByZWRlY2Vzc29yRGF0YSA9IGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBuZXdEZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihjb21wbGV0ZSk7Ci0JCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgcGF0Y2hTdGVwID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcihzdHJhdGVneSwgcHJlZGVjZXNzb3JEYXRhLCB0cnVlKTsKLQkJCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHtwYXRjaFN0ZXB9OwotCQkJbmV3RGVzY3JpcHRvci5zZXRQcm9jZXNzaW5nU3RlcHMoc3RlcHMpOwotCQkJbmV3RGVzY3JpcHRvci5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCwgc3RyYXRlZ3kpOwotCQkJT3V0cHV0U3RyZWFtIHJlcG9zaXRvcnlTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXBvc2l0b3J5U3RyZWFtID0gcmVwb3NpdG9yeS5nZXRPdXRwdXRTdHJlYW0obmV3RGVzY3JpcHRvcik7Ci0KLQkJCQkvLyBBZGQgaW4gYWxsIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIG5lZWRlZCB0byBvcHRpbWl6ZSAoZS5nLiwgcGFjazIwMCwgLi4uKQotCQkJCVByb2Nlc3NpbmdTdGVwIGRpZmZTdGVwID0gZ2V0UHJvY2Vzc2luZ1N0ZXAoc3RyYXRlZ3kpOwotCQkJCWRpZmZTdGVwLmluaXRpYWxpemUocGF0Y2hTdGVwLCBuZXdEZXNjcmlwdG9yKTsKLQkJCQlQcm9jZXNzaW5nU3RlcEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIoKTsKLQkJCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBoYW5kbGVyLmxpbmsobmV3IFByb2Nlc3NpbmdTdGVwW10ge2RpZmZTdGVwfSwgcmVwb3NpdG9yeVN0cmVhbSwgbnVsbCk7Ci0KLQkJCQkvLyBEbyB0aGUgYWN0dWFsIHdvcmsgYnkgYXNraW5nIHRoZSByZXBvIHRvIGdldCB0aGUgYXJ0aWZhY3QgYW5kIHB1dCBpdCBpbiB0aGUgZGVzdGluYXRpb24uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KGNvbXBsZXRlLCBkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyB0aGUgYXJ0aWZhY3QgaXMgbm90IG9rLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBvcHRpbWl6YXRpb24gb2Y6ICIgKyBkZXNjcmlwdG9yc1tpXS5nZXRBcnRpZmFjdEtleSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlcG9zaXRvcnlTdHJlYW0gIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlcG9zaXRvcnlTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNoZWNrU3RhdHVzKHJlcG9zaXRvcnlTdHJlYW0pOwotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBvcHRpbWl6YXRpb24gb2Y6ICIgKyBkZXNjcmlwdG9yc1tpXS5nZXRBcnRpZmFjdEtleSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgb3B0aW1pemF0aW9uIG9mOiAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3NpbmdTdGVwIGdldFByb2Nlc3NpbmdTdGVwKFN0cmluZyBzdHJhdGVneSkgewotCQlpZiAoc3RyYXRlZ3kuZXF1YWxzKEpCUEFUQ0hfU1RFUF9JRCkpCi0JCQlyZXR1cm4gbmV3IEpCRGlmZlN0ZXAocmVwb3NpdG9yeSk7Ci0JCXJldHVybiBuZXcgSkJEaWZmWmlwU3RlcChyZXBvc2l0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRTb3J0ZWRDb21wbGV0ZVByZWRlY2Vzc29ycyhJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXksIElBcnRpZmFjdEtleVtdIHJlbGF0ZWRBcnRpZmFjdEtleXMpIHsKLQkJLy8gZ2V0IGFsbCBhcnRpZmFjdCBrZXlzCi0JCUxpc3QgY29tcGxldGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QocmVsYXRlZEFydGlmYWN0S2V5cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0ZWRBcnRpZmFjdEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGlmIHdlIGZpbmQgtG91ciBzZWxmtCBza2lwCi0JCQlpZiAocmVsYXRlZEFydGlmYWN0S2V5c1tpXS5lcXVhbHMoYXJ0aWZhY3RLZXkpKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gbG9vayBmb3IgYSBjb21wbGV0ZSBhcnRpZmFjdCBkZXNjcmlwdG9yIG9mIHRoZSBjdXJyZW50IGtleSAgCi0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0RGVzY3JpcHRvcnMocmVsYXRlZEFydGlmYWN0S2V5c1tpXSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKGlzQ2Fub25pY2FsKGRlc2NyaXB0b3JzW2pdKSkgewotCQkJCQljb21wbGV0ZURlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yc1tqXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBjb21wbGV0ZVNvcnRlZERlc2NyaXB0b3JzID0gKElBcnRpZmFjdERlc2NyaXB0b3JbXSkgY29tcGxldGVEZXNjcmlwdG9ycy50b0FycmF5KG5ldyBJQXJ0aWZhY3REZXNjcmlwdG9yW2NvbXBsZXRlRGVzY3JpcHRvcnMuc2l6ZSgpXSk7Ci0JCS8vIFNvcnQsIHNvIHRvIGFsbG93IGEgZGVwdGggbG9va3VwIQotCQlBcnJheXMuc29ydChjb21wbGV0ZVNvcnRlZERlc2NyaXB0b3JzLCBBUlRJRkFDVF9ERVNDUklQVE9SX1ZFUlNJT05fQ09NUEFSQVRPUik7Ci0JCXJldHVybiBjb21wbGV0ZVNvcnRlZERlc2NyaXB0b3JzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc09wdGltaXplZChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBzdGVwSWQpIHsKLQkJaWYgKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdGVwSWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKClbMF0uZ2V0UHJvY2Vzc29ySWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2Fub25pY2FsKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBUT0RPIGxlbmd0aCAhPSAwIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBpbmRpY2F0b3IgZm9yIG5vdCBiZWluZyBjb21wbGV0ZSEgICAKLQkJcmV0dXJuIGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRvclZlcnNpb25Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJ0aWZhY3REZXNjcmlwdG9yMCwgT2JqZWN0IGFydGlmYWN0RGVzY3JpcHRvcjEpIHsKLQkJCXJldHVybiAtMSAqICgoSUFydGlmYWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjcmlwdG9yMCkuZ2V0QXJ0aWZhY3RLZXkoKS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCgoSUFydGlmYWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjcmlwdG9yMSkuZ2V0QXJ0aWZhY3RLZXkoKS5nZXRWZXJzaW9uKCkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGNsYXNzIEFydGlmYWN0S2V5VmVyc2lvbkNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcnRpZmFjdEtleTAsIE9iamVjdCBhcnRpZmFjdEtleTEpIHsKLQkJCXJldHVybiAtMSAqICgoSUFydGlmYWN0S2V5KSBhcnRpZmFjdEtleTApLmdldFZlcnNpb24oKS5jb21wYXJlVG8oKChJQXJ0aWZhY3RLZXkpIGFydGlmYWN0S2V5MSkuZ2V0VmVyc2lvbigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTlhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JLy9BcHBsaWNhdGlvbiByZXR1cm4gY29kZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTk9OX1dSSVRUQUJMRV9SRVBPU0lUT1JZID0gbmV3IEludGVnZXIoLTEpOwotCi0JLy9BcHBsaWNhdGlvbiBhcmd1bWVudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfUkVQT1NJVE9SWV9BUkcgPSAiLWFydGlmYWN0UmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfUkVQT1NJVE9SWV9TSE9SVF9BUkcgPSAiLWFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVUkwgYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb247Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBzZXR1cFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24pOwotCQlpZiAoIXJlcG9zaXRvcnkuaXNNb2RpZmlhYmxlKCkpCi0JCQlyZXR1cm4gTk9OX1dSSVRUQUJMRV9SRVBPU0lUT1JZOwotCQluZXcgT3B0aW1pemVyKHJlcG9zaXRvcnkpLnJ1bigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc2V0dXBSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkvL25vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmd1bWVudCBvciAKLQkJCS8vIGlmIHRoZSBuZXh0IG9uZSBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIAotCQkJLy8gYW4gYXJnIHdpdGggYSBwYXJhbSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEFSVElGQUNUX1JFUE9TSVRPUllfQVJHKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEFSVElGQUNUX1JFUE9TSVRPUllfU0hPUlRfQVJHKSkKLQkJCQlhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbiA9IG5ldyBVUkwoYXJnKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGM3ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfZ2V0dGluZ19hcnRpZmFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lwX29wdGltaXphdGlvbjsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL09wdGltaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL09wdGltaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZhNWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9PcHRpbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgT3B0aW1pemVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0VEX0ZPUk1BVCA9ICJwYWNrZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0KLQlwdWJsaWMgT3B0aW1pemVyKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IGtleSA9IGtleXNbaV07Ci0JCQlpZiAoIWtleS5nZXRDbGFzc2lmaWVyKCkuZXF1YWxzKCJwbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGNhbm9uaWNhbCA9IG51bGw7Ci0JCQlib29sZWFuIG9wdGltaXplZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2pdOwotCQkJCWlmIChpc0Nhbm9uaWNhbChkZXNjcmlwdG9yKSkKLQkJCQkJY2Fub25pY2FsID0gZGVzY3JpcHRvcjsKLQkJCQlvcHRpbWl6ZWQgfD0gaXNPcHRpbWl6ZWQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlpZiAoIW9wdGltaXplZCkKLQkJCQlvcHRpbWl6ZShjYW5vbmljYWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2Fub25pY2FsKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBUT0RPIGxlbmd0aCAhPSAwIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBpbmRpY2F0b3IgZm9yIG5vdCBiZWluZyBjb21wbGV0ZSEKLQkJU3RyaW5nIGZvcm1hdCA9IGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpOwotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcHRpbWl6ZShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsgLy8kTk9OLU5MUy0xJAotCQluZXdEZXNjcmlwdG9yLnNldFByb2Nlc3NpbmdTdGVwcyhzdGVwcyk7Ci0JCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQsIFBBQ0tFRF9GT1JNQVQpOwotCQlPdXRwdXRTdHJlYW0gcmVwb3NpdG9yeVN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXBvc2l0b3J5U3RyZWFtID0gcmVwb3NpdG9yeS5nZXRPdXRwdXRTdHJlYW0obmV3RGVzY3JpcHRvcik7Ci0KLQkJCS8vIEFkZCBpbiBhbGwgdGhlIHByb2Nlc3Npbmcgc3RlcHMgbmVlZGVkIHRvIG9wdGltaXplIChlLmcuLCBwYWNrMjAwLCAuLi4pCi0JCQlQcm9jZXNzaW5nU3RlcEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIoKTsKLQkJCU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IGhhbmRsZXIubGluayhuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IFBhY2syMDBPcHRpbWl6ZXJTdGVwKCl9LCByZXBvc2l0b3J5U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gRG8gdGhlIGFjdHVhbCB3b3JrIGJ5IGFza2luZyB0aGUgcmVwbyB0byBnZXQgdGhlIGFydGlmYWN0IGFuZCBwdXQgaXQgaW4gdGhlIGRlc3RpbmF0aW9uLgotCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KGRlc2NyaXB0b3IsIGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5mYWlsZWRfZ2V0dGluZ19hcnRpZmFjdCwgZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuc2tpcF9vcHRpbWl6YXRpb24sIGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVwb3NpdG9yeVN0cmVhbSAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXJlcG9zaXRvcnlTdHJlYW0uY2xvc2UoKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXMocmVwb3NpdG9yeVN0cmVhbSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLnNraXBfb3B0aW1pemF0aW9uLCBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5za2lwX29wdGltaXphdGlvbiwgZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemVkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gUEFDS0VEX0ZPUk1BVC5lcXVhbHMoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL1BhY2syMDBPcHRpbWl6ZXJTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvUGFjazIwME9wdGltaXplclN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhOWM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvUGFjazIwME9wdGltaXplclN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9uczsKLQotLyoqCi0gKiBUaGUgUGFjazIwMFBhY2tlciBleHBlY3RzIGFuIGlucHV0IGNvbnRhaW5pbmcgbm9ybWFsICIuamFyIiBkYXRhLiAgIAotICovCi1wdWJsaWMgY2xhc3MgUGFjazIwME9wdGltaXplclN0ZXAgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlcmluZ1N0ZXAgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLRURfU1VGRklYID0gIi5wYWNrLmd6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRmlsZSBpbmNvbWluZzsKLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlSW5jb21pbmdTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbmNvbWluZyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoSU5DT01JTkdfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5jb21pbmcpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGVtcEZpbGVzKCkgewotCQlzdXBlci5jbGVhbnVwVGVtcEZpbGVzKCk7Ci0JCWlmIChpbmNvbWluZyAhPSBudWxsKQotCQkJaW5jb21pbmcuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJlc3VsdEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0RmlsZSA9IHByb2Nlc3MoKTsKLQkJCS8vIG5vdyB3cml0ZSB0aGUgb3B0aW1pemVkIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQlpZiAocmVzdWx0RmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlJbnB1dFN0cmVhbSByZXN1bHRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdEZpbGUpKTsKLQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShyZXN1bHRTdHJlYW0sIHRydWUsIGdldERlc3RpbmF0aW9uKCksIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRW1wdHkgaW50ZXJtZWRpYXRlIGZpbGU6ICIgKyByZXN1bHRGaWxlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXN1bHRGaWxlICE9IG51bGwpCi0JCQkJcmVzdWx0RmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIHByb2Nlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyB1bnBhY2sKLQkJT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wYWNrID0gdHJ1ZTsKLQkJLy8gVE9ETyB1c2UgZmFsc2UgaGVyZSBhc3N1bWluZyB0aGF0IGFsbCBjb250ZW50IGlzIGNvbmRpdGlvbmVkLiAgTmVlZCB0byByZXZpc2UgdGhpcwotCQlvcHRpb25zLnByb2Nlc3NBbGwgPSBmYWxzZTsKLQkJb3B0aW9ucy5pbnB1dCA9IGluY29taW5nOwotCQlvcHRpb25zLm91dHB1dERpciA9IGdldFdvcmtEaXIoKS5nZXRQYXRoKCk7Ci0JCW9wdGlvbnMudmVyYm9zZSA9IHRydWU7Ci0JCW5ldyBKYXJQcm9jZXNzb3JFeGVjdXRvcigpLnJ1bkphclByb2Nlc3NvcihvcHRpb25zKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGdldFdvcmtEaXIoKSwgaW5jb21pbmcuZ2V0TmFtZSgpICsgUEFDS0VEX1NVRkZJWCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTdjODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZhaWxlZF9nZXR0aW5nX2FydGlmYWN0PUZhaWxlZCBnZXR0aW5nIHRoZSBhcnRpZmFjdCB7MH0uCi1za2lwX29wdGltaXphdGlvbj1Ta2lwcGluZyBvcHRpbWl6YXRpb24gb2YgezB9LiAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQwMzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3M2MxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE0IDEyOjQ5OjM4IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwM2Q4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotI1R1ZSBOb3YgMDYgMjA6NDY6NTQgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlYmVhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBOb3YgMDUgMjE6MjM6NDIgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4ZDg3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSwKLSBvcmcuZWNsaXBzZS5vc2dpCi1JbXBvcnQtUGFja2FnZTogaWUud29tYmF0LmpiZGlmZiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXIsCi0gb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuamFyZGVsdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuamJkaWZmO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnBhY2syMDA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMudmVyaWZpZXI7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDBhYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MjliYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBwMiBBcnRpZmFjdCBQcm9jZXNzaW5nIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwZTJkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMC5QYWNrMjAwUHJvY2Vzc29yU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5KYXJEZWx0YVBhdGNoU3RlcCI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuamFyZGVsdGEuSmFyRGVsdGFQcm9jZXNzb3JTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkpCUGF0Y2hTdGVwIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmYuSkJQYXRjaFN0ZXAiLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuSkJQYXRjaFppcFN0ZXAiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoWmlwU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NRDVWZXJpZmllciI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMudmVyaWZpZXIuTUQ1VmVyaWZpZXIiLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY2MzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvQWJzdHJhY3REZWx0YVByb2Nlc3NvclN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BYnN0cmFjdERlbHRhU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSA8Y29kZT5BYnN0cmFjdERlbHRhUGF0Y2hTdGVwPC9jb2RlPiBpcyBhbiBhYnN0cmFjdCBwcm9jZXNzaW5nIHN0ZXAgdGhhdAotICogcmV0cmlldmVzIGEgbG9jYWwgYXJ0aWZhY3QgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkL2VuY29kZWQKLSAqIGFydGlmYWN0IGtleS4gSXQgYXNzdW1lcyB0aGF0IHRoZSBhcnRpZmFjdCBrZXkgaXMgc3RvcmVkIHdpdGhpbiB0aGUgZGF0YSBwcm9wZXJ0eQotICogb2YgdGhlIHByb2Nlc3Npbmcgc3RlcCBkZXNjcmlwdG9yIGVuY29kaW5nIHRoZSBhcnRpZmFjdCBrZXkgb2YgdGhlIGJhc2UgYXJ0aWZhY3QuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcCBleHRlbmRzIEFic3RyYWN0RGVsdGFTdGVwIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQlpZiAoIWdldFN0YXR1cygpLmlzT0soKSkKLQkJCXJldHVybjsKLQkJZmV0Y2hMb2NhbEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEZldGNoIGEgbG9jYWwgYXJ0aWZhY3QgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBmZXRjaGVkIGFydGlmYWN0IGtleS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmV0Y2hMb2NhbEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJaWYgKHJlcG9zaXRvcnkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZXBvTWdyID09IG51bGwpIHsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkNvdWxkIG5vdCBnZXQgYXJ0aWZhY3QgcmVwb3NpdG9yeSBtYW5hZ2VyLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVVSTFtdIHJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0xPQ0FMKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUFydGlmYWN0UmVwb3NpdG9yeSBjdXJyZW50UmVwbyA9IHJlcG9NZ3IubG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLCBudWxsKTsKLQkJCQlpZiAoY3VycmVudFJlcG8uY29udGFpbnMoa2V5KSkgewotCQkJCQlyZXBvc2l0b3J5ID0gY3VycmVudFJlcG87Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vanVzdCBza2lwIHVucmVhZGFibGUgcmVwb3NpdG9yaWVzCi0JCQl9Ci0JCX0KLQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiTm8gcmVwb3NpdG9yeSBhdmFpbGFibGUgY29udGFpbmluZyBrZXkgIiArIGtleSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWFmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvRGVsdGFBcHBsaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2phcmRlbHRhL0RlbHRhQXBwbGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWY0ZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvRGVsdGFBcHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYXJkZWx0YTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLXB1YmxpYyBjbGFzcyBEZWx0YUFwcGxpZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfU1VGRklYID0gIi5kZWxldGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0VOVFJZX05BTUUgPSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBGaWxlIGRlbHRhOwotCXByaXZhdGUgRmlsZSBiYXNlOwotCXByaXZhdGUgRmlsZSBkZXN0aW5hdGlvbjsKLQlwcml2YXRlIFppcEZpbGUgYmFzZUphcjsKLQlwcml2YXRlIFppcEZpbGUgZGVsdGFKYXI7Ci0JcHJpdmF0ZSBTZXQgYmFzZUVudHJpZXM7Ci0JcHJpdmF0ZSBaaXBGaWxlIG1hbmlmZXN0SmFyOwotCi0JcHVibGljIERlbHRhQXBwbGllcihGaWxlIGJhc2UsIEZpbGUgZGVsdGEsIEZpbGUgZGVzdGluYXRpb24pIHsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQkJdGhpcy5kZWx0YSA9IGRlbHRhOwotCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJaWYgKCFvcGVuSmFycygpKQotCQkJCXJldHVybjsKLQkJCWFwcGx5RGVsdGEoKTsKLQkJCXdyaXRlUmVzdWx0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zZUphcnMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseURlbHRhKCkgewotCQkvLyBzdGFydCBvdXQgYXNzdW1pbmcgdGhhdCBhbGwgdGhlIGJhc2UgZW50cmllcyB3aWxsIGJlIG1vdmVkIG92ZXIuICAKLQkJYmFzZUVudHJpZXMgPSBnZXRFbnRyaWVzKGJhc2VKYXIpOwotCQkvLyByZW1vdmUgZnJvbSB0aGUgYmFzZSBhbGwgdGhlIGVudHJpZXMgdGhhdCBhcHBlYXIgaW4gdGhlIGRlbHRhCi0JCWZvciAoRW51bWVyYXRpb24gZSA9IGRlbHRhSmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpKTsKLQkJCWNoZWNrRm9yTWFuaWZlc3QoZW50cnksIGRlbHRhSmFyKTsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZW5kc1dpdGgoREVMRVRFX1NVRkZJWCkpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIERFTEVURV9TVUZGSVgubGVuZ3RoKCkpOwotCQkJCS8vIGlmIHRoZSBtYW5pZmVzdCBpcyBiZWluZyBkZWxldGVkLCBmb3JnZXQgYW55b25lIHdobyBtaWdodCBoYXZlIGEgbWFuaWZlc3QKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BTklGRVNUX0VOVFJZX05BTUUpKQotCQkJCQltYW5pZmVzdEphciA9IG51bGw7Ci0JCQl9Ci0JCQliYXNlRW50cmllcy5yZW1vdmUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVSZXN1bHQoKSB7Ci0JCVppcE91dHB1dFN0cmVhbSByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKSk7Ci0JCQkJLy8gaWYgdGhlIGRlbHRhIGluY2x1ZGVzIHRoZSBtYW5pZmVzdCwgYmUgc3VyZSB0byB3cml0ZSBpdCBmaXJzdAotCQkJCWlmIChtYW5pZmVzdEphciAhPSBudWxsKQotCQkJCQl3cml0ZUVudHJ5KHJlc3VsdCwgbWFuaWZlc3RKYXIuZ2V0RW50cnkoTUFOSUZFU1RfRU5UUllfTkFNRSksIG1hbmlmZXN0SmFyLCB0cnVlKTsKLQkJCQkvLyB3cml0ZSBvdXQgdGhlIHRoaW5ncyB3ZSBrbm93IGFyZSBzdGF5aW5nIGZyb20gdGhlIGJhc2UgSkFSCi0JCQkJZm9yIChJdGVyYXRvciBpID0gYmFzZUVudHJpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVppcEVudHJ5IGVudHJ5ID0gYmFzZUphci5nZXRFbnRyeSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQkJCXdyaXRlRW50cnkocmVzdWx0LCBlbnRyeSwgYmFzZUphciwgZmFsc2UpOwotCQkJCX0KLQkJCQkvLyB3cml0ZSBvdXQgdGhlIGNoYW5nZXMvYWRkaXRpb25zIGZyb20gdGhlIGRlbHRhLgotCQkJCWZvciAoRW51bWVyYXRpb24gZSA9IGRlbHRhSmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJaWYgKCFlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoREVMRVRFX1NVRkZJWCkpCi0JCQkJCQl3cml0ZUVudHJ5KHJlc3VsdCwgZW50cnksIGRlbHRhSmFyLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCXJlc3VsdC5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRW50cnkoWmlwT3V0cHV0U3RyZWFtIHJlc3VsdCwgWmlwRW50cnkgZW50cnksIFppcEZpbGUgc291cmNlSmFyLCBib29sZWFuIG1hbmlmZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIW1hbmlmZXN0ICYmIGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1BTklGRVNUX0VOVFJZX05BTUUpKQotCQkJcmV0dXJuOwotCQkvLyBhZGQgdGhlIGVudHJ5Ci0JCXJlc3VsdC5wdXROZXh0RW50cnkoZW50cnkpOwotCQl0cnkgewotCQkJLy8gaWYgdGhlcmUgaXMgYSBzb3VyY2VKYXIgY29weSBvdmVyIHRoZSBjb250ZW50IGZvciB0aGUgZW50cnkgaW50byB0aGUgcmVzdWx0Ci0JCQlpZiAoc291cmNlSmFyICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IHNvdXJjZUphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJhbnNmZXJTdHJlYW1zKGNvbnRlbnRzLCByZXN1bHQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcmVzdWx0LmNsb3NlRW50cnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zZmVycyBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0byB0aGUgZ2l2ZW4KLQkgKiBvdXRwdXQgc3RyZWFtLiBEb2VzIG5vdCBjbG9zZSBlaXRoZXIgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZmVyU3RyZWFtcyhJbnB1dFN0cmVhbSBzb3VyY2UsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc291cmNlID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJZGVzdGluYXRpb24gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pOwotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gLTE7Ci0JCQkJaWYgKChieXRlc1JlYWQgPSBzb3VyY2UucmVhZChidWZmZXIpKSA9PSAtMSkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGVzdGluYXRpb24uZmx1c2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvcGVuSmFycygpIHsKLQkJdHJ5IHsKLQkJCWJhc2VKYXIgPSBuZXcgWmlwRmlsZShiYXNlKTsKLQkJCWRlbHRhSmFyID0gbmV3IFppcEZpbGUoZGVsdGEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSmFycygpIHsKLQkJaWYgKGJhc2VKYXIgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJYmFzZUphci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQlpZiAoZGVsdGFKYXIgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJZGVsdGFKYXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRFbnRyaWVzKFppcEZpbGUgamFyKSB7Ci0JCUhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoamFyLnNpemUoKSk7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IGphci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJY2hlY2tGb3JNYW5pZmVzdChlbnRyeSwgamFyKTsKLQkJCXJlc3VsdC5hZGQoZW50cnkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gZW50cnkgaXMgdGhlIG1hbmlmZXN0LiAgSWYgc28sIHJlbWVtYmVyIGl0IGZvciB1c2Ugd2hlbiB3cml0aW5nCi0JICogdGhlIHJlc3VsdGFudCBKQVIuCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHBhcmFtIGphcgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0Zvck1hbmlmZXN0KFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIGphcikgewotCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUFOSUZFU1RfRU5UUllfTkFNRSkpCi0JCQltYW5pZmVzdEphciA9IGphcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvSmFyRGVsdGFQcm9jZXNzb3JTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2phcmRlbHRhL0phckRlbHRhUHJvY2Vzc29yU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRkYTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvSmFyRGVsdGFQcm9jZXNzb3JTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmphcmRlbHRhOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogUHJvY2Vzc29yIHRoYXQgdGFrZXMgYSBKQVIgZGVsdGEgYW5kIGFwcGxpZXMgaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJEZWx0YVByb2Nlc3NvclN0ZXAgZXh0ZW5kcyBBYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcCB7Ci0KLQlwcml2YXRlIEZpbGUgaW5jb21pbmc7Ci0KLQlwdWJsaWMgSmFyRGVsdGFQcm9jZXNzb3JTdGVwKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlSW5jb21pbmdTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbmNvbWluZyA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoSU5DT01JTkdfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5jb21pbmcpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGVtcEZpbGVzKCkgewotCQlzdXBlci5jbGVhbnVwVGVtcEZpbGVzKCk7Ci0JCWlmIChpbmNvbWluZyAhPSBudWxsKQotCQkJaW5jb21pbmcuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJlc3VsdEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0RmlsZSA9IHByb2Nlc3MoKTsKLQkJCS8vIG5vdyB3cml0ZSB0aGUgb3B0aW1pemVkIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQlpZiAocmVzdWx0RmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlJbnB1dFN0cmVhbSByZXN1bHRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdEZpbGUpKTsKLQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShyZXN1bHRTdHJlYW0sIHRydWUsIGdldERlc3RpbmF0aW9uKCksIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRW1wdHkgb3B0aW1pemVkIGZpbGU6ICIgKyByZXN1bHRGaWxlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXN1bHRGaWxlICE9IG51bGwpCi0JCQkJcmVzdWx0RmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIHByb2Nlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHByZWRlY2Vzc29yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgcmVzdWx0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoUkVTVUxUX1JPT1QsIEpBUl9TVUZGSVgpOwotCQkJLy8gZ2V0IHRoZSBwcmVkZWNlc3NvciBhbmQgcGVyZm9ybSB0aGUgb3B0aW1pemF0aW9uIGludG8gYSB0ZW1wIGZpbGUKLQkJCXByZWRlY2Vzc29yID0gZmV0Y2hQcmVkZWNlc3NvcihuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSkpOwotCQkJbmV3IERlbHRhQXBwbGllcihwcmVkZWNlc3NvciwgaW5jb21pbmcsIHJlc3VsdEZpbGUpLnJ1bigpOwotCQkJcmV0dXJuIHJlc3VsdEZpbGU7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgcHJlZGVjZXNzb3IgYW5kIGl0IGlzIG91ciB0ZW1wIGZpbGUgdGhlbiBjbGVhbiB1cCB0aGUgZmlsZQotCQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwgJiYgcHJlZGVjZXNzb3IuZ2V0QWJzb2x1dGVQYXRoKCkuaW5kZXhPZihQUkVERUNFU1NPUl9ST09UKSA+IC0xKQotCQkJCXByZWRlY2Vzc29yLmRlbGV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamJkaWZmL0pCUGF0Y2hTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmJlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmY7Ci0KLWltcG9ydCBpZS53b21iYXQuamJkaWZmLkpCUGF0Y2g7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5BYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXIuRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIEpCUGF0Y2hTdGVwIHBhdGNoZXMgYSBKQkRpZmYgYmFzZWQgZGF0YS4gICAKLSAqLwotcHVibGljIGNsYXNzIEpCUGF0Y2hTdGVwIGV4dGVuZHMgQWJzdHJhY3REZWx0YVByb2Nlc3NvclN0ZXAgewotCi0JcHVibGljIEpCUGF0Y2hTdGVwKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlSW5jb21pbmdTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Qcm9jZXNzaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHByZWRlY2Vzc29yID0gZmV0Y2hQcmVkZWNlc3NvckJ5dGVzKG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KSk7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBjdXJyZW50ID0gKERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSkgaW5jb21pbmdTdHJlYW07Ci0JCWJ5dGVbXSByZXN1bHQgPSBKQlBhdGNoLmJzcGF0Y2gocHJlZGVjZXNzb3IuZ2V0QnVmZmVyKCksIHByZWRlY2Vzc29yLmdldEJ1ZmZlckxlbmd0aCgpLCBjdXJyZW50LmdldEJ1ZmZlcigpLCBjdXJyZW50LmdldEJ1ZmZlckxlbmd0aCgpKTsKLQkJLy8gZnJlZSB1cCB0aGUgbWVtb3J5IGFzIHNvb24gYXMgcG9zc2libGUuCi0JCXByZWRlY2Vzc29yID0gbnVsbDsKLQkJY3VycmVudCA9IG51bGw7Ci0JCWluY29taW5nU3RyZWFtID0gbnVsbDsKLQotCQkvLyBjb3B5IHRoZSByZXN1bHQgb2YgdGhlIG9wdGltaXphdGlvbiB0byB0aGUgZGVzdGluYXRpb24uCi0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQpLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZmV0Y2hQcmVkZWNlc3NvckJ5dGVzKEFydGlmYWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNldFN0YXR1cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0KGFydGlmYWN0RGVzY3JpcHRvciwgcmVzdWx0LCBnZXRQcm9ncmVzc01vbml0b3IoKSkpOwotCQlpZiAoIWdldFN0YXR1cygpLmlzT0soKSkKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgbmV3IElPRXhjZXB0aW9uKGdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSkuaW5pdENhdXNlKGdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFppcFN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamJkaWZmL0pCUGF0Y2haaXBTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWYyMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFppcFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmY7Ci0KLWltcG9ydCBpZS53b21iYXQuamJkaWZmLkpCUGF0Y2g7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLkRpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5TYXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIDxjb2RlPkpCUGF0Y2haaXBTdGVwPC9jb2RlPiBwYXRjaGVzIGEgSkJEaWZmIGJhc2VkIGRpZmYgb2Ygemlwcy9qYXJzLiAgIAotICovCi1wdWJsaWMgY2xhc3MgSkJQYXRjaFppcFN0ZXAgZXh0ZW5kcyBKQlBhdGNoU3RlcCB7Ci0KLQlwdWJsaWMgSkJQYXRjaFppcFN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJlZGVjZXNzb3IgPSBmZXRjaFByZWRlY2Vzc29yQnl0ZXMobmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpKTsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGN1cnJlbnQgPSAoRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKSBpbmNvbWluZ1N0cmVhbTsKLQkJYnl0ZVtdIHJlc3VsdCA9IEpCUGF0Y2guYnNwYXRjaChwcmVkZWNlc3Nvci5nZXRCdWZmZXIoKSwgcHJlZGVjZXNzb3IuZ2V0QnVmZmVyTGVuZ3RoKCksIGN1cnJlbnQuZ2V0QnVmZmVyKCksIGN1cnJlbnQuZ2V0QnVmZmVyTGVuZ3RoKCkpOwotCQkvLyBmcmVlIHVwIHRoZSBtZW1vcnkgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkJcHJlZGVjZXNzb3IgPSBudWxsOwotCQljdXJyZW50ID0gbnVsbDsKLQkJaW5jb21pbmdTdHJlYW0gPSBudWxsOwotCi0JCS8vIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgb3B0aW1pemF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbi4KLQkJU2FyVXRpbC5zYXJUb1ppcChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZldGNoUHJlZGVjZXNzb3JCeXRlcyhBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gemlwcGVkUHJlZGVjZXNzb3IgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNldFN0YXR1cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0KGFydGlmYWN0RGVzY3JpcHRvciwgemlwcGVkUHJlZGVjZXNzb3IsIGdldFByb2dyZXNzTW9uaXRvcigpKSk7Ci0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKS5pbml0Q2F1c2UoZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCkpOwotCi0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVNhclV0aWwuemlwVG9TYXIoemlwcGVkUHJlZGVjZXNzb3IuZ2V0SW5wdXRTdHJlYW0oKSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL3BhY2syMDAvUGFjazIwMFByb2Nlc3NvclN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvcGFjazIwMC9QYWNrMjAwUHJvY2Vzc29yU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGMwOTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvcGFjazIwMC9QYWNrMjAwUHJvY2Vzc29yU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnBhY2syMDA7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWJzdHJhY3RCdWZmZXJpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLlVucGFja1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnM7Ci0KLS8qKgotICogVGhlIFBhY2syMDBVbnBhY2tlciBleHBlY3RzIGFuIGlucHV0IGNvbnRhaW5pbmcgIi5qYXIucGFjay5neiIgZGF0YS4gICAKLSAqLwotcHVibGljIGNsYXNzIFBhY2syMDBQcm9jZXNzb3JTdGVwIGV4dGVuZHMgQWJzdHJhY3RCdWZmZXJpbmdTdGVwIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLRURfU1VGRklYID0gIi5wYWNrLmd6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGaWxlIGluY29taW5nOwotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWluY29taW5nID0gRmlsZS5jcmVhdGVUZW1wRmlsZShJTkNPTUlOR19ST09ULCBKQVJfU1VGRklYICsgUEFDS0VEX1NVRkZJWCk7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5jb21pbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQkJaWYgKCFVbnBhY2tTdGVwLmNhblVucGFjaygpKQotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiVW5wYWNrIGZhY2lsaXR5IG5vdCBjb25maWd1cmVkIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cFRlbXBGaWxlcygpIHsKLQkJc3VwZXIuY2xlYW51cFRlbXBGaWxlcygpOwotCQlpZiAoaW5jb21pbmcgIT0gbnVsbCkKLQkJCWluY29taW5nLmRlbGV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Qcm9jZXNzaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSByZXN1bHRGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdEZpbGUgPSBwcm9jZXNzKCk7Ci0JCQkvLyBub3cgd3JpdGUgdGhlIHByb2Nlc3NlZCBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbgotCQkJaWYgKHJlc3VsdEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSW5wdXRTdHJlYW0gcmVzdWx0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXN1bHRGaWxlKSk7Ci0JCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0ocmVzdWx0U3RyZWFtLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVtcHR5IGludGVybWVkaWF0ZSBmaWxlOiAiICsgcmVzdWx0RmlsZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzdWx0RmlsZSAhPSBudWxsKQotCQkJCXJlc3VsdEZpbGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBwcm9jZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQkJb3B0aW9ucy51bnBhY2sgPSB0cnVlOwotCQkvLyBUT0RPIHVzZSBmYWxzZSBoZXJlIGFzc3VtaW5nIHRoYXQgYWxsIGNvbnRlbnQgaXMgY29uZGl0aW9uZWQuICBOZWVkIHRvIHJldmlzZSB0aGlzCi0JCW9wdGlvbnMucHJvY2Vzc0FsbCA9IGZhbHNlOwotCQlvcHRpb25zLmlucHV0ID0gaW5jb21pbmc7Ci0JCW9wdGlvbnMub3V0cHV0RGlyID0gZ2V0V29ya0RpcigpLmdldFBhdGgoKTsKLQkJb3B0aW9ucy52ZXJib3NlID0gZmFsc2U7Ci0JCW5ldyBKYXJQcm9jZXNzb3JFeGVjdXRvcigpLnJ1bkphclByb2Nlc3NvcihvcHRpb25zKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGdldFdvcmtEaXIoKSwgaW5jb21pbmcuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBpbmNvbWluZy5nZXROYW1lKCkubGVuZ3RoKCkgLSBQQUNLRURfU1VGRklYLmxlbmd0aCgpKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvdmVyaWZpZXIvTUQ1VmVyaWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvdmVyaWZpZXIvTUQ1VmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNjFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL3ZlcmlmaWVyL01ENVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMudmVyaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgTUQ1VmVyaWZpZXIgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1kNVRlc3Q7Ci0JcHJpdmF0ZSBNZXNzYWdlRGlnZXN0IG1kNTsKLQotCXB1YmxpYyBNRDVWZXJpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTUQ1VmVyaWZpZXIoU3RyaW5nIG1kNVRlc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tZDVUZXN0ID0gbWQ1VGVzdDsKLQkJYmFzaWNJbml0aWFsaXplKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQlTdHJpbmcgZGF0YSA9IGRlc2NyaXB0b3IuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YS5lcXVhbHMoImRvd25sb2FkIikpCi0JCQltZDVUZXN0ID0gY29udGV4dC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX01ENSk7Ci0JCWVsc2UgaWYgKGRhdGEuZXF1YWxzKCJhcnRpZmFjdCIpKQotCQkJbWQ1VGVzdCA9IGNvbnRleHQuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9NRDUpOwotCQllbHNlCi0JCQltZDVUZXN0ID0gZGF0YTsKLQkJYmFzaWNJbml0aWFsaXplKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0luaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaW50IGNvZGUgPSAoZGVzY3JpcHRvciA9PSBudWxsKSA/IElTdGF0dXMuRVJST1IgOiBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCWlmIChtZDVUZXN0ID09IG51bGwgfHwgbWQ1VGVzdC5sZW5ndGgoKSAhPSAzMikKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIk1ENSB2YWx1ZSBub3QgYXZhaWxhYmxlIG9yIGluY29ycmVjdCBzaXplIikpOwotCQl0cnkgewotCQkJbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0JCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBBY3RpdmF0b3IuSUQsICJDb3VsZCBub3QgY3JlYXRlIE1ENSBhbGdvcml0aG0iLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGIgIT0gLTEpCi0JCQltZDUudXBkYXRlKChieXRlKSBiKTsKLQkJZ2V0RGVzdGluYXRpb24oKS53cml0ZShiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0KLQkJYnl0ZVtdIGRpZ2VzdCA9IG1kNS5kaWdlc3QoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdlc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoZGlnZXN0W2ldICYgMHhGRikgPCAweDEwKQotCQkJCWJ1Zi5hcHBlbmQoJzAnKTsKLQkJCWJ1Zi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhkaWdlc3RbaV0gJiAweEZGKSk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgaGFzaGVzIGRvbid0IGxpbmUgdXAgc2V0IHRoZSBzdGF0dXMgdG8gZXJyb3IuCi0JCWlmICghYnVmLnRvU3RyaW5nKCkuZXF1YWxzKG1kNVRlc3QpKQotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgcHJvY2Vzc2luZyBzdHJlYW0uIE1ENSBoYXNoIGlzIG5vdCBhcyBleHBlY3RlZC4iKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmI3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMwOTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzYjgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotI1RodSBGZWIgMjEgMTU6Mzc6MjQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDZkODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNUdWUgQXVnIDIxIDExOjI3OjQ4IENEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkKLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5ZTRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz10cnVlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmMzMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5taXJyb3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ci1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLnBhcnNlcnMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3I7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnByZWZzO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy53M2MuZG9tLAotIG9yZy54bWwuc2F4O3Jlc29sdXRpb246PW9wdGlvbmFsCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLAotIG9yZy5lY2xpcHNlLmVjZiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Ci1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU4NWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3AyIHRvb2xzIC0gbWlycm9yIGFydGlmYWN0cy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9wMiB0b29scyAtIG1pcnJvciBhcnRpZmFjdHMubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTlmMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3AyIHRvb2xzIC0gbWlycm9yIGFydGlmYWN0cy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wMiB0b29scyAtIG1pcnJvciBhcnRpZmFjdHMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAtY29uc29sZWxvZyAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy5taXJyb3JBcHBsaWNhdGlvbiYjMTM7JiMxMDstc291cmNlIGh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL3Rlc3RVcGRhdGVzJiMxMzsmIzEwOy1kZXN0aW5hdGlvbiBmaWxlOmQ6L3RtcC9lcXVpbm94LnAyL3NlcnZlcnMubWlycm9yIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJqYXZheC5zZXJ2bGV0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaUA6LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2ZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29sc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3JAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdmNWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBBcnRpZmFjdCBSZXBvc2l0b3J5IFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4OGZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhcnRpZmFjdFJlcG9zaXRvcmllcyIgbmFtZT0iQXJ0aWZhY3QgUmVwb3NpdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9hcnRpZmFjdFJlcG9zaXRvcmllcy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcm9jZXNzaW5nU3RlcHMiIG5hbWU9IlByb2Nlc3NpbmcgU3RlcHMiIHNjaGVtYT0ic2NoZW1hL3Byb2Nlc3NpbmdTdGVwcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24gaWQ9InNpbXBsZVJlcG9zaXRvcnkiICBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LmFydGlmYWN0UmVwb3NpdG9yaWVzIj4KLQkJPGZpbHRlciBzdWZmaXg9ImFydGlmYWN0cy54bWwiLz4KLQkJPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSIvPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuU2lnbmF0dXJlVmVyaWZpZXIiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LlNpZ25hdHVyZVZlcmlmaWVyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gaWQ9Im1pcnJvckFwcGxpY2F0aW9uIiAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uIGNhcmRpbmFsaXR5PSIxIiB0aHJlYWQ9Im1haW4iIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5taXJyb3IuTWlycm9yQXBwbGljYXRpb24iLz4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc2NoZW1hL2FydGlmYWN0UmVwb3NpdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvYXJ0aWZhY3RSZXBvc2l0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjMGFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvYXJ0aWZhY3RSZXBvc2l0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIgaWQ9ImFydGlmYWN0UmVwb3NpdG9yaWVzIiBuYW1lPSJBcnRpZmFjdCBSZXBvc2l0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGFydGlmYWN0IHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5Jmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbHRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN1ZmZpeCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IDAuMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSBtdXN0IHJlcHJlc2VudCBhbiAKLWltcGxlbWVudG9yIG9mICZsdDt0dCZndDtvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeSZsdDsvdHQmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLWFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvcHJvY2Vzc2luZ1N0ZXBzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvcHJvY2Vzc2luZ1N0ZXBzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGJiMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc2NoZW1hL3Byb2Nlc3NpbmdTdGVwcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IiBpZD0icHJvY2Vzc2luZ1N0ZXBzIiBuYW1lPSJQcm9jZXNzaW5nIFN0ZXBzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBwcm9jZXNzaW5nIHN0ZXAgaW1wbGVtZW50YXRpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0ZXAiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3RlcCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSA/Lj8uPwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCByZXByZXNlbnQgYW4gCi1pbXBsZW1lbnRvciBvZiAmbHQ7dHQmZ3Q7b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzaW5nLklQcm9jZXNzaW5nU3RlcCZsdDsvdHQmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLWFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9taXJyb3IvTWlycm9yQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L21pcnJvci9NaXJyb3JBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjM1MTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L21pcnJvci9NaXJyb3JBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm1pcnJvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBhcHBsaWNhdGlvbiB0aGF0IHBlcmZvcm1zIG1pcnJvcmluZyBvZiBhcnRpZmFjdHMgYmV0d2VlbiByZXBvc2l0b3JpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXJyb3JBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0KLQlwcml2YXRlIFVSTCBzb3VyY2VMb2NhdGlvbjsKLQlwcml2YXRlIFVSTCBkZXN0aW5hdGlvbkxvY2F0aW9uOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBzb3VyY2U7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBhcHBlbmQ7Ci0JcHJpdmF0ZSBib29sZWFuIHJhdyA9IGZhbHNlOwotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNYXAgYXJncyA9IGNvbnRleHQuZ2V0QXJndW1lbnRzKCk7Ci0JCWluaXRpYWxpemVGcm9tQXJndW1lbnRzKChTdHJpbmdbXSkgYXJncy5nZXQoImFwcGxpY2F0aW9uLmFyZ3MiKSk7Ci0JCXNldHVwUmVwb3NpdG9yaWVzKCk7Ci0JCW5ldyBNaXJyb3Jpbmcoc291cmNlLCBkZXN0aW5hdGlvbiwgcmF3KS5ydW4oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwUmVwb3NpdG9yaWVzKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuOwotCi0JCXNvdXJjZSA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkoc291cmNlTG9jYXRpb24sIG51bGwpOwotCQlpZiAoZGVzdGluYXRpb25Mb2NhdGlvbiAhPSBudWxsKQotCQkJZGVzdGluYXRpb24gPSBpbml0aWFsaXplRGVzdGluYXRpb24oKTsKLQkJZWxzZQotCQkJZGVzdGluYXRpb24gPSBzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGluaXRpYWxpemVEZXN0aW5hdGlvbigpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkoZGVzdGluYXRpb25Mb2NhdGlvbiwgbnVsbCk7Ci0JCQlpZiAoIXJlcG9zaXRvcnkuaXNNb2RpZmlhYmxlKCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJ0aWZhY3QgcmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZTogIiArIGRlc3RpbmF0aW9uTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWFwcGVuZCkKLQkJCQlyZXBvc2l0b3J5LnJlbW92ZUFsbCgpOwotCQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkgYmVsb3cKLQkJfQotCQkvLyAJdGhlIGdpdmVuIHJlcG8gbG9jYXRpb24gaXMgbm90IGFuIGV4aXN0aW5nIHJlcG8gc28gd2UgaGF2ZSB0byBjcmVhdGUgc29tZXRoaW5nCi0JCS8vIFRPRE8gZm9yIG5vdyBjcmVhdGUgYSBTaW1wbGUgcmVwbyBieSBkZWZhdWx0LgotCQlTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPSBkZXN0aW5hdGlvbkxvY2F0aW9uICsgIiAtIGFydGlmYWN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KGRlc3RpbmF0aW9uTG9jYXRpb24sIHJlcG9zaXRvcnlOYW1lLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSk7Ci0JCXJldHVybiByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcmF3IikpCi0JCQkJcmF3ID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgCi0JCQkvLyBpZiB0aGUgbmV4dCBvbmUgaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSAKLQkJCS8vIGFuIGFyZyB3aXRoIGEgcGFyYW0gc28gY29udGludWUuCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXNvdXJjZSIpKQotCQkJCXNvdXJjZUxvY2F0aW9uID0gbmV3IFVSTChhcmcpOwotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1kZXN0aW5hdGlvbiIpKQotCQkJCWRlc3RpbmF0aW9uTG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9taXJyb3IvTWlycm9yaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9taXJyb3IvTWlycm9yaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGM5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvbWlycm9yL01pcnJvcmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSB2YXJpb3VzIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgdGhhdCBwZXJmb3JtcyBtaXJyb3Jpbmcgb2YgYXJ0aWZhY3RzIGJldHdlZW4gcmVwb3NpdG9yaWVzLgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yaW5nIHsKLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc291cmNlOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gcmF3OwotCi0JcHVibGljIE1pcnJvcmluZyhJQXJ0aWZhY3RSZXBvc2l0b3J5IHNvdXJjZSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiwgYm9vbGVhbiByYXcpIHsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJdGhpcy5yYXcgPSByYXc7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWRlc3RpbmF0aW9uLmlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGVzdGluYXRpb24gcmVwb3NpdG9yeSBtdXN0IGJlIG1vZGlmaWFibGU6ICIgKyBkZXN0aW5hdGlvbi5nZXRMb2NhdGlvbigpKTsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHNvdXJjZS5nZXRBcnRpZmFjdEtleXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0ga2V5c1tpXTsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHNvdXJjZS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKQotCQkJCW1pcnJvcihkZXNjcmlwdG9yc1tqXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWlycm9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSByYXcgPyBkZXNjcmlwdG9yIDogbmV3IEFydGlmYWN0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSByZXBvc2l0b3J5U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXJyb3Jpbmc6ICIgKyBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwb3NpdG9yeVN0cmVhbSA9IGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbShuZXdEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVwb3NpdG9yeVN0cmVhbSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gVE9ETyBJcyB0aGF0IG9rIHRvIGlnbm9yZSB0aGUgcmVzdWx0PwotCQkJCXNvdXJjZS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCByZXBvc2l0b3J5U3RyZWFtLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlcG9zaXRvcnlTdHJlYW0gIT0gbnVsbCkKLQkJCQkJcmVwb3NpdG9yeVN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBJcyB0aGF0IG9rIHRvIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIElzIHRoYXQgb2sgdG8gaWdub3JlIHRoZSBleGNlcHRpb24KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDQ3ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotCi0vKioKLSAqIENvbW1vbiBjb2RlIHNoYXJlZCBiZXR3ZWVuIGFydGlmYWN0IGFuZCBtZXRhZGF0YSByZXBvc2l0b3J5IG1hbmFnZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RSZXBvc2l0b3J5TWFuYWdlciB7Ci0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlRXZlbnQoVVJMIGxvY2F0aW9uLCBpbnQgcmVwb3NpdG9yeVR5cGUsIGludCBraW5kKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChsb2NhdGlvbiwgcmVwb3NpdG9yeVR5cGUsIGtpbmQpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDExNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT19QUk9WSURFUl9YUFQgPSBJRCArICcuJyArICJhcnRpZmFjdFJlcG9zaXRvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVwb3NpdG9yeU1hbmFnZXJSZWdpc3RyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIEFjdGl2YXRvci5jb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQkJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciByZXBvc2l0b3J5TWFuYWdlciA9IG5ldyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCXJlcG9zaXRvcnlNYW5hZ2VyUmVnaXN0cmF0aW9uID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCByZXBvc2l0b3J5TWFuYWdlciwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JCWlmIChyZXBvc2l0b3J5TWFuYWdlclJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJcmVwb3NpdG9yeU1hbmFnZXJSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotCQlyZXBvc2l0b3J5TWFuYWdlclJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg4NzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkNvbmZpZ3VyYXRpb25TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlLlNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqIAotICogVE9ETyB0aGUgY3VycmVudCBhc3N1bXB0aW9uIHRoYXQgdGhlICJsb2NhdGlvbiIgaXMgdGhlIGRpci9yb290IGxpbWl0cyB1cyB0byAKLSAqIGhhdmluZyBqdXN0IG9uZSByZXBvc2l0b3J5IGluIGEgZ2l2ZW4gVVJMLi4gIAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeU1hbmFnZXIgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciwgUHJvdmlzaW9uaW5nTGlzdGVuZXIgewotCXN0YXRpYyBjbGFzcyBSZXBvc2l0b3J5SW5mbyB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJYm9vbGVhbiBpc1N5c3RlbSA9IGZhbHNlOwotCQlVUkwgbG9jYXRpb247Ci0JCVN0cmluZyBuYW1lOwotCQlTb2Z0UmVmZXJlbmNlIHJlcG9zaXRvcnk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VGRklYID0gInN1ZmZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVUZGSVggPSAiYXJ0aWZhY3RzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1ZJREVSID0gInByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1lTVEVNID0gImlzU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SRVBPU0lUT1JJRVMgPSAicmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFwIG9mIFN0cmluZy0+UmVwb3NpdG9yeUluZm8sIHdoZXJlIFN0cmluZyBpcyB0aGUgcmVwb3NpdG9yeSBrZXkKLQkgKiBvYnRhaW5lZCB2aWEgZ2V0S2V5KFVSTCkuCi0JICovCi0JcHJpdmF0ZSBNYXAgcmVwb3NpdG9yaWVzID0gbnVsbDsKLQkvL2xvY2sgb2JqZWN0IHRvIGJlIGhlbGQgd2hlbiByZWZlcnJpbmcgdG8gdGhlIHJlcG9zaXRvcmllcyBmaWVsZAotCXByaXZhdGUgZmluYWwgT2JqZWN0IHJlcG9zaXRvcnlMb2NrID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogQ2FjaGUgTGlzdCBvZiByZXBvc2l0b3JpZXMgdGhhdCBhcmUgbm90IHJlYWNoYWJsZS4gTWFpbnRhaW4gY2FjaGUKLQkgKiBmb3Igc2hvcnQgZHVyYXRpb24gYmVjYXVzZSByZXBvc2l0b3J5IG1heSBiZWNvbWUgYXZhaWxhYmxlIGF0IGFueSB0aW1lLgotCSAqLwotCXByaXZhdGUgU29mdFJlZmVyZW5jZSB1bmF2YWlsYWJsZVJlcG9zaXRvcmllczsKLQotCXB1YmxpYyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkgewotCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoYnVzICE9IG51bGwpCi0JCQlidXMuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCS8vaW5pdGlhbGl6ZSByZXBvc2l0b3JpZXMgbGF6aWx5Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mbygpOwotCQlpbmZvLnJlcG9zaXRvcnkgPSBuZXcgU29mdFJlZmVyZW5jZShyZXBvc2l0b3J5KTsKLQkJaW5mby5uYW1lID0gcmVwb3NpdG9yeS5nZXROYW1lKCk7Ci0JCWluZm8uZGVzY3JpcHRpb24gPSByZXBvc2l0b3J5LmdldERlc2NyaXB0aW9uKCk7Ci0JCWluZm8ubG9jYXRpb24gPSByZXBvc2l0b3J5LmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSk7Ci0JCWluZm8uaXNTeXN0ZW0gPSB2YWx1ZSA9PSBudWxsID8gZmFsc2UgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQlib29sZWFuIGFkZGVkID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWFkZGVkID0gcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkocmVwb3NpdG9yeSksIGluZm8pID09IG51bGw7Ci0JCX0KLQkJLy8gc2F2ZSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBpbiB0aGUgcHJlZmVyZW5jZXMuCi0JCXJlbWVtYmVyKHJlcG9zaXRvcnkpOwotCQlpZiAoYWRkZWQpCi0JCQlicm9hZGNhc3RDaGFuZ2VFdmVudChyZXBvc2l0b3J5LmdldExvY2F0aW9uKCksIElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QsIFJlcG9zaXRvcnlFdmVudC5BRERFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChsb2NhdGlvbik7Ci0JCVJlcG9zaXRvcnlJbmZvIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJaW5mby5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQlib29sZWFuIGFkZGVkID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWFkZGVkID0gcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkobG9jYXRpb24pLCBpbmZvKSA9PSBudWxsOwotCQl9Ci0JCS8vIHNhdmUgdGhlIGdpdmVuIHJlcG9zaXRvcnkgaW4gdGhlIHByZWZlcmVuY2VzLgotCQlyZW1lbWJlcihpbmZvKTsKLQkJaWYgKGFkZGVkKQotCQkJYnJvYWRjYXN0Q2hhbmdlRXZlbnQobG9jYXRpb24sIElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QsIFJlcG9zaXRvcnlFdmVudC5BRERFRCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgd2UgcmVjZW50bHkgYXR0ZW1wdGVkIHRvIGxvYWQgdGhlIGdpdmVuIGxvY2F0aW9uIGFuZCBmYWlsZWQKLQkgKiB0byBmaW5kIGFueXRoaW5nLiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5IHdhcyBub3QKLQkgKiBmb3VuZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTm90Rm91bmQoVVJMIGxvY2F0aW9uKSB7Ci0JCWlmICh1bmF2YWlsYWJsZVJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQlpZiAoYmFkUmVwb3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJhZFJlcG9zLmNvbnRhaW5zKGxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZmFjdCB0aGF0IHdlIHRyaWVkIHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IHRoaXMgbG9jYXRpb24gYW5kIGRpZCBub3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJTGlzdCBiYWRSZXBvczsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCWJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQkJaWYgKGJhZFJlcG9zICE9IG51bGwpIHsKLQkJCQliYWRSZXBvcy5yZW1vdmUobG9jYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZURvd25sb2FkUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJUGF0aCBkZXN0aW5hdGlvbikgewotCQlyZXR1cm4gbmV3IEZpbGVEb3dubG9hZFJlcXVlc3Qoa2V5LCBkZXN0aW5hdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciBsb2FkaW5nIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiTWFsZm9ybWVkIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcXVlc3QgY3JlYXRlTWlycm9yUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVNaXJyb3JSZXF1ZXN0KGtleSwgZGVzdGluYXRpb24sIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZU1pcnJvclJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiwgUHJvcGVydGllcyBkZXN0aW5hdGlvbkRlc2NyaXB0b3JQcm9wZXJ0aWVzLCBQcm9wZXJ0aWVzIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG5ldyBNaXJyb3JSZXF1ZXN0KGtleSwgZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uRGVzY3JpcHRvclByb3BlcnRpZXMsIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJbG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIChJUHJvZ3Jlc3NNb25pdG9yKSBudWxsKTsKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0VYSVNUUyk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkIC0gZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uKEFjdGl2YXRvci5SRVBPX1BST1ZJREVSX1hQVCwgdHlwZSk7Ci0JCWlmIChleHRlbnNpb24gPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX1VOS05PV05fVFlQRSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSAoSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkpIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZXh0ZW5zaW9uLCBFTF9GQUNUT1JZKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFEKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZShsb2NhdGlvbiwgbmFtZSwgdHlwZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFEKTsKLQkJY2xlYXJOb3RGb3VuZChyZXN1bHQuZ2V0TG9jYXRpb24oKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZhaWwoVVJMIGxvY2F0aW9uLCBpbnQgY29kZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRVhJU1RTIDoKLQkJCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2V4aXN0cywgbG9jYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9VTktOT1dOX1RZUEUgOgotCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5fdW5rbm93blR5cGUsIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQgOgotCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5fZmFpbGVkUmVhZCwgbG9jYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQgOgotCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5fbm90RXhpc3RzLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJbXNnID0gTWVzc2FnZXMucmVwb01hbl9pbnRlcm5hbEVycm9yOwotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBjb2RlLCBtc2csIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIElFeHRlbnNpb25bXSBmaW5kTWF0Y2hpbmdSZXBvc2l0b3J5RXh0ZW5zaW9ucyhTdHJpbmcgc3VmZml4KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsdCA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKEVMX0ZJTFRFUi5lcXVhbHMoZWx0W2ldLmdldE5hbWUoKSkpIHsKLQkJCQlpZiAoIXN1ZmZpeC5lcXVhbHMoZWx0W2ldLmdldEF0dHJpYnV0ZShBVFRSX1NVRkZJWCkpKSB7Ci0JCQkJCWVsdFtpXSA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVsdFtpXSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJSUV4dGVuc2lvbltdIHJlc3VsdHMgPSBuZXcgSUV4dGVuc2lvbltjb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWx0W2ldICE9IG51bGwpCi0JCQkJcmVzdWx0c1stLWNvdW50XSA9IGVsdFtpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldEFsbFN1ZmZpeGVzKCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOwotCQlyZXN1bHQuYWRkKERFRkFVTFRfU1VGRklYKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoRUxfRklMVEVSKSkgewotCQkJCVN0cmluZyBzdWZmaXggPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoQVRUUl9TVUZGSVgpOwotCQkJCWlmICghcmVzdWx0LmNvbnRhaW5zKHN1ZmZpeCkpCi0JCQkJCXJlc3VsdC5hZGQoc3VmZml4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhbiBlbmNvZGVkIHJlcG9zaXRvcnkga2V5IHRoYXQgaXMgc3VpdGFibGUgZm9yIHVzaW5nCi0JICogYXMgdGhlIG5hbWUgb2YgYSBwcmVmZXJlbmNlIG5vZGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlyZXR1cm4gZ2V0S2V5KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcga2V5IGJhc2VkIG9uIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uIHdoaWNoCi0JICogaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhIHByZWZlcmVuY2Ugbm9kZSBuYW1lLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEtleShVUkwgbG9jYXRpb24pIHsKLQkJcmV0dXJuIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZSgnLycsICdfJyk7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldEtub3duUmVwb3NpdG9yaWVzKGludCBmbGFncykgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG1hdGNoZXNGbGFncyhpbmZvLCBmbGFncykpCi0JCQkJCXJlc3VsdC5hZGQoaW5mby5sb2NhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKFVSTFtdKSByZXN1bHQudG9BcnJheShuZXcgVVJMW3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSByb290IHByZWZlcmVuY2Ugbm9kZSB3aGVyZSB3ZSBzdG9yZSB0aGUgcmVwb3NpdG9yeSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25TY29wZSgpLmdldE5vZGUoQWN0aXZhdG9yLklEKS5ub2RlKE5PREVfUkVQT1NJVE9SSUVTKTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChVUkxVdGlsLnNhbWVVUkwoaW5mby5sb2NhdGlvbiwgbG9jYXRpb24pKSB7Ci0JCQkJCWlmIChpbmZvLnJlcG9zaXRvcnkgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gPSAoSUFydGlmYWN0UmVwb3NpdG9yeSkgaW5mby5yZXBvc2l0b3J5LmdldCgpOwotCQkJCQkvL3VwZGF0ZSBvdXIgcmVwb3NpdG9yeSBpbmZvIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgbWF5IGhhdmUgY2hhbmdlZAotCQkJCQlpZiAocmVwbyAhPSBudWxsKQotCQkJCQkJYWRkUmVwb3NpdG9yeShyZXBvKTsKLQkJCQkJcmV0dXJuIHJlcG87Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciNnZXRSZXBvc2l0b3J5UHJvcGVydHkoamF2YS5uZXQuVVJMLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVByb3BlcnR5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIGtleSkgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChVUkxVdGlsLnNhbWVVUkwoaW5mby5sb2NhdGlvbiwgbG9jYXRpb24pKSB7Ci0JCQkJCWlmIChJUmVwb3NpdG9yeS5QUk9QX0RFU0NSSVBUSU9OLmVxdWFscyhrZXkpKQotCQkJCQkJcmV0dXJuIGluZm8uZGVzY3JpcHRpb247Ci0JCQkJCWlmIChJUmVwb3NpdG9yeS5QUk9QX05BTUUuZXF1YWxzKGtleSkpCi0JCQkJCQlyZXR1cm4gaW5mby5uYW1lOwotCQkJCQkvLyBLZXkgbm90IGtub3duLCByZXR1cm4gbnVsbAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBSZXBvc2l0b3J5IG5vdCBmb3VuZCwgcmV0dXJuIG51bGwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBtb25pdG9yCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVzdWx0ID0gZ2V0UmVwb3NpdG9yeShsb2NhdGlvbik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChjaGVja05vdEZvdW5kKGxvY2F0aW9uKSkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCk7Ci0JCVN0cmluZ1tdIHN1ZmZpeGVzID0gZ2V0QWxsU3VmZml4ZXMoKTsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgc3VmZml4ZXMubGVuZ3RoICogMTAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0ID0gbG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIHN1ZmZpeGVzW2ldLCBzdWIubmV3Q2hpbGQoMTAwKSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlhZGRSZXBvc2l0b3J5KHJlc3VsdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZW1lbWJlck5vdEZvdW5kKGxvY2F0aW9uKTsKLQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGxvYWRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIHN1ZmZpeCwgU3ViTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlFeHRlbnNpb25bXSBwcm92aWRlcnMgPSBmaW5kTWF0Y2hpbmdSZXBvc2l0b3J5RXh0ZW5zaW9ucyhzdWZmaXgpOwotCQkvLyBMb29wIG92ZXIgdGhlIGNhbmRpZGF0ZXMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lIHRoYXQgc3VjY2Vzc2Z1bGx5IGxvYWRzCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBwcm92aWRlcnMubGVuZ3RoICogMTApOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gKElBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5KSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKHByb3ZpZGVyc1tpXSwgRUxfRkFDVE9SWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhY3RvcnkubG9hZChsb2NhdGlvbiwgbW9uaXRvci5uZXdDaGlsZCgxMCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCkKLQkJCQkJbG9nKCJVbmFibGUgdG8gbG9hZCByZXBvc2l0b3J5OiAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgdCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzRmxhZ3MoUmVwb3NpdG9yeUluZm8gaW5mbywgaW50IGZsYWdzKSB7Ci0JCWlmICgoZmxhZ3MgJiBSRVBPU0lUT1JJRVNfU1lTVEVNKSA9PSBSRVBPU0lUT1JJRVNfU1lTVEVNKQotCQkJaWYgKCFpbmZvLmlzU3lzdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKChmbGFncyAmIFJFUE9TSVRPUklFU19OT05fU1lTVEVNKSA9PSBSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSkKLQkJCWlmIChpbmZvLmlzU3lzdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKChmbGFncyAmIFJFUE9TSVRPUklFU19MT0NBTCkgPT0gUkVQT1NJVE9SSUVTX0xPQ0FMKQotCQkJcmV0dXJuICJmaWxlIi5lcXVhbHMoaW5mby5sb2NhdGlvbi5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKihub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5Qcm92aXNpb25pbmdMaXN0ZW5lciNub3RpZnkoamF2YS51dGlsLkV2ZW50T2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgUmVwb3NpdG9yeUV2ZW50KSB7Ci0JCQlSZXBvc2l0b3J5RXZlbnQgZXZlbnQgPSAoUmVwb3NpdG9yeUV2ZW50KSBvOwotCQkJaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBSZXBvc2l0b3J5RXZlbnQuRElTQ09WRVJFRCAmJiBldmVudC5nZXRSZXBvc2l0b3J5VHlwZSgpID09IElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QpCi0JCQkJYWRkUmVwb3NpdG9yeShldmVudC5nZXRSZXBvc2l0b3J5TG9jYXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgcHJlZmVyZW5jZSBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZQotCSAqIHdhcyBhY3R1YWxseSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwdXRWYWx1ZShQcmVmZXJlbmNlcyBub2RlLCBTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbm9kZS5nZXQoa2V5LCBudWxsKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8IChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5vZGUucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCW5vZGUucHV0KGtleSwgbmV3VmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSByZWZyZXNoUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWNsZWFyTm90Rm91bmQobG9jYXRpb24pOwotCQlpZiAoIXJlbW92ZVJlcG9zaXRvcnkobG9jYXRpb24pKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKTsKLQkJcmV0dXJuIGxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBvYmplY3QgdG8gdGhlIHByZWZlcmVuY2VzIGFuZCBzYXZlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1lbWJlcihJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcmVmZXJlbmNlcygpLm5vZGUoZ2V0S2V5KHJlcG9zaXRvcnkpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfVVJMLCByZXBvc2l0b3J5LmdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX0RFU0NSSVBUSU9OLCByZXBvc2l0b3J5LmdldERlc2NyaXB0aW9uKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9OQU1FLCByZXBvc2l0b3J5LmdldE5hbWUoKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1BST1ZJREVSLCByZXBvc2l0b3J5LmdldFByb3ZpZGVyKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9UWVBFLCByZXBvc2l0b3J5LmdldFR5cGUoKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1ZFUlNJT04sIHJlcG9zaXRvcnkuZ2V0VmVyc2lvbigpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfU1lTVEVNLCAoU3RyaW5nKSByZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKS5nZXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0pKTsKLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlVG9QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbWVtYmVyKFJlcG9zaXRvcnlJbmZvIGluZm8pIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcmVmZXJlbmNlcygpLm5vZGUoZ2V0S2V5KGluZm8ubG9jYXRpb24pKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfVVJMLCBpbmZvLmxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9TWVNURU0sIEJvb2xlYW4udG9TdHJpbmcoaW5mby5pc1N5c3RlbSkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9ERVNDUklQVElPTiwgaW5mby5kZXNjcmlwdGlvbik7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX05BTUUsIGluZm8ubmFtZSk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgZmFjdCB0aGF0IHdlIHRyaWVkIHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IHRoaXMgbG9jYXRpb24gYW5kIGRpZCBub3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtZW1iZXJOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJTGlzdCBiYWRSZXBvczsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCWJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQkJaWYgKGJhZFJlcG9zICE9IG51bGwpIHsKLQkJCQliYWRSZXBvcy5hZGQobG9jYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQliYWRSZXBvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYmFkUmVwb3MuYWRkKGxvY2F0aW9uKTsKLQkJdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMgPSBuZXcgU29mdFJlZmVyZW5jZShiYWRSZXBvcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUmVwb3NpdG9yeShVUkwgdG9SZW1vdmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0b1JlbW92ZSk7Ci0JCWZpbmFsIFN0cmluZyByZXBvS2V5ID0gZ2V0S2V5KHRvUmVtb3ZlKTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvc2l0b3JpZXMucmVtb3ZlKHJlcG9LZXkpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIHJlbW92ZSB0aGUgcmVwb3NpdG9yeSBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCXRyeSB7Ci0JCQlnZXRQcmVmZXJlbmNlcygpLm5vZGUocmVwb0tleSkucmVtb3ZlTm9kZSgpOwotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igc2F2aW5nIHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlicm9hZGNhc3RDaGFuZ2VFdmVudCh0b1JlbW92ZSwgSVJlcG9zaXRvcnkuVFlQRV9BUlRJRkFDVCwgUmVwb3NpdG9yeUV2ZW50LlJFTU9WRUQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZURvd25sb2FkQ2FjaGUoKSB7Ci0JCS8vIFRPRE8gd2hpbGUgcmVjcmVhdGluZywgd2UgbWF5IHdhbnQgdG8gaGF2ZSBwcm94aWVzIG9uIHJlcG8gaW5zdGVhZCBvZiB0aGUgcmVhbCByZXBvIG9iamVjdCB0byBsaW1pdCB3aGF0IGlzIGFjdGl2YXRlZC4KLQkJQWdlbnRMb2NhdGlvbiBsb2NhdGlvbiA9IChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCS8vIFRPRE8gc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlIHNpbmNlIHdlIGFyZSBmYWlsaW5nIHRvIHJlc3RvcmUuCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgY2FjaGUgPSAoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBjcmVhdGVSZXBvc2l0b3J5KGxvY2F0aW9uLmdldEFydGlmYWN0UmVwb3NpdG9yeVVSTCgpLCAiZG93bmxvYWQgY2FjaGUiLCBUWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkUmVwb3NpdG9yeShjYWNoZSk7Ci0JCQljYWNoZS5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qCi0JICogTG9hZCB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVGcm9tUHJlZmVyZW5jZXMoKSB7Ci0JCS8vIHJlc3RvcmUgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZ1tdIGNoaWxkcmVuOwotCQl0cnkgewotCQkJY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuTmFtZXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3IgcmVzdG9yaW5nIHJlcG9zaXRvcmllcyBmcm9tIHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcmVmZXJlbmNlcyBjaGlsZCA9IG5vZGUubm9kZShjaGlsZHJlbltpXSk7Ci0JCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBjaGlsZC5nZXQoS0VZX1VSTCwgbnVsbCk7Ci0JCQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mbygpOwotCQkJCWluZm8ubG9jYXRpb24gPSBuZXcgVVJMKGxvY2F0aW9uU3RyaW5nKTsKLQkJCQlpbmZvLm5hbWUgPSBjaGlsZC5nZXQoS0VZX05BTUUsIG51bGwpOwotCQkJCWluZm8uZGVzY3JpcHRpb24gPSBjaGlsZC5nZXQoS0VZX0RFU0NSSVBUSU9OLCBudWxsKTsKLQkJCQlpbmZvLmlzU3lzdGVtID0gY2hpbGQuZ2V0Qm9vbGVhbihLRVlfU1lTVEVNLCBmYWxzZSk7Ci0JCQkJcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkoaW5mby5sb2NhdGlvbiksIGluZm8pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coIkVycm9yIHdoaWxlIHJlc3RvcmluZyByZXBvc2l0b3J5OiAiICsgbG9jYXRpb25TdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBsb2FkZWQgZXZlcnl0aGluZywgcmVtZW1iZXIgdGhlbQotCQlzYXZlVG9QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVN5c3RlbVByb3BlcnR5KCkgewotCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmFydGlmYWN0UmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvblN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvblN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhZGRSZXBvc2l0b3J5KG5ldyBVUkwodG9rZW5pemVyLm5leHRUb2tlbigpKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciB3aGlsZSByZXN0b3JpbmcgcmVwb3NpdG9yeSAiICsgbG9jYXRpb25TdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlcG9zaXRvcnkgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUmVwb3NpdG9yaWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlyZXBvc2l0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVzdG9yZURvd25sb2FkQ2FjaGUoKTsKLQkJCXJlc3RvcmVGcm9tU3lzdGVtUHJvcGVydHkoKTsKLQkJCXJlc3RvcmVGcm9tUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgdG8gdGhlIGZpbGUtc3lzdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlVG9QcmVmZXJlbmNlcygpIHsKLQkJdHJ5IHsKLQkJCWdldFByZWZlcmVuY2VzKCkuZmx1c2goKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igd2hpbGUgc2F2aW5nIHJlcG9zaXRvcmllcyBpbiBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BcnRpZmFjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzZDNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCByZXF1ZXN0cyBvbiBhbiB7QGxpbmsgSUFydGlmYWN0UmVwb3NpdG9yeX0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcnRpZmFjdFJlcXVlc3QgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXF1ZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgREVGQVVMVF9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgImRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJQXJ0aWZhY3RLZXkgYXJ0aWZhY3Q7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlZEtleTsKLQlwcm90ZWN0ZWQgSUFydGlmYWN0UmVwb3NpdG9yeSBzb3VyY2U7Ci0JcHJvdGVjdGVkIElTdGF0dXMgcmVzdWx0ID0gREVGQVVMVF9TVEFUVVM7Ci0JcHJvdGVjdGVkIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCXB1YmxpYyBBcnRpZmFjdFJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSkgewotCQlhcnRpZmFjdCA9IGtleTsKLQkJLy8gVE9ETyBkbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGU/IGZvciBub3cgc2V0IGRlZmF1bHQgcmVxdWVzdCBoYW5kbGVyIHRvIEVDRgotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXkgZ2V0QXJ0aWZhY3RLZXkoKSB7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0RGVzY3JpcHRvciBnZXRBcnRpZmFjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3BlcmZvcm0oSVByb2dyZXNzTW9uaXRvcil9LAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHBlcmZvcm0gaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGVyZm9ybSBjYWxsLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlc3VsdCA9PSBERUZBVUxUX1NUQVRVUykKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIk5vIHJlcG9zaXRvcnkgZm91bmQgY29udGFpbmluZzogIiArIGdldEFydGlmYWN0S2V5KCkudG9TdHJpbmcoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRTb3VyY2VSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhcnRpZmFjdCByZXF1ZXN0LCBhbmQgc2V0cyB0aGUgcmVzdWx0IHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkCi0JICovCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRvciB0byB1c2Ugd2hlbiBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGRlc2NyaXB0b3IgdG8gdXNlIHdoZW4gcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgdmFsdWUpIHsKLQkJaWYgKCF2YWx1ZS5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhhcnRpZmFjdCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZXNjcmlwdG9yJ3Mga2V5IG11c3QgbWF0Y2ggdGhlIHJlcXVlc3QncyBrZXkiKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdG9yID0gdmFsdWU7Ci0JCWlmIChhcnRpZmFjdCA9PSBudWxsKQotCQkJYXJ0aWZhY3QgPSB2YWx1ZS5nZXRBcnRpZmFjdEtleSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc3VsdCBvZiBhbiBpbnZvY2F0aW9uIG9mIHtAbGluayAjcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yKX0uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gc2V0IHRoZSByZXN1bHQgc3RhdHVzIGZvcgotCSAqIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHJlc3VsdCBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHQoSVN0YXR1cyB2YWx1ZSkgewotCQlyZXN1bHQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJc291cmNlID0gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9Eb3dubG9hZFN0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9Eb3dubG9hZFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgxODQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRG93bmxvYWRTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBBIHN0YXR1cyBvYmplY3QgdGhhdCBvcHRpb25hbGx5IHJlcG9ydHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIHJlc3VsdCBvZiBhIGRvd25sb2FkLgotICovCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTktOT1dOX1JBVEUgPSAtMTsKLQotCXByaXZhdGUgbG9uZyBzcGVlZCA9IFVOS05PV05fUkFURTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRG93bmxvYWRTdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKi8KLQlwdWJsaWMgRG93bmxvYWRTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBEb3dubG9hZFN0YXR1cyB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqLwotCXB1YmxpYyBEb3dubG9hZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERvd25sb2FkU3RhdHVzIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICovCi0JcHVibGljIERvd25sb2FkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG93bmxvYWQgcmF0ZSBpbiBieXRlcyBwZXIgc2Vjb25kLiAgSWYgdGhlIHJhdGUgaXMgdW5rbm93biwKLQkgKiBAe2xpbmsge0BsaW5rICNVTktOT1dOX1JBVEV9fSBpcyByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHRoZSBkb3dubG9hZCByYXRlIGluIGJ5dGVzIHBlciBzZWNvbmQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUcmFuc2ZlclJhdGUoKSB7Ci0JCXJldHVybiBzcGVlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb3dubG9hZCByYXRlIG9mIHRoZSB0cmFuc2ZlciBpbiBieXRlcyBwZXIgc2Vjb25kLgotCSAqIEBwYXJhbSByYXRlIFRoZSBkb3dubG9hZCByYXRlIGluIGJ5dGVzIHBlciBzZWNvbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2ZlclJhdGUobG9uZyByYXRlKSB7Ci0JCXRoaXMuc3BlZWQgPSByYXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRUNGVHJhbnNwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0VDRlRyYW5zcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNmNmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRUNGVHJhbnNwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSB2YXJpb3VzIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuaWRlbnRpdHkuRmlsZUNyZWF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmlkZW50aXR5LkZpbGVJREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5zZXJ2aWNlLklSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JU3RhdGVmdWw7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIEEgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBFQ0YgZmlsZSB0cmFuc2ZlciBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFQ0ZUcmFuc3BvcnQgZXh0ZW5kcyBUcmFuc3BvcnQgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiB0cmFuc3BvcnQgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRUNGVHJhbnNwb3J0IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlVHJhY2tlciByZXRyaWV2YWxGYWN0b3J5VHJhY2tlcjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgRUNGVHJhbnNwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRUNGVHJhbnNwb3J0IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRUNGVHJhbnNwb3J0KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgdG8gYXZvaWQgY2xpZW50IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBFQ0ZUcmFuc3BvcnQoKSB7Ci0JCXJldHJpZXZhbEZhY3RvcnlUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJcmV0cmlldmFsRmFjdG9yeVRyYWNrZXIub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbnZlcnRUb1N0YXR1cyhJRmlsZVRyYW5zZmVyRXZlbnQgZXZlbnQsIEV4Y2VwdGlvbiBmYWlsdXJlLCBsb25nIHN0YXJ0VGltZSkgewotCQlsb25nIHNwZWVkID0gRG93bmxvYWRTdGF0dXMuVU5LTk9XTl9SQVRFOwotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJFdmVudCkgewotCQkJbG9uZyBieXRlcyA9ICgoSUluY29taW5nRmlsZVRyYW5zZmVyRXZlbnQpIGV2ZW50KS5nZXRTb3VyY2UoKS5nZXRCeXRlc1JlY2VpdmVkKCk7Ci0JCQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCQkJbG9uZyBlbGFwc2VkID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSAvIDEwMDA7Ly9pbiBzZWNvbmRzCi0JCQkJaWYgKGVsYXBzZWQgPT0gMCkKLQkJCQkJZWxhcHNlZCA9IDE7Ci0JCQkJc3BlZWQgPSBieXRlcyAvIGVsYXBzZWQ7Ci0JCQl9Ci0JCX0KLQkJRG93bmxvYWRTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZhaWx1cmUgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBEb3dubG9hZFN0YXR1cyhJU3RhdHVzLk9LLCBBY3RpdmF0b3IuSUQsIFN0YXR1cy5PS19TVEFUVVMuZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSBpZiAoZmFpbHVyZSBpbnN0YW5jZW9mIFVzZXJDYW5jZWxsZWRFeGNlcHRpb24pCi0JCQlyZXN1bHQgPSBuZXcgRG93bmxvYWRTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIEFjdGl2YXRvci5JRCwgZmFpbHVyZS5nZXRNZXNzYWdlKCksIGZhaWx1cmUpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgRG93bmxvYWRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgZHVyaW5nIHRyYW5zZmVyIiwgZmFpbHVyZSk7Ci0JCXJlc3VsdC5zZXRUcmFuc2ZlclJhdGUoc3BlZWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGRvd25sb2FkKFN0cmluZyB0b0Rvd25sb2FkLCBPdXRwdXRTdHJlYW0gdGFyZ2V0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeSBmYWN0b3J5ID0gKElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkpIHJldHJpZXZhbEZhY3RvcnlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0dXNPbih0YXJnZXQsIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRUNGIFRyYW5zZmVyIG1hbmFnZXIgbm90IGF2YWlsYWJsZSIpKTsKLQotCQlyZXR1cm4gdHJhbnNmZXIoZmFjdG9yeS5uZXdJbnN0YW5jZSgpLCB0b0Rvd25sb2FkLCB0YXJnZXQsIG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB0cmFuc2ZlcihmaW5hbCBJUmV0cmlldmVGaWxlVHJhbnNmZXJDb250YWluZXJBZGFwdGVyIHJldHJpZXZhbENvbnRhaW5lciwgZmluYWwgU3RyaW5nIHRvRG93bmxvYWQsIGZpbmFsIE91dHB1dFN0cmVhbSB0YXJnZXQsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJU3RhdHVzW10gcmVzdWx0ID0gbmV3IElTdGF0dXNbMV07Ci0JCWZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUlGaWxlVHJhbnNmZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJRmlsZVRyYW5zZmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVUcmFuc2ZlckV2ZW50KElGaWxlVHJhbnNmZXJFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50IHJzZSA9IChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCkgZXZlbnQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCQlyc2UucmVjZWl2ZSh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvbnZlcnRUb1N0YXR1cyhldmVudCwgZSwgc3RhcnRUaW1lKTsKLQkJCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQkJcmVzdWx0WzBdID0gc3RhdHVzOwotCQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRGF0YUV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlciBzb3VyY2UgPSAoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEYXRhRXZlbnQpIGV2ZW50KS5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCXNvdXJjZS5jYW5jZWwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRG9uZUV2ZW50KSB7Ci0JCQkJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSAoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEb25lRXZlbnQpIGV2ZW50KS5nZXRFeGNlcHRpb24oKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjb252ZXJ0VG9TdGF0dXMoZXZlbnQsIGV4Y2VwdGlvbiwgc3RhcnRUaW1lKTsKLQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCXJlc3VsdFswXSA9IHN0YXR1czsKLQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNlbmRSZXRyaWV2ZVJlcXVlc3QoRmlsZUlERmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlRmlsZUlEKHJldHJpZXZhbENvbnRhaW5lci5nZXRSZXRyaWV2ZU5hbWVzcGFjZSgpLCB0b0Rvd25sb2FkKSwgbGlzdGVuZXIsIG51bGwpOwotCQl9IGNhdGNoIChJbmNvbWluZ0ZpbGVUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3RhdHVzT24odGFyZ2V0LCBlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoRmlsZUNyZWF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3RhdHVzT24odGFyZ2V0LCBlLmdldFN0YXR1cygpKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJd2hpbGUgKHJlc3VsdFswXSA9PSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBsb2dnZWQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQud2FpdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCFsb2dnZWQpCi0JCQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsICJVbmV4cGVjdGVkIGludGVycnVwdCB3aGlsZSB3YWl0aW5nIG9uIEVDRiB0cmFuc2ZlciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdGF0dXNPbih0YXJnZXQsIHJlc3VsdFswXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBzdGF0dXNPbihPdXRwdXRTdHJlYW0gdGFyZ2V0LCBJU3RhdHVzIHN0YXR1cykgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVN0YXRlZnVsKQotCQkJKChJU3RhdGVmdWwpIHRhcmdldCkuc2V0U3RhdHVzKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9GaWxlRG93bmxvYWRSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0ZpbGVEb3dubG9hZFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlOGQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0ZpbGVEb3dubG9hZFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEZpbGVEb3dubG9hZFJlcXVlc3QgZXh0ZW5kcyBBcnRpZmFjdFJlcXVlc3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZURvd25sb2FkUmVxdWVzdFtdIE5PX1JFUVVFU1QgPSBuZXcgRmlsZURvd25sb2FkUmVxdWVzdFswXTsKLQotCXByaXZhdGUgRmlsZSBkZXN0aW5hdGlvbjsgLy8gVGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHdoZXJlIHRoZSBmaWxlIHNob3VsZCBiZSB3cml0dGVuCi0KLQlwdWJsaWMgRmlsZURvd25sb2FkUmVxdWVzdChJQXJ0aWZhY3RLZXkgZG93bmxvYWRLZXksIElQYXRoIGRvd25sb2FkUGF0aCkgewotCQlzdXBlcihkb3dubG9hZEtleSk7Ci0JCWRlc3RpbmF0aW9uID0gZG93bmxvYWRQYXRoLnRvRmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlkZXN0aW5hdGlvblN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbikpOwotCQkJCXNldFJlc3VsdChzb3VyY2UuZ2V0QXJ0aWZhY3QoZGVzY3JpcHRvciwgZGVzdGluYXRpb25TdHJlYW0sIG51bGwpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGRlc3RpbmF0aW9uU3RyZWFtICE9IG51bGwpCi0JCQkJCWRlc3RpbmF0aW9uU3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuRmlsZURvd25sb2FkRXJyb3IsIGRlc2NyaXB0b3IsIGRlc3RpbmF0aW9uKSwgZSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI2OWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9ub3RfZm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXZhaWxhYmxlX2FscmVhZHlfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG93bmxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfY2xvc2luZ19zdHJlYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZURvd25sb2FkRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fZmFpbGVkUmVhZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19pbmNvbXBhdGlibGVWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpZ25hdHVyZVZlcmlmaWNhdGlvbl9mYWlsZWRSZWFkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkQ29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaWduYXR1cmVWZXJpZmljYXRpb25faW52YWxpZEZpbGVDb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX3BhcnNlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlycm9yaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fZmFpbGVkUmVhZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9ub3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl91bmtub3duVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvRmFpbGVkV3JpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb1JlYWRPbmx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2FyX2Rvd25sb2FkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhcl9kb3dubG9hZEpvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2FyX2ZhaWxlZE1rZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhcl9yZXBvcnRTdGF0dXM7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZXMKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWlycm9yUmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWVjNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSB2YXJpb3VzIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEEgcmVxdWVzdCB0byBtaXJyb3IgKGNvcHkpIGFuIGFydGlmYWN0IGludG8gYSBnaXZlbiBkZXN0aW5hdGlvbiBhcnRpZmFjdCByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yUmVxdWVzdCBleHRlbmRzIEFydGlmYWN0UmVxdWVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gRU1QVFlfU1RFUFMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yWzBdOwotCi0JcHJpdmF0ZSBmaW5hbCBJQXJ0aWZhY3RSZXBvc2l0b3J5IHRhcmdldDsKLQotCXByaXZhdGUgZmluYWwgUHJvcGVydGllcyB0YXJnZXREZXNjcmlwdG9yUHJvcGVydGllczsKLQotCXByaXZhdGUgZmluYWwgUHJvcGVydGllcyB0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllczsKLQotCXB1YmxpYyBNaXJyb3JSZXF1ZXN0KElBcnRpZmFjdEtleSBrZXksIElBcnRpZmFjdFJlcG9zaXRvcnkgdGFyZ2V0UmVwb3NpdG9yeSwgUHJvcGVydGllcyB0YXJnZXREZXNjcmlwdG9yUHJvcGVydGllcywgUHJvcGVydGllcyB0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcykgewotCQlzdXBlcihrZXkpOwotCQl0YXJnZXQgPSB0YXJnZXRSZXBvc2l0b3J5OwotCQlpZiAodGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMgPT0gbnVsbCB8fCB0YXJnZXREZXNjcmlwdG9yUHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMudGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMgPSBudWxsOwotCQl9IGVsc2UgewotCQkJdGhpcy50YXJnZXREZXNjcmlwdG9yUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQl0aGlzLnRhcmdldERlc2NyaXB0b3JQcm9wZXJ0aWVzLnB1dEFsbCh0YXJnZXREZXNjcmlwdG9yUHJvcGVydGllcyk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMgPT0gbnVsbCB8fCB0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMudGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMgPSBudWxsOwotCQl9IGVsc2UgewotCQkJdGhpcy50YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQl0aGlzLnRhcmdldFJlcG9zaXRvcnlQcm9wZXJ0aWVzLnB1dEFsbCh0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZG93bmxvYWRpbmcsIGdldEFydGlmYWN0S2V5KCkuZ2V0SWQoKSkpOwotCQkvLyBEbyB3ZSBhbHJlYWR5IGhhdmUgdGhlIGFydGlmYWN0IGluIHRoZSB0YXJnZXQ/Ci0JCWlmICh0YXJnZXQuY29udGFpbnMoZ2V0QXJ0aWZhY3RLZXkoKSkpIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuYXZhaWxhYmxlX2FscmVhZHlfaW4sIGdldEFydGlmYWN0S2V5KCkpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIGEgZGVzY3JpcHRvciB0aGVuIHRyeSB0byBmaWxsIG9uZSBpbiBieSBnZXR0aW5nCi0JCS8vIHRoZSBsaXN0IG9mIGFsbCBhbmQgcmFuZG9tbHkgcGlja2luZyBvbmUgdGhhdCBhcHBlYXJzIHRvIGJlIG9wdGltaXplZC4KLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gc291cmNlLmdldEFydGlmYWN0RGVzY3JpcHRvcnMoZ2V0QXJ0aWZhY3RLZXkoKSk7Ci0JCQlpZiAoZGVzY3JpcHRvcnMubGVuZ3RoID4gMCkgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3Igb3B0aW1pemVkID0gbnVsbDsKLQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGNhbm9uaWNhbCA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpID09IG51bGwpCi0JCQkJCQljYW5vbmljYWwgPSBkZXNjcmlwdG9yc1tpXTsKLQkJCQkJZWxzZSBpZiAoUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNhblByb2Nlc3MoZGVzY3JpcHRvcnNbaV0pKQotCQkJCQkJb3B0aW1pemVkID0gZGVzY3JpcHRvcnNbaV07Ci0JCQkJfQotCQkJCWJvb2xlYW4gY2hvb3NlQ2Fub25pY2FsID0gc291cmNlLmdldExvY2F0aW9uKCkuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIElmIHRoZSBzb3VyY2UgcmVwbyBpcyBsb2NhbCB0aGVuIGxvb2sgZm9yIGEgY2Fub25pY2FsIGRlc2NyaXB0b3Igc28gd2UgZG9uJ3Qgd2FzdGUgcHJvY2Vzc2luZyB0aW1lLgotCQkJCWRlc2NyaXB0b3IgPSBjaG9vc2VDYW5vbmljYWwgPyBjYW5vbmljYWwgOiBvcHRpbWl6ZWQ7Ci0JCQkJLy8gaWYgdGhlIGRlc2NyaXB0b3IgaXMgc3RpbGwgbnVsbCB0aGVuIHdlIGNvdWxkIG5vdCBmaW5kIG91ciBmaXJzdCBjaG9pY2Ugb2YgZm9ybWF0IHNvIHN3aXRjaCB0aGUgbG9naWMuCi0JCQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvciA9ICFjaG9vc2VDYW5vbmljYWwgPyBjYW5vbmljYWwgOiBvcHRpbWl6ZWQ7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZGVzY3JpcHRvciBpcyBub3Qgc2V0IG5vdyB0aGVuIHRoZSByZXBvIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVlc3RlZCBhcnRpZmFjdAotCQkvLyBUT0RPIGltcHJvdmUgdGhlIHJlcG9ydGluZyBoZXJlLiAgSXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIHJlcG8gaGFzIHRoZSBhcnRpZmFjdAotCQkvLyBidXQgdGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIGEgcHJvY2Vzc29yCi0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3Rfbm90X2ZvdW5kLCBnZXRBcnRpZmFjdEtleSgpKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHN0b3JlIHRoZSBhcnRpZmFjdAotCQkvLyBTaW5jZSB3ZSBhcmUgbWlycm9yaW5nLCBlbnN1cmUgd2UgY2xlYXIgb3V0IGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciB0aGF0IG1heQotCQkvLyBub3QgYXBwbHkgaW4gdGhlIG5ldyByZXBvIGxvY2F0aW9uLgotCQkvLyBUT0RPIHRoaXMgaXMgYnJpdHRsZS4gIHBlcmhhcHMgdGhlIHJlcG8gaXRzZWxmIHNob3VsZCBkbyB0aGlzPyAgdGhlcmUgYXJlIGNhc2VzIHdoZXJlCi0JCS8vIHdlIHJlYWxseSBkbyBuZWVkIHRvIGdpdmUgdGhlIHJlcG8gdGhlIGFjdHVhbCBkZXNjcmlwdG9yIHRvIHVzZSBob3dldmVyLi4uCi0JCUFydGlmYWN0RGVzY3JpcHRvciBkZXN0aW5hdGlvbkRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGdldEFydGlmYWN0RGVzY3JpcHRvcigpKTsKLQkJZGVzdGluYXRpb25EZXNjcmlwdG9yLnNldFByb2Nlc3NpbmdTdGVwcyhFTVBUWV9TVEVQUyk7Ci0JCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX01ENSwgbnVsbCk7Ci0JCS8vCQlkZXN0aW5hdGlvbkRlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFLCBudWxsKTsKLQotCQlpZiAodGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5hZGRQcm9wZXJ0aWVzKHRhcmdldERlc2NyaXB0b3JQcm9wZXJ0aWVzKTsKLQotCQlpZiAodGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5hZGRSZXBvc2l0b3J5UHJvcGVydGllcyh0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcyk7Ci0KLQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uOwotCQl0cnkgewotCQkJZGVzdGluYXRpb24gPSB0YXJnZXQuZ2V0T3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uRGVzY3JpcHRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRSZXN1bHQoZS5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBEbyB0aGUgYWN0dWFsIHRyYW5zZmVyCi0JCXRyeSB7Ci0JCQlzZXRSZXN1bHQoZ2V0U291cmNlUmVwb3NpdG9yeSgpLmdldEFydGlmYWN0KGRlc2NyaXB0b3IsIGRlc3RpbmF0aW9uLCBtb25pdG9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0UmVzdWx0KG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5lcnJvcl9jbG9zaW5nX3N0cmVhbSwgZ2V0QXJ0aWZhY3RLZXkoKSwgdGFyZ2V0LmdldExvY2F0aW9uKCkpLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gTWVzc2FnZXMubWlycm9yaW5nICsgZ2V0QXJ0aWZhY3RLZXkoKSArICIgaW50byAiICsgdGFyZ2V0OyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk0NGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWlycm9yU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotLyoqCi0gKiBNaXJyb3Igc3VwcG9ydCBjbGFzcyBmb3IgcmVwb3NpdG9yaWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMKLSAqIG1pcnJvciBzdXBwb3J0IGVxdWl2YWxlbnQgdG8gdGhlIG1pcnJvcmluZyBvZiB1cGRhdGUgbWFuYWdlciBzaXRlcy4gQSByZXBvc2l0b3J5IAotICogb3B0aW9uYWxseSBwcm92aWRlcyBhIG1pcnJvciBVUkwgdmlhIHRoZSB7QGxpbmsgSVJlcG9zaXRvcnkjUFJPUF9NSVJST1JTX1VSTH0ga2V5LiAKLSAqIFRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGlzIFVSTCBpcyBleHBlY3RlZCB0byBiZSBhbiBYTUwgZG9jdW1lbnQgCi0gKiBjb250YWluaW5nIGEgbGlzdCBvZiA8bWlycm9yPiBlbGVtZW50cy4gVGhlIG1pcnJvcnMgYXJlIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSAKLSAqIHNvcnRlZCBnZW9ncmFwaGljYWxseSB3aXRoIGNsb3NlciBtaXJyb3JzIGZpcnN0LgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yU2VsZWN0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBMT0cyID0gTWF0aC5sb2coMik7Ci0KLQkvKioKLQkgKiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgbWlycm9yCi0JICovCi0Jc3RhdGljIGNsYXNzIE1pcnJvckluZm8gaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJbG9uZyBieXRlc1BlclNlY29uZDsKLQkJaW50IGZhaWx1cmVDb3VudDsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbFJhbms7Ci0JCVN0cmluZyBsb2NhdGlvblN0cmluZzsKLQotCQlNaXJyb3JJbmZvKFN0cmluZyBsb2NhdGlvbiwgaW50IGluaXRpYWxSYW5rKSB7Ci0JCQl0aGlzLmluaXRpYWxSYW5rID0gaW5pdGlhbFJhbms7Ci0JCQl0aGlzLmxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb247Ci0JCQlpZiAoIWxvY2F0aW9uU3RyaW5nLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlsb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uU3RyaW5nICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCQlmYWlsdXJlQ291bnQgPSAwOwotCQkJYnl0ZXNQZXJTZWNvbmQgPSBEb3dubG9hZFN0YXR1cy5VTktOT1dOX1JBVEU7Ci0JCX0KLQotCQkvKioKLQkJICogQ29tcGFyaXNvbiB1c2VkIHRvIHNvcnQgbWlycm9ycy4KLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCQlpZiAoIShvIGluc3RhbmNlb2YgTWlycm9ySW5mbykpCi0JCQkJcmV0dXJuIDA7Ci0JCQlNaXJyb3JJbmZvIHRoYXQgPSAoTWlycm9ySW5mbykgbzsKLQkJCS8vbGVzcyBmYWlsdXJlcyBpcyBiZXR0ZXIKLQkJCWlmICh0aGlzLmZhaWx1cmVDb3VudCAhPSB0aGF0LmZhaWx1cmVDb3VudCkKLQkJCQlyZXR1cm4gdGhpcy5mYWlsdXJlQ291bnQgLSB0aGF0LmZhaWx1cmVDb3VudDsKLQkJCS8vZmFzdGVyIGlzIGJldHRlcgotCQkJaWYgKHRoaXMuYnl0ZXNQZXJTZWNvbmQgIT0gdGhhdC5ieXRlc1BlclNlY29uZCkKLQkJCQlyZXR1cm4gKGludCkgKHRoaXMuYnl0ZXNQZXJTZWNvbmQgLSB0aGF0LmZhaWx1cmVDb3VudCk7Ci0JCQkvL3RydXN0IHRoYXQgaW5pdGlhbCByYW5rIGluZGljYXRlcyBnZW9ncmFwaGljYWwgcHJveGltaXR5Ci0JCQlyZXR1cm4gdGhpcy5pbml0aWFsUmFuayAtIHRoYXQuaW5pdGlhbFJhbms7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNaXJyb3IoIiArIGxvY2F0aW9uU3RyaW5nICsgJywnICsgZmFpbHVyZUNvdW50ICsgJywnICsgYnl0ZXNQZXJTZWNvbmQgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBVUkkgb2YgdGhlIGJhc2UgcmVwb3NpdG9yeSBiZWluZyBtaXJyb3JlZC4KLQkgKi8KLQlVUkkgYmFzZVVSSTsKLQotCU1pcnJvckluZm9bXSBtaXJyb3JzOwotCi0JcHJpdmF0ZSBmaW5hbCBJUmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCi0JcHJpdmF0ZSBmaW5hbCBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG1pcnJvciBzdXBwb3J0IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcmVwb3NpdG9yeS4gTWlycm9ycyBhcmUKLQkgKiBub3QgY29udGFjdGVkIGFuZCB0aGUgbWlycm9yc1VSTCBkb2N1bWVudCBpcyBub3QgcGFyc2VkIHVudGlsIGEKLQkgKiBtaXJyb3IgbG9jYXRpb24gcmVxdWVzdCBpcyBzZW50LgotCSAqLwotCXB1YmxpYyBNaXJyb3JTZWxlY3RvcihJUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCXRyeSB7Ci0JCQlVUkwgcmVwb3NpdG9yeVVSTCA9IHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChyZXBvc2l0b3J5VVJMICE9IG51bGwpCi0JCQkJdGhpcy5iYXNlVVJJID0gbmV3IFVSSShyZXBvc2l0b3J5VVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJbG9nKCJFcnJvciBpbml0aWFsaXppbmcgbWlycm9ycyBmb3I6ICIgKyByZXBvc2l0b3J5LmdldExvY2F0aW9uKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIG1pcnJvciBVUkwgdG8gb2J0YWluIHRoZSBsaXN0IG9mIG1pcnJvcnMuIFJldHVybnMgdGhlIG1pcnJvcnMsCi0JICogb3IgbnVsbCBpZiBtaXJyb3JzIGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KLQkgKiAKLQkgKiBPcmlnaW5hbGx5IGNvcGllZCBmcm9tIERlZmF1bHRTaXRlUGFyc2VyLmdldE1pcnJvcnMgaW4gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUKLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm9bXSBjb21wdXRlTWlycm9ycyhTdHJpbmcgbWlycm9yc1VSTCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNvdW50cnlDb2RlID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkudG9Mb3dlckNhc2UoKTsKLQkJCWludCB0aW1lWm9uZSA9IChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSkuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSAvICg2MCAqIDYwICogMTAwMCk7Ci0KLQkJCWlmIChtaXJyb3JzVVJMLmluZGV4T2YoJz8nKSAhPSAtMSkgewotCQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgJyYnOwotCQkJfSBlbHNlIHsKLQkJCQltaXJyb3JzVVJMID0gbWlycm9yc1VSTCArICc/JzsKLQkJCX0KLQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgImNvdW50cnlDb2RlPSIgKyBjb3VudHJ5Q29kZSArICImdGltZVpvbmU9IiArIHRpbWVab25lICsgIiZyZXNwb25zZVR5cGU9eG1sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb21GYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG1pcnJvcnNVUkwpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlOb2RlTGlzdCBtaXJyb3JOb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IG1pcnJvckNvdW50ID0gbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlNaXJyb3JJbmZvW10gaW5mb3MgPSBuZXcgTWlycm9ySW5mb1ttaXJyb3JDb3VudCArIDFdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXJyb3JDb3VudDsgaSsrKSB7Ci0JCQkJRWxlbWVudCBtaXJyb3JOb2RlID0gKEVsZW1lbnQpIG1pcnJvck5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGluZm9VUkwgPSBtaXJyb3JOb2RlLmdldEF0dHJpYnV0ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvc1tpXSA9IG5ldyBNaXJyb3JJbmZvKGluZm9VUkwsIGkpOwotCQkJfQotCQkJLy9wMjogYWRkIHRoZSBiYXNlIHNpdGUgYXMgdGhlIGxhc3QgcmVzb3J0IG1pcnJvciBzbyB3ZSBjYW4gdHJhY2sgZG93bmxvYWQgc3BlZWQgYW5kIGZhaWx1cmUgcmF0ZQotCQkJaW5mb3NbbWlycm9yQ291bnRdID0gbmV3IE1pcnJvckluZm8ocmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCksIG1pcnJvckNvdW50KTsKLQkJCXJldHVybiBpbmZvczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBpZiBhYnNvbHV0ZSB1cmwKLQkJCWlmIChtaXJyb3JzVVJMICE9IG51bGwgJiYgKG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJodHRwczovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImZ0cDovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiamFyOi8vIikpKSAvLyROT04tTkxTLTEkCi0JCQkJbG9nKCJFcnJvciBwcm9jZXNzaW5nIG1pcnJvcnMgVVJMOiAiICsgbWlycm9yc1VSTCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlcXVpdmFsZW50IGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYXJ0aWZhY3QgbG9jYXRpb24gaW4gdGhlIGJhc2UgCi0JICogcmVwb3NpdG9yeS4gIEFsd2F5cyBmYWxscyBiYWNrIHRvIHRoZSBnaXZlbiBpbnB1dCBsb2NhdGlvbiBpbiBjYXNlIG9mIGZhaWx1cmUKLQkgKiB0byBjb21wdXRlIG1pcnJvcnMuIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNaXJyb3JMb2NhdGlvbihTdHJpbmcgaW5wdXRMb2NhdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlucHV0TG9jYXRpb24pOwotCQlpZiAoYmFzZVVSSSA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0TG9jYXRpb247Ci0JCVVSSSByZWxhdGl2ZUxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlbGF0aXZlTG9jYXRpb24gPSBiYXNlVVJJLnJlbGF0aXZpemUobmV3IFVSSShpbnB1dExvY2F0aW9uKSk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2luZy5ERUJVR19NSVJST1JTKQotCQkJCWxvZygiVW5hYmxlIHRvIG1ha2UgbG9jYXRpb24gcmVsYXRpdmU6ICIgKyBpbnB1dExvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vaWYgd2UgZmFpbGVkIHRvIHJlbGF0aXZpemUgdGhlIGxvY2F0aW9uLCB3ZSBjYW4ndCBzZWxlY3QgYSBtaXJyb3IKLQkJaWYgKHJlbGF0aXZlTG9jYXRpb24gPT0gbnVsbCB8fCByZWxhdGl2ZUxvY2F0aW9uLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBpbnB1dExvY2F0aW9uOwotCQlNaXJyb3JJbmZvIHNlbGVjdGVkTWlycm9yID0gc2VsZWN0TWlycm9yKCk7Ci0JCWlmIChzZWxlY3RlZE1pcnJvciA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0TG9jYXRpb247Ci0JCWlmIChUcmFjaW5nLkRFQlVHX01JUlJPUlMpCi0JCQlUcmFjaW5nLmRlYnVnKCJTZWxlY3RlZCBtaXJyb3IgZm9yIGFydGlmYWN0ICIgKyBpbnB1dExvY2F0aW9uICsgIjogIiArIHNlbGVjdGVkTWlycm9yKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzZWxlY3RlZE1pcnJvci5sb2NhdGlvblN0cmluZyArIHJlbGF0aXZlTG9jYXRpb24uZ2V0UGF0aCgpKS50b0V4dGVybmFsRm9ybSgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJbG9nKCJVbmFibGUgdG8gbWFrZSBsb2NhdGlvbiAiICsgaW5wdXRMb2NhdGlvbiArICIgcmVsYXRpdmUgdG8gbWlycm9yICIgKyBzZWxlY3RlZE1pcnJvci5sb2NhdGlvblN0cmluZywgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpbnB1dExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pcnJvciBsb2NhdGlvbnMgZm9yIHRoaXMgcmVwb3NpdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGV5IGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm9bXSBpbml0TWlycm9ycygpIHsKLQkJaWYgKG1pcnJvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBtaXJyb3JzOwotCQlTdHJpbmcgbWlycm9yc1VSTCA9IChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX01JUlJPUlNfVVJMKTsKLQkJaWYgKG1pcnJvcnNVUkwgIT0gbnVsbCkKLQkJCW1pcnJvcnMgPSBjb21wdXRlTWlycm9ycyhtaXJyb3JzVVJMKTsKLQkJcmV0dXJuIG1pcnJvcnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHRoZSByZXN1bHQgb2YgYSBtaXJyb3IgZG93bmxvYWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVwb3J0UmVzdWx0KFN0cmluZyB0b0Rvd25sb2FkLCBJU3RhdHVzIHJlc3VsdCkgewotCQlpZiAobWlycm9ycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pcnJvcnMubGVuZ3RoOyBpKyspIHsKLQkJCU1pcnJvckluZm8gbWlycm9yID0gbWlycm9yc1tpXTsKLQkJCWlmICh0b0Rvd25sb2FkLnN0YXJ0c1dpdGgobWlycm9yLmxvY2F0aW9uU3RyaW5nKSkgewotCQkJCWlmICghcmVzdWx0LmlzT0soKSAmJiByZXN1bHQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkKLQkJCQkJbWlycm9yLmZhaWx1cmVDb3VudCsrOwotCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBEb3dubG9hZFN0YXR1cykgewotCQkJCQlsb25nIG9sZFJhdGUgPSBtaXJyb3IuYnl0ZXNQZXJTZWNvbmQ7Ci0JCQkJCWxvbmcgbmV3UmF0ZSA9ICgoRG93bmxvYWRTdGF0dXMpIHJlc3VsdCkuZ2V0VHJhbnNmZXJSYXRlKCk7Ci0JCQkJCS8vYXZlcmFnZSBvbGQgYW5kIG5ldyByYXRlIHNvIG9uZSBzbG93IGRvd25sb2FkIGRvZXNuJ3QgcnVpbiB0aGUgbWlycm9yJ3MgcmVwdXRhdGlvbgotCQkJCQlpZiAob2xkUmF0ZSA+IDApCi0JCQkJCQluZXdSYXRlID0gKG9sZFJhdGUgKyBuZXdSYXRlKSAvIDI7Ci0JCQkJCW1pcnJvci5ieXRlc1BlclNlY29uZCA9IG5ld1JhdGU7Ci0JCQkJfQotCQkJCWlmIChUcmFjaW5nLkRFQlVHX01JUlJPUlMpCi0JCQkJCVRyYWNpbmcuZGVidWcoIlVwZGF0ZWQgbWlycm9yICIgKyBtaXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCQkJQXJyYXlzLnNvcnQobWlycm9ycyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBhIG1pcnJvciBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIG1pcnJvcnMuIFJldHVybnMgbnVsbCBpZiBhIG1pcnJvcgotCSAqIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm8gc2VsZWN0TWlycm9yKCkgewotCQlpbml0TWlycm9ycygpOwotCQlpbnQgbWlycm9yQ291bnQ7Ci0JCWlmIChtaXJyb3JzID09IG51bGwgfHwgKG1pcnJvckNvdW50ID0gbWlycm9ycy5sZW5ndGgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy90aGlzIGlzIGEgZnVuY3Rpb24gdGhhdCByYW5kb21seSBzZWxlY3RzIGEgbWlycm9yIGJhc2VkIG9uIGEgbG9nYXJpdGhtaWMKLQkJLy9kaXN0cmlidXRpb24uIE1pcnJvciAwIGhhcyBhIDEvMiBjaGFuY2Ugb2YgYmVpbmcgc2VsZWN0ZWQsIG1pcnJvciAxIGhhcyBhIDEvNCBjaGFuY2UsIAotCQkvLyBtaXJyb3IgMiBoYXMgYSAxLzggY2hhbmNlLCBldGMuIFRoaXMgaW50cm9kdWNlcyBzb21lIHZhcmlhdGlvbiBpbiB0aGUgbWlycm9yIAotCQkvL3NlbGVjdGlvbiwgd2hpbGUgc3RpbGwgZmF2b3JpbmcgYmV0dGVyIG1pcnJvcnMKLQkJaW50IHJlc3VsdCA9IChpbnQpIChNYXRoLmxvZyhyYW5kb20ubmV4dEludCgxIDw8IE1hdGgubWluKDE1LCBtaXJyb3JDb3VudCkpICsgMSkgLyBMT0cyKTsKLQkJaWYgKHJlc3VsdCA+PSBtaXJyb3JDb3VudCkKLQkJCXJlc3VsdCA9IG1pcnJvckNvdW50IC0gMTsKLQkJTWlycm9ySW5mbyBzZWxlY3RlZCA9IG1pcnJvcnNbbWlycm9yQ291bnQgLSAxIC0gcmVzdWx0XTsKLQkJLy9pZiB3ZSBzZWxlY3RlZCBhIG1pcnJvciB0aGF0IGhhcyBmYWlsZWQgaW4gdGhlIHBhc3QsIHJldmVydCB0byBiZXN0IGF2YWlsYWJsZSBtaXJyb3IKLQkJaWYgKHNlbGVjdGVkLmZhaWx1cmVDb3VudCA+IDApCi0JCQlzZWxlY3RlZCA9IG1pcnJvcnNbMF07Ci0JCS8vZm9yIG5vdywgZG9uJ3QgdG9sZXJhdGUgZmFpbGluZyBtaXJyb3JzCi0JCWlmIChzZWxlY3RlZC5mYWlsdXJlQ291bnQgPiAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvU2lnbmF0dXJlVmVyaWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvU2lnbmF0dXJlVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzMWMwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpZ25hdHVyZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogIElCTSAtIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC4qOwotCi0vKioKLSAqIFRoZSBQYWNrMjAwVW5wYWNrZXIgZXhwZWN0cyBhbiBpbnB1dCBjb250YWluaW5nICIuamFyLnBhY2suZ3oiIGRhdGEuICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBTaWduYXR1cmVWZXJpZmllciBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQlwcml2YXRlIEZpbGUgaW5wdXRGaWxlOwotCXByaXZhdGUgT3V0cHV0U3RyZWFtIHRlbXBTdHJlYW07Ci0KLQlwdWJsaWMgYm9vbGVhbiBhcmVSZXF1aXJlbWVudHNTYXRpc2ZpZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShiKTsKLQl9Ci0KLQlwcml2YXRlIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodGVtcFN0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIHRlbXBTdHJlYW07Ci0JCS8vIHN0b3JlIGlucHV0IHN0cmVhbSBpbiB0ZW1wb3JhcnkgZmlsZQotCQlpbnB1dEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJzaWduYXR1cmVGaWxlIiwgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlbXBTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5wdXRGaWxlKSk7Ci0JCXJldHVybiB0ZW1wU3RyZWFtOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdWZmZXJlZElucHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAodGVtcFN0cmVhbSA9PSBudWxsKQotCQkJCS8vIGhtbW0sIG5vIG9uZSB3cm90ZSB0byB0aGlzIHN0cmVhbSBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHBhc3Mgb24KLQkJCQlyZXR1cm47Ci0JCQkvLyBPaywgc28gdGhlcmUgaXMgY29udGVudCwgY2xvc2UgdGhlIHRlbXBTdHJlYW0KLQkJCXRlbXBTdHJlYW0uY2xvc2UoKTsKLQkJCXNldFN0YXR1cyh2ZXJpZnlDb250ZW50KCkpOwotCi0JCQkvLyBub3cgd3JpdGUgdGhlICBjb250ZW50IHRvIHRoZSBmaW5hbCBkZXN0aW5hdGlvbgotCQkJcmVzdWx0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpKTsKLQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKHJlc3VsdFN0cmVhbSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCQkJcmVzdWx0U3RyZWFtID0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dEZpbGUgIT0gbnVsbCkKLQkJCQlpbnB1dEZpbGUuZGVsZXRlKCk7Ci0JCQlpZiAocmVzdWx0U3RyZWFtICE9IG51bGwpCi0JCQkJcmVzdWx0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmVyaWZ5Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNpZ25lZENvbnRlbnRGYWN0b3J5IHZlcmlmaWVyRmFjdG9yeSA9IChTaWduZWRDb250ZW50RmFjdG9yeSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIFNpZ25lZENvbnRlbnRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudDsKLQkJdHJ5IHsKLQkJCXNpZ25lZENvbnRlbnQgPSB2ZXJpZmllckZhY3RvcnkuZ2V0U2lnbmVkQ29udGVudChpbnB1dEZpbGUpOwotCQl9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBNZXNzYWdlcy5TaWduYXR1cmVWZXJpZmljYXRpb25fZmFpbGVkUmVhZCArIGlucHV0RmlsZSwgZSk7Ci0JCX0KLQkJQXJyYXlMaXN0IGFsbFN0YXR1cyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJdHJ5IHsKLQkJCQllbnRyaWVzW2ldLnZlcmlmeSgpOwotCQkJfSBjYXRjaCAoSW52YWxpZENvbnRlbnRFeGNlcHRpb24gZSkgewotCQkJCWFsbFN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLlNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkQ29udGVudCArIGVudHJpZXNbaV0uZ2V0TmFtZSgpLCBlKSk7Ci0JCQl9Ci0JCWlmIChhbGxTdGF0dXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoQWN0aXZhdG9yLklELCBJU3RhdHVzLkVSUk9SLCAoSVN0YXR1c1tdKSBhbGxTdGF0dXMudG9BcnJheShuZXcgSVN0YXR1c1thbGxTdGF0dXMuc2l6ZSgpXSksIE1lc3NhZ2VzLlNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkRmlsZUNvbnRlbnQgKyBpbnB1dEZpbGUsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFdoZW4gd2UgZ28gdG8gY2xvc2Ugd2UgbXVzdCBoYXZlIHNlZW4gYWxsIHRoZSBjb250ZW50IHdlIGFyZSBnb2luZyB0byBzZWUKLQkJLy8gU28gYmVmb3JlIGNsb3NpbmcsIHZlcmlmeSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgZGVzdGluYXRpb24KLQkJdmVyaWZ5KCk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9UcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvVHJhbnNwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWVjNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9UcmFuc3BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zcG9ydCB7Ci0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZG93bmxvYWQoU3RyaW5nIHRvRG93bmxvYWQsIE91dHB1dFN0cmVhbSB0YXJnZXQsIElQcm9ncmVzc01vbml0b3IgcG0pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE2Y2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFydGlmYWN0X25vdF9mb3VuZD1BcnRpZmFjdCByZXF1ZXN0ZWQgbm90IGZvdW5kIHswfS4KLWF2YWlsYWJsZV9hbHJlYWR5X2luPVRoZSBhcnRpZmFjdCBpcyBhbHJlYWR5IGF2YWlsYWJsZSBpbiB0aGUgcmVwb3NpdG9yeSB7MH0uCi1kb3dubG9hZGluZz1Eb3dubG9hZGluZyB7MH0uCi1lcnJvcl9jbG9zaW5nX3N0cmVhbT1FcnJvciBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGZvciB7MH0gb24gcmVwb3NpdG9yeSB7MX0uIAotCi1GaWxlRG93bmxvYWRFcnJvcj1FcnJvciBkb3dubG9hZGluZyB7MH0gdG8gezF9LiAKLWlvX2ZhaWxlZFJlYWQ9VW5hYmxlIHRvIHJlYWQgcmVwb3NpdG9yeSBhdCB7MH0uCi1pb19wYXJzZUVycm9yPVwKLQlFcnJvciBwYXJzaW5nIHNpbXBsZSBhcnRpZmFjdCByZXBvc2l0b3J5LgotaW9faW5jb21wYXRpYmxlVmVyc2lvbj1cCi0JU2ltcGxlIGFydGlmYWN0IHJlcG9zaXRvcnkgaGFzIGluY29tcGF0aWJsZSB2ZXJzaW9uIHswfTsgZXhwZWN0ZWQgezF9LgotbWlycm9yaW5nPU1pcnJvcmluZzogCi0KLXJlcG9GYWlsZWRXcml0ZT1VbmFibGUgdG8gd3JpdGUgdG8gcmVwb3NpdG9yeTogezB9LgotcmVwb1JlYWRPbmx5PUNhbm5vdCB3cml0ZSBiZWNhdXNlIHJlcG9zaXRvcnkgaXMgcmVhZCBvbmx5OiB7MH0KLQotcmVwb01hbl9leGlzdHM9UmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBhdCB7MH0uCi1yZXBvTWFuX2ZhaWxlZFJlYWQ9VGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIHJlYWQ6IHswfS4KLXJlcG9NYW5faW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvci4KLXJlcG9NYW5fbm90RXhpc3RzPU5vIHJlcG9zaXRvcnkgZm91bmQgYXQgezB9LgotcmVwb01hbl91bmtub3duVHlwZT1Vbmtub3duIHJlcG9zaXRvcnkgdHlwZSBhdCB7MH0uCi0KLVNpZ25hdHVyZVZlcmlmaWNhdGlvbl9mYWlsZWRSZWFkPUVycm9yIHJlYWRpbmcgc2lnbmVkIGNvbnRlbnQ6IAotU2lnbmF0dXJlVmVyaWZpY2F0aW9uX2ludmFsaWRDb250ZW50PUludmFsaWQgY29udGVudDogCi1TaWduYXR1cmVWZXJpZmljYXRpb25faW52YWxpZEZpbGVDb250ZW50PUZpbGUgaGFzIGludmFsaWQgY29udGVudDogCi0JCi1zYXJfZG93bmxvYWRpbmc9RG93bmxvYWQgezB9IGFydGlmYWN0cwotc2FyX2Rvd25sb2FkSm9iTmFtZT1JbnN0YWxsIGRvd25sb2FkIAotc2FyX2ZhaWxlZE1rZGlyPUZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLXNhcl9yZXBvcnRTdGF0dXM9UHJvYmxlbXMgZG93bmxvYWRpbmcgYXJ0aWZhY3Q6IHswfS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL0Jsb2JTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvQmxvYlN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzY5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvQmxvYlN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLS8qKgotICogQmxvYiBzdG9yZSB3aGljaCBtYXBzIFVVSURzIHRvIGJsb2JzIG9uIGRpc2suIFRoZSBVVUlEIGlzIG1hcHBlZAotICogdG8gYSBmaWxlIGluIHRoZSBmaWxlLXN5c3RlbSBhbmQgdGhlIGJsb2IgaXMgdGhlIGZpbGUgY29udGVudHMuIEZvciBzY2FsYWJpbGl0eSwKLSAqIHRoZSBibG9icyBhcmUgc3BsaXQgYW1vbmcgMjU1IGRpcmVjdG9yaWVzIHdpdGggdGhlIG5hbWVzIDAwIHRvIEZGLgotICovCi1wdWJsaWMgY2xhc3MgQmxvYlN0b3JlIHsKLQlwcm90ZWN0ZWQgVVJMIHN0b3JlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUJhc2VkOwotCS8qKiBMaW1pdHMgdGhlIHJhbmdlIG9mIGRpcmVjdG9yaWVzJyBuYW1lcy4gKi8KLQlwcm90ZWN0ZWQgYnl0ZSBtYXNrOwotCi0JLy9wcml2YXRlIHN0YXRpYyBzaG9ydFtdIHJhbmRvbUFycmF5ID0gezIxMywgMjMxLCAzNywgODUsIDIxMSwgMjksIDE2MSwgMTc1LCAxODcsIDMsIDE0NywgMjQ2LCAxNzAsIDMwLCAyMDIsIDE4MywgMjQyLCA0NywgMjU0LCAxODksIDI1LCAyNDgsIDE5MywgMiwgMTE5LCAxMzMsIDEyNSwgMTIsIDc2LCAyMTMsIDIxOSwgNzksIDY5LCAxMzMsIDIwMiwgODAsIDE1MCwgMTkwLCAxNTcsIDE5MCwgODAsIDE5MCwgMjE5LCAxNTAsIDE2OSwgMTE3LCA5NSwgMTAsIDc3LCAyMTQsIDIzMywgNzAsIDUsIDE4OCwgNDQsIDkxLCAxNjUsIDE0OSwgMTc3LCA5MywgMTcsIDExMiwgNCwgNDEsIDIzMCwgMTQ4LCAxODgsIDEwNywgMjEzLCAzMSwgNTIsIDYwLCAxMTEsIDI0NiwgMjI2LCAxMjEsIDEyOSwgMTk3LCAxNDQsIDI0OCwgOTIsIDEzMywgOTYsIDExNiwgMTA0LCA2NywgNzQsIDE0NCwgMTg1LCAxNDEsIDk2LCAzNCwgMTgyLCA5MCwgMzYsIDIxNywgMjgsIDIwNSwgMTA3LCA1MiwgMjAxLCAxNCwgOCwgMSwgMjcsIDIxNiwgNjAsIDM1LCAyNTEsIDE5NCwgNywgMTU2LCAzMiwgNSwgMTQ1LCAyOSwgOTYsIDYxLCAxMTAsIDE0NSwgNTAsIDU2LCAyMzUsIDIzOSwgMTcwLCAxMzgsIDE3LCAyMTEsIDU2LCA5OCwgMTAxLCAxMjYsIDI3LCA1NywgMjExLCAxNDQsIDIwNiwgMjA3LCAxNzksIDExMSwgMTYwLCA1MCwgMjQzLCA2OSwgMTA2LCAxMTgsIDE1NSwgMTU5LCAyOCwgNTcsIDExLCAxNzUsIDQzLCAxNzMsIDk2LCAxODEsIDk5LCAxNjksIDE3MSwgMTU2LCAyNDYsIDI0MywgMzAsIDE5OCwgMjUxLCA4MSwgNzcsIDkyLCAxNjAsIDIzNSwgMjE1LCAxODcsIDIzLCA3MSwgNTgsIDI0NywgMTI3LCA1NiwgMTE4LCAxMzIsIDc5LCAxODgsIDQyLCAxODgsIDE1OCwgMTIxLCAyNTUsIDY1LCAxNTQsIDExOCwgMTcyLCAyMTcsIDQsIDQ3LCAxMDUsIDIwNCwgMTM1LCAyNywgNDMsIDkwLCA5LCAzMSwgNTksIDExNSwgMTkzLCAyOCwgNTUsIDEwMSwgOSwgMTE3LCAyMTEsIDExMiwgNjEsIDU1LCAyMywgMjM1LCA1MSwgMTA0LCAxMjMsIDEzOCwgNzYsIDE0OCwgMTE1LCAxMTksIDgxLCA1NCwgMzksIDQ2LCAxNDksIDE5MSwgNzksIDE2LCAyMjIsIDY5LCAyMTksIDEzNiwgMTQ4LCAxODEsIDc3LCAyNTAsIDEwMSwgMjIzLCAxNDAsIDE5NCwgMTQxLCA0NCwgMTk1LCAyMTcsIDMxLCAyMjMsIDIwNywgMTQ5LCAyNDUsIDExNSwgMjQzLCAxODN9OwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByYW5kb21BcnJheSA9IHstNDMsIC0yNSwgMzcsIDg1LCAtNDUsIDI5LCAtOTUsIC04MSwgLTY5LCAzLCAtMTA5LCAtMTAsIC04NiwgMzAsIC01NCwgLTczLCAtMTQsIDQ3LCAtMiwgLTY3LCAyNSwgLTgsIC02MywgMiwgMTE5LCAtMTIzLCAxMjUsIDEyLCA3NiwgLTQzLCAtMzcsIDc5LCA2OSwgLTEyMywgLTU0LCA4MCwgLTEwNiwgLTY2LCAtOTksIC02NiwgODAsIC02NiwgLTM3LCAtMTA2LCAtODcsIDExNywgOTUsIDEwLCA3NywgLTQyLCAtMjMsIDcwLCA1LCAtNjgsIDQ0LCA5MSwgLTkxLCAtMTA3LCAtNzksIDkzLCAxNywgMTEyLCA0LCA0MSwgLTI2LCAtMTA4LCAtNjgsIDEwNywgLTQzLCAzMSwgNTIsIDYwLCAxMTEsIC0xMCwgLTMwLCAxMjEsIC0xMjcsIC01OSwgLTExMiwgLTgsIDkyLCAtMTIzLCA5NiwgMTE2LCAxMDQsIDY3LCA3NCwgLTExMiwgLTcxLCAtMTE1LCA5NiwgMzQsIC03NCwgOTAsIDM2LCAtMzksIDI4LCAtNTEsIDEwNywgNTIsIC01NSwgMTQsIDgsIDEsIDI3LCAtNDAsIDYwLCAzNSwgLTUsIC02MiwgNywgLTEwMCwgMzIsIDUsIC0xMTEsIDI5LCA5NiwgNjEsIDExMCwgLTExMSwgNTAsIDU2LCAtMjEsIC0xNywgLTg2LCAtMTE4LCAxNywgLTQ1LCA1NiwgOTgsIDEwMSwgMTI2LCAyNywgNTcsIC00NSwgLTExMiwgLTUwLCAtNDksIC03NywgMTExLCAtOTYsIDUwLCAtMTMsIDY5LCAxMDYsIDExOCwgLTEwMSwgLTk3LCAyOCwgNTcsIDExLCAtODEsIDQzLCAtODMsIDk2LCAtNzUsIDk5LCAtODcsIC04NSwgLTEwMCwgLTEwLCAtMTMsIDMwLAotCQkJLTU4LCAtNSwgODEsIDc3LCA5MiwgLTk2LCAtMjEsIC00MSwgLTY5LCAyMywgNzEsIDU4LCAtOSwgMTI3LCA1NiwgMTE4LCAtMTI0LCA3OSwgLTY4LCA0MiwgLTY4LCAtOTgsIDEyMSwgLTEsIDY1LCAtMTAyLCAxMTgsIC04NCwgLTM5LCA0LCA0NywgMTA1LCAtNTIsIC0xMjEsIDI3LCA0MywgOTAsIDksIDMxLCA1OSwgMTE1LCAtNjMsIDI4LCA1NSwgMTAxLCA5LCAxMTcsIC00NSwgMTEyLCA2MSwgNTUsIDIzLCAtMjEsIDUxLCAxMDQsIDEyMywgLTExOCwgNzYsIC0xMDgsIDExNSwgMTE5LCA4MSwgNTQsIDM5LCA0NiwgLTEwNywgLTY1LCA3OSwgMTYsIC0zNCwgNjksIC0zNywgLTEyMCwgLTEwOCwgLTc1LCA3NywgLTYsIDEwMSwgLTMzLCAtMTE2LCAtNjIsIC0xMTUsIDQ0LCAtNjEsIC0zOSwgMzEsIC0zMywgLTQ5LCAtMTA3LCAtMTEsIDExNSwgLTEzLCAtNzMsfTsKLQotCS8qKgotCSAqIFRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgbWFuYWdlZCBieSB0aGlzIHN0b3JlLgotCSAqIFRoaXMgbnVtYmVyIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgZG8gbm90IGV4Y2VlZCAyNTYuIFRoZSBsb2NhdGlvbgotCSAqIHNob3VsZCBiZSBhbiBleGlzdGluZyB2YWxpZCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIEJsb2JTdG9yZShVUkwgc3RvcmUsIGludCBsaW1pdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0b3JlKTsKLQkJdGhpcy5zdG9yZSA9IHN0b3JlOwotCQlmaWxlQmFzZWQgPSAiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzdG9yZS5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsZUJhc2VkKQotCQkJQXNzZXJ0LmlzVHJ1ZSghbmV3IEZpbGUoc3RvcmUuZ2V0UGF0aCgpKS5pc0ZpbGUoKSk7Ci0JCUFzc2VydC5pc1RydWUobGltaXQgPT0gMjU2IHx8IGxpbWl0ID09IDEyOCB8fCBsaW1pdCA9PSA2NCB8fCBsaW1pdCA9PSAzMiB8fCBsaW1pdCA9PSAxNiB8fCBsaW1pdCA9PSA4IHx8IGxpbWl0ID09IDQgfHwgbGltaXQgPT0gMiB8fCBsaW1pdCA9PSAxKTsKLQkJbWFzayA9IChieXRlKSAobGltaXQgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShieXRlW10gdXVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFmaWxlQmFzZWQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbmV3IEZpbGUoZm9sZGVyRm9yKHV1aWQpKS5ta2RpcigpOwotCQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZUZvcih1dWlkKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllciNhcHBlbmRCeXRlU3RyaW5nKFN0cmluZ0J1ZmZlciwgYnl0ZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQnl0ZVN0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBieXRlIHZhbHVlKSB7Ci0JCVN0cmluZyBoZXhTdHJpbmc7Ci0JCWlmICh2YWx1ZSA8IDApCi0JCQloZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKDI1NiArIHZhbHVlKTsKLQkJZWxzZQotCQkJaGV4U3RyaW5nID0gSW50ZWdlci50b0hleFN0cmluZyh2YWx1ZSk7Ci0JCWlmIChoZXhTdHJpbmcubGVuZ3RoKCkgPT0gMSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhleFN0cmluZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGJ5dGVzIGludG8gYSBTdHJpbmcuCi0JICoKLQkgKiBAc2VlIFVuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIjdG9TdHJpbmcoKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGIpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKQotCQkJYXBwZW5kQnl0ZVN0cmluZyhidWZmZXIsIGJbaV0pOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIGJsb2JGaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUJsb2IoYnl0ZVtdIHV1aWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh1dWlkKTsKLQkJaWYgKGZpbGVCYXNlZCkKLQkJCW5ldyBGaWxlKGZpbGVGb3IodXVpZCkpLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSBhbGwgb2YgdGhlIGJsb2JzIGluIHRoZSBnaXZlbiBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQmxvYnMoU2V0IHNldCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJZGVsZXRlQmxvYigoYnl0ZVtdKSBpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmaWxlRm9yKGJ5dGVbXSB1dWlkKSB7Ci0JCXJldHVybiBmb2xkZXJGb3IodXVpZCkgKyBieXRlc1RvSGV4U3RyaW5nKHV1aWQpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgb3V0IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBmaXRzIGJldHRlciB0byB0aGlzIFVVSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBmb2xkZXJGb3IoYnl0ZVtdIHV1aWQpIHsKLQkJYnl0ZSBoYXNoID0gaGFzaFVVSURieXRlcyh1dWlkKTsKLQkJaGFzaCAmPSBtYXNrOyAvLyBsaW1pdCB0aGUgcmFuZ2Ugb2YgdGhlIGRpcmVjdG9yeQotCQlyZXR1cm4gc3RvcmUgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2ggKyAoMTI4ICYgbWFzaykpICsgIi8iOyAvLyArKDEyOCAmIG1hc2spIG1ha2VzIHN1cmUgMDBoIGlzIHRoZSBsb3dlciB2YWx1ZSAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEJsb2IoYnl0ZVtdIHV1aWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVVJMKGZpbGVGb3IodXVpZCkpLm9wZW5TdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIGJ5dGUgaGFzaCByZXByZXNlbnRhdGlvbi4gSXQgaXMgdXNlZCB0bwotCSAqIGdldCBhIGRpcmVjdG9yeSBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBieXRlIGhhc2hVVUlEYnl0ZXMoYnl0ZVtdIHV1aWQpIHsKLQkJYnl0ZSBoYXNoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1dWlkLmxlbmd0aDsgaSsrKQotCQkJaGFzaCBePSByYW5kb21BcnJheVt1dWlkW2ldICsgMTI4XTsgLy8gKzEyOCBtYWtlcyBzdXJlIHRoZSBpbmRleCBpcyA+MAotCQlyZXR1cm4gaGFzaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Eb3dubG9hZEpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvRG93bmxvYWRKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMWEyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Eb3dubG9hZEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBHZW51aXRlYywgTExDIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR2VudWl0ZWMsIExMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCQkJCQkJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRKb2IgZXh0ZW5kcyBKb2IgewotCXN0YXRpYyBmaW5hbCBPYmplY3QgRkFNSUxZID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZzsKLQlwcml2YXRlIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtYXN0ZXJNb25pdG9yOwotCXByaXZhdGUgTXVsdGlTdGF0dXMgb3ZlcmFsbFN0YXR1czsKLQotCURvd25sb2FkSm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5LCBMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZywgSVByb2dyZXNzTW9uaXRvciBtYXN0ZXJNb25pdG9yLCBNdWx0aVN0YXR1cyBvdmVyYWxsU3RhdHVzKSB7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCXRoaXMucmVxdWVzdHNQZW5kaW5nID0gcmVxdWVzdHNQZW5kaW5nOwotCQl0aGlzLm1hc3Rlck1vbml0b3IgPSBtYXN0ZXJNb25pdG9yOwotCQl0aGlzLm92ZXJhbGxTdGF0dXMgPSBvdmVyYWxsU3RhdHVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNiZWxvbmdzVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQlyZXR1cm4gZmFtaWx5ID09IEZBTUlMWTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQkJam9iTW9uaXRvci5iZWdpblRhc2soIkRvd25sb2FkaW5nIHNvZnR3YXJlIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJZG8gewotCQkJLy8gZ2V0IHRoZSByZXF1ZXN0IHdlIGFyZSBnb2luZyB0byBwcm9jZXNzCi0JCQlJQXJ0aWZhY3RSZXF1ZXN0IHJlcXVlc3Q7Ci0JCQlzeW5jaHJvbml6ZWQgKHJlcXVlc3RzUGVuZGluZykgewotCQkJCWlmIChyZXF1ZXN0c1BlbmRpbmcuaXNFbXB0eSgpKQotCQkJCQlicmVhazsKLQkJCQlyZXF1ZXN0ID0gKElBcnRpZmFjdFJlcXVlc3QpIHJlcXVlc3RzUGVuZGluZy5yZW1vdmVGaXJzdCgpOwotCQkJfQotCQkJaWYgKG1hc3Rlck1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCS8vIHByb2Nlc3MgdGhlIGFjdHVhbCByZXF1ZXN0Ci0JCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobWFzdGVyTW9uaXRvciwgMSk7Ci0JCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KChBcnRpZmFjdFJlcXVlc3QpIHJlcXVlc3QsIHN1Yk1vbml0b3IpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKG92ZXJhbGxTdGF0dXMpIHsKLQkJCQkJCW92ZXJhbGxTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9IHdoaWxlICh0cnVlKTsKLQotCQlqb2JNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNjkwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIHZhcmlvdXMgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgTWFwcGVyIHsKLQlwcml2YXRlIEZpbHRlcltdIGZpbHRlcnM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBvdXRwdXRTdHJpbmdzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9VUkwgPSAicmVwb1VybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NJRklFUiA9ICJjbGFzc2lmaWVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1hcHBlcigpIHsKLQkJZmlsdGVycyA9IG5ldyBGaWx0ZXJbMF07Ci0JCW91dHB1dFN0cmluZ3MgPSBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIG1hcHBpbmcgcnVsZTogTERBUCBmaWx0ZXIgLS0+IG91dHB1dCB2YWx1ZQotCSAqIHRoZSBtb3JlIHNwZWNpZmljIGZpbHRlcnMgc2hvdWxkIGJlIGdpdmVuIGZpcnN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQnVuZGxlQ29udGV4dCBjdHgsIFN0cmluZ1tdW10gbWFwcGluZ1J1bGVzKSB7Ci0JCWZpbHRlcnMgPSBuZXcgRmlsdGVyW21hcHBpbmdSdWxlcy5sZW5ndGhdOwotCQlvdXRwdXRTdHJpbmdzID0gbmV3IFN0cmluZ1ttYXBwaW5nUnVsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nUnVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZmlsdGVyc1tpXSA9IGN0eC5jcmVhdGVGaWx0ZXIobWFwcGluZ1J1bGVzW2ldWzBdKTsKLQkJCQlvdXRwdXRTdHJpbmdzW2ldID0gbWFwcGluZ1J1bGVzW2ldWzFdOwotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9UT0RPIE5lZWVkIHRvIHByb2Nlc3MgdGhpcwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIG1hcChTdHJpbmcgcmVwb1VybCwgU3RyaW5nIGNsYXNzaWZpZXIsIFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBmb3JtYXQpIHsKLQkJRGljdGlvbmFyeSB2YWx1ZXMgPSBuZXcgSGFzaHRhYmxlKDUpOwotCQlpZiAocmVwb1VybCAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChSRVBPVVJMLCByZXBvVXJsKTsKLQotCQlpZiAoY2xhc3NpZmllciAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChDTEFTU0lGSUVSLCBjbGFzc2lmaWVyKTsKLQotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXZhbHVlcy5wdXQoSUQsIGlkKTsKLQotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChWRVJTSU9OLCB2ZXJzaW9uKTsKLQotCQlpZiAoZm9ybWF0ICE9IG51bGwpCi0JCQl2YWx1ZXMucHV0KEZPUk1BVCwgZm9ybWF0KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWx0ZXJzW2ldLm1hdGNoKHZhbHVlcykpCi0JCQkJcmV0dXJuIGRvUmVwbGFjZW1lbnQob3V0cHV0U3RyaW5nc1tpXSwgcmVwb1VybCwgY2xhc3NpZmllciwgaWQsIHZlcnNpb24sIGZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZG9SZXBsYWNlbWVudChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHJlcG9VcmwsIFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgZm9ybWF0KSB7Ci0JCS8vIGN1cnJlbnRseSBvdXIgbWFwcGluZyBydWxlcyBhc3N1bWUgdGhlIHJlcG8gVVJMIGlzIG5vdCAiLyIgdGVybWluYXRlZC4gCi0JCS8vIFRoaXMgbWF5IGJlIHRoZSBjYXNlIGZvciByZXBvVVJMcyBpbiB0aGUgcm9vdCBvZiBhIFVSTCBzcGFjZSBlLmcuIHJvb3Qgb2YgYSBqYXIgZmlsZSBvciBmaWxlOi9jOi8KLQkJaWYgKHJlcG9VcmwuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmVwb1VybCA9IHJlcG9Vcmwuc3Vic3RyaW5nKDAsIHJlcG9VcmwubGVuZ3RoKCkgLSAxKTsKLQotCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgb3V0cHV0Lmxlbmd0aCgpKSB7Ci0JCQlpbnQgYmVnaW5uaW5nID0gb3V0cHV0LmluZGV4T2YoIiR7IiwgaW5kZXgpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmVnaW5uaW5nID09IC0xKQotCQkJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLQotCQkJaW50IGVuZCA9IG91dHB1dC5pbmRleE9mKCJ9IiwgYmVnaW5uaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVuZCA9PSAtMSkKLQkJCQlyZXR1cm4gcGF0dGVybjsKLQotCQkJU3RyaW5nIHZhck5hbWUgPSBvdXRwdXQuc3Vic3RyaW5nKGJlZ2lubmluZyArIDIsIGVuZCk7Ci0JCQlTdHJpbmcgdmFyVmFsdWUgPSBudWxsOwotCQkJaWYgKHZhck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDTEFTU0lGSUVSKSkgewotCQkJCXZhclZhbHVlID0gY2xhc3NpZmllcjsKLQkJCX0gZWxzZSBpZiAodmFyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKElEKSkgewotCQkJCXZhclZhbHVlID0gaWQ7Ci0JCQl9IGVsc2UgaWYgKHZhck5hbWUuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OKSkgewotCQkJCXZhclZhbHVlID0gdmVyc2lvbjsKLQkJCX0gZWxzZSBpZiAodmFyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKFJFUE9VUkwpKSB7Ci0JCQkJdmFyVmFsdWUgPSByZXBvVXJsOwotCQkJfSBlbHNlIGlmICh2YXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9STUFUKSkgewotCQkJCXZhclZhbHVlID0gZm9ybWF0OwotCQkJfQotCQkJaWYgKHZhclZhbHVlID09IG51bGwpCi0JCQkJdmFyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlvdXRwdXQucmVwbGFjZShiZWdpbm5pbmcsIGVuZCArIDEsIHZhclZhbHVlKTsKLQkJCWluZGV4ID0gYmVnaW5uaW5nICsgdmFyVmFsdWUubGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFwcGVuZChmaWx0ZXJzW2ldKS5hcHBlbmQoJy0nKS5hcHBlbmQoJz4nKS5hcHBlbmQob3V0cHV0U3RyaW5nc1tpXSkuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmaWx0ZXJzLmxlbmd0aF1bMl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldWzBdID0gZmlsdGVyc1tpXS50b1N0cmluZygpOwotCQkJcmVzdWx0W2ldWzFdID0gb3V0cHV0U3RyaW5nc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTk2OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJCQkJCUdlbnVpdGVjLCBMTEMgLSBzdXBwb3J0IGZvciBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnksIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQkvKiogCi0JICogQSBib29sZWFuIHByb3BlcnR5IGNvbnRyb2xsaW5nIHdoZXRoZXIgbWlycm9yaW5nIGlzIGVuYWJsZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIE1JUlJPUlNfRU5BQkxFRCA9ICEiZmFsc2UiLmVxdWFscyhBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLm1pcnJvcnMiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQkvKiogCi0JICogVGhlIGtleSBmb3IgYSBpbnRlZ2VyIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlcgotCSAqIG9mIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIG9wdGltaXppbmcgZG93bmxvYWRzIGZyb20gYSByZW1vdGUKLQkgKiBhcnRpZmFjdCByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUFYX1RIUkVBRFMgPSAiZWNsaXBzZS5wMi5tYXgudGhyZWFkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFsbG93cyBvdmVycmlkZSBvZiB3aGV0aGVyIHRocmVhZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZPUkNFX1RIUkVBRElORyA9ICJlY2xpcHNlLnAyLmZvcmNlLnRocmVhZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBjbGFzcyBBcnRpZmFjdE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIElTdGF0ZWZ1bCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7Ci0JCXByaXZhdGUgbG9uZyBjb3VudCA9IDA7Ci0JCXByaXZhdGUgSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQlwcml2YXRlIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbjsKLQkJcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JCXByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCXB1YmxpYyBBcnRpZmFjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkJdGhpcyhvcywgZGVzY3JpcHRvciwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgQXJ0aWZhY3RPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGUgZmlsZSkgewotCQkJdGhpcy5kZXN0aW5hdGlvbiA9IG9zOwotCQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAoY2xvc2VkKQotCQkJCXJldHVybjsKLQkJCWNsb3NlZCA9IHRydWU7Ci0KLQkJCXRyeSB7Ci0JCQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjbGVhbnVwIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQkJZGVsZXRlKGZpbGUpOwotCQkJCWlmIChnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQkJCXRocm93IGU7Ci0JCQkJLy8gaWYgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGUuZy4gY2FuY2VsZWQsIHdlIGNhbiByZXR1cm4gLSB0aGUgc3RhdHVzIGlzIGFscmVhZHkgc2V0IGNvcnJlY3RseSAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc3RlcHMgcmFuIG9rIGFuZCB0aGVyZSB3YXMgYWN0dWFsIGNvbnRlbnQsIHdyaXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yCi0JCQkvLyBUT0RPIHRoZSBjb3VudCBjaGVjayBpcyBhIGJpdCBib2d1cyBidXQgaGVscHMgaW4gc29tZSBlcnJvciBjYXNlcyAoZS5nLiwgdGhlIG9wdGltaXplcikKLQkJCS8vIHdoZXJlIGVycm9ycyBvY2N1cnJlZCBpbiBhIHByb2Nlc3Npbmcgc3RlcCBlYXJsaWVyIGluIHRoZSBjaGFpbi4gIFdlIGxpa2VseSBuZWVkIGEgYmV0dGVyCi0JCQkvLyBvciBtb3JlIGV4cGxpY2l0IHdheSBvZiBoYW5kbGluZyB0aGlzIGNhc2UuCi0JCQlpZiAoZ2V0U3RhdHVzKCkuaXNPSygpICYmIFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyhkZXN0aW5hdGlvbikuaXNPSygpICYmIGNvdW50ID4gMCkgewotCQkJCSgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUsIExvbmcudG9TdHJpbmcoY291bnQpKTsKLQkJCQlhZGREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJfSBlbHNlIGlmIChmaWxlICE9IG51bGwpCi0JCQkJLy8gY2xlYW51cCBpZiBwb3NzaWJsZQotCQkJCWRlbGV0ZShmaWxlKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogc3RhdHVzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlkZXN0aW5hdGlvbi53cml0ZShiKTsKLQkJCWNvdW50ICs9IGIubGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlkZXN0aW5hdGlvbi53cml0ZShiLCBvZmYsIGxlbik7Ci0JCQljb3VudCArPSBsZW47Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWRlc3RpbmF0aW9uLndyaXRlKGIpOwotCQkJY291bnQrKzsKLQkJfQotCX0KLQotCS8vIFRPRE86IG9wdGltaXplCi0JLy8gd2UgY291bGQgc3RyZWFtIHJpZ2h0IGludG8gdGhlIGZvbGRlcgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgWmlwcGVkRm9sZGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQotCQlwcml2YXRlIGZpbmFsIEZpbGUgZm9sZGVyOwotCQlwcml2YXRlIGZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgemlwRmlsZTsKLQotCQlwdWJsaWMgWmlwcGVkRm9sZGVyT3V0cHV0U3RyZWFtKEZpbGUgZm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5mb2xkZXIgPSBmb2xkZXI7Ci0JCQl6aXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShmb2xkZXIuZ2V0TmFtZSgpLCBKQVJfRVhURU5TSU9OLCBudWxsKTsKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJZm9zLmNsb3NlKCk7Ci0JCQlGaWxlVXRpbHMudW56aXBGaWxlKHppcEZpbGUsIGZvbGRlcik7Ci0JCQl6aXBGaWxlLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJZm9zLmZsdXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGZvcy50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlmb3Mud3JpdGUoYik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWZvcy53cml0ZShiLCBvZmYsIGxlbik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWZvcy53cml0ZShiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9GT0xERVIgPSAiYXJ0aWZhY3QuZm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9SRUZFUkVOQ0UgPSAiYXJ0aWZhY3QucmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9VVUlEID0gImFydGlmYWN0LnV1aWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIEJMT0JTVE9SRSA9ICIuYmxvYnN0b3JlLyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgQ09OVEVOVF9GSUxFTkFNRSA9ICJhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nW11bXSBQQUNLRURfTUFQUElOR19SVUxFUyA9IHsgeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkgKGZvcm1hdD1wYWNrZWQpKSIsICIke3JlcG9Vcmx9L3BsdWdpbnMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIucGFjay5neiJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkpIiwgIiR7cmVwb1VybH0vcGx1Z2lucy8ke2lkfV8ke3ZlcnNpb259LmphciJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1iaW5hcnkpKSIsICIke3JlcG9Vcmx9L2JpbmFyeS8ke2lkfV8ke3ZlcnNpb259In0sIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifX07IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmdbXVtdIERFRkFVTFRfTUFQUElOR19SVUxFUyA9IHsgeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkpIiwgIiR7cmVwb1VybH0vcGx1Z2lucy8ke2lkfV8ke3ZlcnNpb259LmphciJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1iaW5hcnkpKSIsICIke3JlcG9Vcmx9L2JpbmFyeS8ke2lkfV8ke3ZlcnNpb259In0sIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifX07IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUkVQT1NJVE9SWV9UWVBFID0gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWTsKLQotCXN0YXRpYyBmaW5hbCBwcml2YXRlIEludGVnZXIgUkVQT1NJVE9SWV9WRVJTSU9OID0gbmV3IEludGVnZXIoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgdHJhbnNpZW50IEJsb2JTdG9yZSBibG9iU3RvcmU7Ci0JdHJhbnNpZW50IHByaXZhdGUgTWFwcGVyIG1hcHBlciA9IG5ldyBNYXBwZXIoKTsKLQotCXN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBQQUNLRURfRk9STUFUID0gInBhY2tlZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTID0gInB1Ymxpc2hQYWNrRmlsZXNBc1NpYmxpbmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSA0OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdW10gbWFwcGluZ1J1bGVzID0gREVGQVVMVF9NQVBQSU5HX1JVTEVTOwotCi0JcHJpdmF0ZSBib29sZWFuIHNpZ25hdHVyZVZlcmlmaWNhdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgTWlycm9yU2VsZWN0b3IgbWlycm9yczsKLQotCXN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIHRvRGVsZXRlKSB7Ci0JCWlmICh0b0RlbGV0ZS5pc0ZpbGUoKSkgewotCQkJdG9EZWxldGUuZGVsZXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRvRGVsZXRlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IHRvRGVsZXRlLmxpc3RGaWxlcygpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWRlbGV0ZShjaGlsZHJlbltpXSk7Ci0JCQkJfQotCQkJfQotCQkJdG9EZWxldGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRBY3R1YWxMb2NhdGlvbihVUkwgYmFzZSwgYm9vbGVhbiBjb21wcmVzcykgewotCQlyZXR1cm4gZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgY29tcHJlc3MgPyBKQVJfRVhURU5TSU9OIDogWE1MX0VYVEVOU0lPTik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGdldEFjdHVhbExvY2F0aW9uKFVSTCBiYXNlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gQ09OVEVOVF9GSUxFTkFNRSArIGV4dGVuc2lvbjsKLQkJU3RyaW5nIHNwZWMgPSBiYXNlLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWlmIChzcGVjLmVuZHNXaXRoKG5hbWUpKQotCQkJcmV0dXJuIGJhc2U7Ci0JCWlmIChzcGVjLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXNwZWMgKz0gbmFtZTsKLQkJZWxzZQotCQkJc3BlYyArPSAiLyIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzcGVjKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0QmxvYlN0b3JlTG9jYXRpb24oVVJMIGJhc2UpIHsKLQkJU3RyaW5nIHNwZWMgPSBiYXNlLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWlmIChzcGVjLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXNwZWMgKz0gQkxPQlNUT1JFOwotCQllbHNlCi0JCQlzcGVjICs9ICIvIiArIEJMT0JTVE9SRTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoc3BlYyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgcHJvdmlkZXIsIGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlLCBTZXQgYXJ0aWZhY3RzLCBTdHJpbmdbXVtdIG1hcHBpbmdSdWxlcywgTWFwIHByb3BlcnRpZXMpIHsKLQkJc3VwZXIobmFtZSwgdHlwZSwgdmVyc2lvbiwgbnVsbCwgZGVzY3JpcHRpb24sIHByb3ZpZGVyKTsKLQkJc2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gdmVyaWZ5U2lnbmF0dXJlOwotCQl0aGlzLmFydGlmYWN0RGVzY3JpcHRvcnMuYWRkQWxsKGFydGlmYWN0cyk7Ci0JCXRoaXMubWFwcGluZ1J1bGVzID0gbWFwcGluZ1J1bGVzOwotCQl0aGlzLnByb3BlcnRpZXMucHV0QWxsKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlOYW1lLCBVUkwgbG9jYXRpb24pIHsKLQkJc3VwZXIocmVwb3NpdG9yeU5hbWUsIFJFUE9TSVRPUllfVFlQRSwgUkVQT1NJVE9SWV9WRVJTSU9OLnRvU3RyaW5nKCksIGxvY2F0aW9uLCBudWxsLCBudWxsKTsKLQkJaW5pdGlhbGl6ZUFmdGVyTG9hZChsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciB0b0FkZCkgewotCQkvLyBUT0RPIHBlcmhhcHMgdGhlIGFyZ3VtZW50IGhlcmUgc2hvdWxkIGJlIEFydGlmYWN0RGVzY3JpcHRvci4gIElBcnRpZmFjdERlc2NyaXB0b3JzIGFyZSBmb3IgCi0JCS8vIHBlb3BsZSB3aG8gYXJlIHJlYWRpbmcgdGhlIHJlcG9zaXRvcnkuCi0JCS8vIFRPRE86IGhlcmUgd2UgbWF5IHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGFydGlmYWN0IGhhcyBub3QgYmVlbiBhZGRlZCBjb25jdXJyZW50bHkKLQkJKChBcnRpZmFjdERlc2NyaXB0b3IpIHRvQWRkKS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCQlhcnRpZmFjdERlc2NyaXB0b3JzLmFkZCh0b0FkZCk7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRGVzY3JpcHRvcnMoSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJKChBcnRpZmFjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzW2ldKS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcnNbaV0pOwotCQl9Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBPdXRwdXRTdHJlYW0gYWRkUG9zdFN0ZXBzKFByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUFycmF5TGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3RlcHMuYWRkKG5ldyBTaWduYXR1cmVWZXJpZmllcigpKTsKLQkJLy8JCWlmIChtZDVWZXJpZmljYXRpb24pCi0JCS8vCQkJc3RlcHMuYWRkKG5ldyBNRDVWZXJpZmllcihkZXNjcmlwdG9yLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuQVJUSUZBQ1RfTUQ1KSkpOwotCQlpZiAoc3RlcHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBBcnJheSA9IChQcm9jZXNzaW5nU3RlcFtdKSBzdGVwcy50b0FycmF5KG5ldyBQcm9jZXNzaW5nU3RlcFtzdGVwcy5zaXplKCldKTsKLQkJLy8gVE9ETyBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcgY3JlYXRlQW5kTGluayBoZXJlCi0JCXJldHVybiBoYW5kbGVyLmxpbmsoc3RlcEFycmF5LCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBPdXRwdXRTdHJlYW0gYWRkUHJlU3RlcHMoUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIsIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGQgc3RlcHMgaGVyZSBpZiBuZWVkZWQKLQkJaWYgKHN0ZXBzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBkZXN0aW5hdGlvbjsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwQXJyYXkgPSAoUHJvY2Vzc2luZ1N0ZXBbXSkgc3RlcHMudG9BcnJheShuZXcgUHJvY2Vzc2luZ1N0ZXBbc3RlcHMuc2l6ZSgpXSk7Ci0JCS8vIFRPRE8gc2hvdWxkIHByb2JhYmx5IGJlIHVzaW5nIGNyZWF0ZUFuZExpbmsgaGVyZQotCQlyZXR1cm4gaGFuZGxlci5saW5rKHN0ZXBBcnJheSwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgYnl0ZVtdIGJ5dGVzRnJvbUhleFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW1VuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIuQllURVNfU0laRV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpICs9IDIpIHsKLQkJCVN0cmluZyBieXRlU3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMik7Ci0JCQlieXRlc1tpIC8gMl0gPSAoYnl0ZSkgSW50ZWdlci5wYXJzZUludChieXRlU3RyaW5nLCAxNik7Ci0JCX0KLQkJcmV0dXJuIGJ5dGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBoZXhTdHJpbmc7Ci0JCQlpZiAoYnl0ZXNbaV0gPCAwKQotCQkJCWhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoMjU2ICsgYnl0ZXNbaV0pOwotCQkJZWxzZQotCQkJCWhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbaV0pOwotCQkJaWYgKGhleFN0cmluZy5sZW5ndGgoKSA9PSAxKQotCQkJCWJ1ZmZlci5hcHBlbmQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChoZXhTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnMoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0b3JzLmNvbnRhaW5zKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBjcmVhdGVMb2NhdGlvbihBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZmxhdEJ1dFBhY2tlZEVuYWJsZWQoZGVzY3JpcHRvcikpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkZvclBhY2tlZEJ1dEZsYXRBcnRpZmFjdHMoZGVzY3JpcHRvcik7Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc2NyaXB0b3IgaXMgY2Fub25pY2FsLCBjbGVhciBvdXQgYW55IFVVSUQgdGhhdCBtaWdodCBiZSBzZXQgYW5kIHVzZSB0aGUgTWFwcGVyCi0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlkZXNjcmlwdG9yLnNldFByb3BlcnR5KEFSVElGQUNUX1VVSUQsIG51bGwpOwotCQkJSUFydGlmYWN0S2V5IGtleSA9IGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKTsKLQkJCVN0cmluZyByZXN1bHQgPSBtYXBwZXIubWFwKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCksIGtleS5nZXRDbGFzc2lmaWVyKCksIGtleS5nZXRJZCgpLCBrZXkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCksIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpICYmIHJlc3VsdC5lbmRzV2l0aChKQVJfRVhURU5TSU9OKSkKLQkJCQkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxhc3RJbmRleE9mKEpBUl9FWFRFTlNJT04pKTsKLQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgZ2VuZXJhdGUgYSBsb2NhdGlvbiBieSBjcmVhdGluZyBhIFVVSUQsIHJlbWVtYmVyaW5nIGl0IGluIHRoZSBwcm9wZXJ0aWVzIAotCQkvLyBhbmQgY29tcHV0aW5nIHRoZSBsb2NhdGlvbgotCQlieXRlW10gYnl0ZXMgPSBuZXcgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcigpLnRvQnl0ZXMoKTsKLQkJZGVzY3JpcHRvci5zZXRQcm9wZXJ0eShBUlRJRkFDVF9VVUlELCBieXRlc1RvSGV4U3RyaW5nKGJ5dGVzKSk7Ci0JCXJldHVybiBibG9iU3RvcmUuZmlsZUZvcihieXRlcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwgYW5kIHRoZSBwaHlzaWNhbCBhcnRpZmFjdCBjb3JyZXNwb25kaW5nCi0JICogdG8gdGhhdCBkZXNjcmlwdG9yLiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZQotCSAqIGRlc2NyaXB0b3IgZXhpc3RlZCBpbiB0aGUgcmVwb3NpdG9yeSwgYW5kIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZG9SZW1vdmVBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfUkVGRVJFTkNFKSA9PSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlbGV0ZShmaWxlKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdG9ycy5yZW1vdmUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG93bmxvYWRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpKSB7Ci0JCQlGaWxlIGFydGlmYWN0Rm9sZGVyID0gZ2V0QXJ0aWZhY3RGaWxlKGRlc2NyaXB0b3IpOwotCQkJLy8gVE9ETzogb3B0aW1pemUgYW5kIGVuc3VyZSBtYW5pZmVzdCBpcyB3cml0dGVuIGZpcnN0Ci0JCQlGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShhcnRpZmFjdEZvbGRlci5nZXROYW1lKCksIEpBUl9FWFRFTlNJT04sIG51bGwpOwotCQkJCUZpbGVVdGlscy56aXAoYXJ0aWZhY3RGb2xkZXIubGlzdEZpbGVzKCksIHppcEZpbGUpOwotCQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKGZpcywgdHJ1ZSwgZGVzdGluYXRpb24sIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkKLQkJCQkJemlwRmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLy9kb3dubG9hZCBmcm9tIHRoZSBiZXN0IGF2YWlsYWJsZSBtaXJyb3IKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGdldExvY2F0aW9uKGRlc2NyaXB0b3IpOwotCQlTdHJpbmcgbWlycm9yTG9jYXRpb24gPSBnZXRNaXJyb3IoYmFzZUxvY2F0aW9uKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChtaXJyb3JMb2NhdGlvbiwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQlpZiAobWlycm9ycyAhPSBudWxsKQotCQkJbWlycm9ycy5yZXBvcnRSZXN1bHQobWlycm9yTG9jYXRpb24sIHJlc3VsdCk7Ci0JCWlmIChyZXN1bHQuaXNPSygpIHx8IGJhc2VMb2NhdGlvbi5lcXVhbHMobWlycm9yTG9jYXRpb24pKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJLy9tYXliZSB3ZSBoaXQgYSBiYWQgbWlycm9yIC0gdHJ5IHRoZSBiYXNlIGxvY2F0aW9uCi0JCXJldHVybiBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChiYXNlTG9jYXRpb24sIGRlc3RpbmF0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVxdWl2YWxlbnQgbWlycm9yIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYXJ0aWZhY3QgbG9jYXRpb24uCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGFydGlmYWN0IGluIHRoaXMgcmVwb3NpdG9yeQotCSAqIEByZXR1cm4gdGhlIExvY2F0aW9uIG9mIHRoZSBhcnRpZmFjdCBpbiB0aGlzIHJlcG9zaXRvcnksIG9yIGFuIGVxdWl2YWxlbnQgbWlycm9yCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE1pcnJvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCWlmICghTUlSUk9SU19FTkFCTEVEIHx8ICghaXNGb3JjZVRocmVhZGluZygpICYmIGlzTG9jYWwoKSkpCi0JCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCQlpZiAobWlycm9ycyA9PSBudWxsKQotCQkJbWlycm9ycyA9IG5ldyBNaXJyb3JTZWxlY3Rvcih0aGlzKTsKLQkJcmV0dXJuIG1pcnJvcnMuZ2V0TWlycm9yTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkvLyBpZiB3ZSBhcmUgYWRhcHRpbmcgdG8gZmlsZSBvciB3cml0YWJsZSByZXBvc2l0b3JpZXMgdGhlbiBtYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUgbG9jYXRpb24KLQkJaWYgKGFkYXB0ZXIgPT0gSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpCi0JCQlpZiAoIWlzTG9jYWwoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JSVN0YXR1cyBnZXRBcnRpZmFjdChBcnRpZmFjdFJlcXVlc3QgcmVxdWVzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJlcXVlc3Quc2V0U291cmNlUmVwb3NpdG9yeSh0aGlzKTsKLQkJcmVxdWVzdC5wZXJmb3JtKG1vbml0b3IpOwotCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyID0gbmV3IFByb2Nlc3NpbmdTdGVwSGFuZGxlcigpOwotCQlkZXN0aW5hdGlvbiA9IHByb2Nlc3NEZXN0aW5hdGlvbihoYW5kbGVyLCBkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNoZWNrU3RhdHVzKGRlc3RpbmF0aW9uKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJc3RhdHVzID0gZG93bmxvYWRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiByZXBvcnRTdGF0dXMoZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhrZXkpKQotCQkJCXJlc3VsdC5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIChJQXJ0aWZhY3REZXNjcmlwdG9yW10pIHJlc3VsdC50b0FycmF5KG5ldyBJQXJ0aWZhY3REZXNjcmlwdG9yW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXRMb2NhdGlvbihkZXNjcmlwdG9yKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8ICFyZXN1bHQuc3RhcnRzV2l0aCgiZmlsZToiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZShyZXN1bHQuc3Vic3RyaW5nKDUpKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0S2V5IGtleSkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDb21wbGV0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKSB7Ci0JCS8vIHRoZXJlIG1heSBiZSBtb3JlIGRlc2NyaXB0b3JzIHRoYW4ga2V5cyB0byBjb2xsZWN0IHVwIHRoZSB1bmlxdWUga2V5cwotCQlIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KGFydGlmYWN0RGVzY3JpcHRvcnMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFydGlmYWN0RGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGQoKChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdC5uZXh0KCkpLmdldEFydGlmYWN0S2V5KCkpOwotCQlyZXR1cm4gKElBcnRpZmFjdEtleVtdKSByZXN1bHQudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgTXVsdGlTdGF0dXMgb3ZlcmFsbFN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QocmVxdWVzdHMpKTsKLQotCQlpbnQgbnVtYmVyT2ZKb2JzID0gTWF0aC5taW4ocmVxdWVzdHMubGVuZ3RoLCBnZXRNYXhpbXVtVGhyZWFkcygpKTsKLQkJaWYgKG51bWJlck9mSm9icyA8PSAxIHx8ICghaXNGb3JjZVRocmVhZGluZygpICYmIGlzTG9jYWwoKSkpIHsKLQkJCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCByZXF1ZXN0cy5sZW5ndGgpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJSVN0YXR1cyByZXN1bHQgPSBnZXRBcnRpZmFjdCgoQXJ0aWZhY3RSZXF1ZXN0KSByZXF1ZXN0c1tpXSwgc3ViTW9uaXRvci5uZXdDaGlsZCgxKSk7Ci0JCQkJCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCQkJCW92ZXJhbGxTdGF0dXMuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgam9icyBuZWVkZWQgdG8gcHJvY2VzcyB0aGUgZ2V0IGFydGlmYWN0IHJlcXVlc3RzCi0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5zYXJfZG93bmxvYWRpbmcsIEludGVnZXIudG9TdHJpbmcocmVxdWVzdHMubGVuZ3RoKSksIHJlcXVlc3RzLmxlbmd0aCk7Ci0JCQl0cnkgewotCQkJCURvd25sb2FkSm9iIGpvYnNbXSA9IG5ldyBEb3dubG9hZEpvYltudW1iZXJPZkpvYnNdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZKb2JzOyBpKyspIHsKLQkJCQkJam9ic1tpXSA9IG5ldyBEb3dubG9hZEpvYihNZXNzYWdlcy5zYXJfZG93bmxvYWRKb2JOYW1lICsgaSk7Ci0JCQkJCWpvYnNbaV0uaW5pdGlhbGl6ZSh0aGlzLCByZXF1ZXN0c1BlbmRpbmcsIG1vbml0b3IsIG92ZXJhbGxTdGF0dXMpOwotCQkJCQlqb2JzW2ldLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJCS8vIHdhaXQgZm9yIGFsbCB0aGUgam9icyB0byBjb21wbGV0ZQotCQkJCXRyeSB7Ci0JCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihEb3dubG9hZEpvYi5GQU1JTFksIG51bGwpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAobW9uaXRvci5pc0NhbmNlbGVkKCkgPyBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyA6IG92ZXJhbGxTdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUFydGlmYWN0RGVzY3JpcHRvciBnZXRDb21wbGV0ZUFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzYyA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBsb29rIGZvciBhIGRlc2NyaXB0b3IgdGhhdCBtYXRjaGVzIHRoZSBrZXkgYW5kIGlzICJjb21wbGV0ZSIKLQkJCWlmIChkZXNjLmdldEFydGlmYWN0S2V5KCkuZXF1YWxzKGtleSkgJiYgZGVzYy5nZXRQcm9jZXNzaW5nU3RlcHMoKS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gZGVzYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFNldCBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5IG5vbi1jYW5vbmljYWwgZm9ybXMgb2YgdGhlIGFydGlmYWN0IGFyZSBzdG9yZWQgaW4gdGhlIGJsb2Igc3RvcmUuCi0JICogSG93ZXZlciwgd2Ugc3VwcG9ydCBoYXZpbmcgdGhlIHBhY2syMDAgZmlsZXMgYWxvbmdzaWRlIHRoZSBjYW5vbmljYWwgYXJ0aWZhY3QKLQkgKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmb3JtYXQgdXNlZCBpbiBvcHRpbWl6ZWQgdXBkYXRlIHNpdGVzLiAgV2UgY2FsbAotCSAqIHRoaXMgYXJyYW5nZW1lbnQgImZsYXQgYnV0IHBhY2tlZCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZsYXRCdXRQYWNrZWRFbmFibGVkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzKGdldFByb3BlcnRpZXMoKS5nZXQoUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTKSkgJiYgUEFDS0VEX0ZPUk1BVC5lcXVhbHMoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI2ZsYXRCdXRQYWNrZWRFbmFibGVkKElBcnRpZmFjdERlc2NyaXB0b3IpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25Gb3JQYWNrZWRCdXRGbGF0QXJ0aWZhY3RzKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQXJ0aWZhY3RLZXkga2V5ID0gZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpOwotCQlyZXR1cm4gbWFwcGVyLm1hcChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBrZXkuZ2V0Q2xhc3NpZmllcigpLCBrZXkuZ2V0SWQoKSwga2V5LmdldFZlcnNpb24oKS50b1N0cmluZygpLCBkZXNjcmlwdG9yLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRk9STUFUKSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TG9jYXRpb24oSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIGlmIHRoZSBhcnRpZmFjdCBoYXMgYSB1dWlkIHRoZW4gdXNlIGl0Ci0JCVN0cmluZyB1dWlkID0gZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShBUlRJRkFDVF9VVUlEKTsKLQkJaWYgKHV1aWQgIT0gbnVsbCkKLQkJCXJldHVybiBibG9iU3RvcmUuZmlsZUZvcihieXRlc0Zyb21IZXhTdHJpbmcodXVpZCkpOwotCi0JCWlmIChmbGF0QnV0UGFja2VkRW5hYmxlZChkZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uRm9yUGFja2VkQnV0RmxhdEFydGlmYWN0cyhkZXNjcmlwdG9yKTsKLQkJfQotCi0JCS8vIGlmIHRoZSBhcnRpZmFjdCBpcyBqdXN0IGEgcmVmZXJlbmNlIHRoZW4gcmV0dXJuIHRoZSByZWZlcmVuY2UgbG9jYXRpb24KLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBBcnRpZmFjdERlc2NyaXB0b3IpIHsKLQkJCVN0cmluZyBhcnRpZmFjdFJlZmVyZW5jZSA9ICgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfUkVGRVJFTkNFKTsKLQkJCWlmIChhcnRpZmFjdFJlZmVyZW5jZSAhPSBudWxsKQotCQkJCXJldHVybiBhcnRpZmFjdFJlZmVyZW5jZTsKLQkJfQotCi0JCS8vIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGNvbXBsZXRlIHRoZW4gdXNlIHRoZSBtYXBwaW5nIHJ1bGVzLi4uCi0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0gZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcHBlci5tYXAobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSwga2V5LmdldENsYXNzaWZpZXIoKSwga2V5LmdldElkKCksIGtleS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSwgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzRm9sZGVyQmFzZWQoZGVzY3JpcHRvcikgJiYgcmVzdWx0LmVuZHNXaXRoKEpBUl9FWFRFTlNJT04pKQotCQkJCQlyZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGFzdEluZGV4T2YoSkFSX0VYVEVOU0lPTikpOwotCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCS8vIGluIHRoZSBlbmQgdGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBzbyByZXR1cm4gbnVsbCAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkb3dubG9hZCB0aHJlYWRzLgotCSAqLwotCXByaXZhdGUgaW50IGdldE1heGltdW1UaHJlYWRzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG1heFRocmVhZFN0cmluZyA9IChTdHJpbmcpIGdldFByb3BlcnRpZXMoKS5nZXQoUFJPUF9NQVhfVEhSRUFEUyk7Ci0JCQlpZiAobWF4VGhyZWFkU3RyaW5nICE9IG51bGwpCi0JCQkJcmV0dXJuIE1hdGgubWF4KDEsIEludGVnZXIucGFyc2VJbnQobWF4VGhyZWFkU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCS8vIHJldHVybiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzCi0JCX0KLQkJcmV0dXJuIERFRkFVTFRfTUFYX1RIUkVBRFM7Ci0JfQotCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TW9kaWZpYWJsZSgpOwotCQkvLyBDaGVjayBpZiB0aGUgYXJ0aWZhY3QgaXMgYWxyZWFkeSBpbiB0aGlzIHJlcG9zaXRvcnkKLQkJaWYgKGNvbnRhaW5zKGRlc2NyaXB0b3IpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuYXZhaWxhYmxlX2FscmVhZHlfaW4sIGdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uQVJUSUZBQ1RfRVhJU1RTLCBtc2csIG51bGwpKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZQotCQlBcnRpZmFjdERlc2NyaXB0b3IgbmV3RGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpKQotCQkJbmV3RGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfRk9MREVSLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0KLQkJLy8gRGV0ZXJtaW5lIHdyaXRpbmcgbG9jYXRpb24KLQkJU3RyaW5nIG5ld0xvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24obmV3RGVzY3JpcHRvcik7Ci0JCVN0cmluZyBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBuZXcgVVJMKG5ld0xvY2F0aW9uKS5nZXRGaWxlKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIiArIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gVE9ETyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHJlcG9zaXRvcnkgaXMgZmlsZS1iYXNlZC4gIEV2ZW50dWFsbHkgCi0JCS8vIHdlIHNob3VsZCBlbmQgdXAgd2l0aCB3cml0ZWFibGUgVVJMcy4uLgotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhhdCB0aGUgcGFyZW50cyBkbwotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShmaWxlKTsKLQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQXJ0aWZhY3QgcmVwb3NpdG9yeSBvdXQgb2Ygc3luYy4gT3ZlcndyaXRpbmcgIiArIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWxldGUob3V0cHV0RmlsZSk7Ci0JCX0KLQotCQlPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc0ZvbGRlckJhc2VkKG5ld0Rlc2NyaXB0b3IpKSB7Ci0JCQkJb3V0cHV0RmlsZS5ta2RpcnMoKTsKLQkJCQlpZiAoIW91dHB1dEZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQkJdGhyb3cgZmFpbGVkV3JpdGUobmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLnNhcl9mYWlsZWRNa2Rpciwgb3V0cHV0RmlsZS50b1N0cmluZygpKSkpOwotCQkJCXRhcmdldCA9IG5ldyBaaXBwZWRGb2xkZXJPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGZpbGUgYmFzZWQKLQkJCQlGaWxlIHBhcmVudCA9IG91dHB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQlpZiAoIXBhcmVudC5pc0RpcmVjdG9yeSgpKQotCQkJCQl0aHJvdyBmYWlsZWRXcml0ZShuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuc2FyX2ZhaWxlZE1rZGlyLCBwYXJlbnQudG9TdHJpbmcoKSkpKTsKLQkJCQl0YXJnZXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQotCQkJLy8gZmluYWxseSBjcmVhdGUgYW5kIHJldHVybiBhbiBvdXRwdXQgc3RyZWFtIHN1aXRhYmx5IHdyYXBwZWQgc28gdGhhdCB3aGVuIGl0IGlzIAotCQkJLy8gY2xvc2VkIHRoZSByZXBvc2l0b3J5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvcgotCQkJcmV0dXJuIG5ldyBBcnRpZmFjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0odGFyZ2V0KSwgbmV3RGVzY3JpcHRvciwgb3V0cHV0RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGZhaWxlZFdyaXRlKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25FeGNlcHRpb24gZmFpbGVkV3JpdGUoRXhjZXB0aW9uIGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb0ZhaWxlZFdyaXRlLCBnZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfV1JJVEUsIG1zZywgZSkpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW11bXSBnZXRSdWxlcygpIHsKLQkJcmV0dXJuIG1hcHBpbmdSdWxlczsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gc2lnbmF0dXJlVmVyaWZpY2F0aW9uOwotCX0KLQotCXByaXZhdGUgVHJhbnNwb3J0IGdldFRyYW5zcG9ydCgpIHsKLQkJcmV0dXJuIEVDRlRyYW5zcG9ydC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8vIHVzZSB0aGlzIG1ldGhvZCB0byBzZXR1cCBhbnkgdHJhbnNpZW50IGZpZWxkcyBldGMgYWZ0ZXIgdGhlIG9iamVjdCBoYXMgYmVlbiByZXN0b3JlZCBmcm9tIGEgc3RyZWFtCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemVBZnRlckxvYWQoVVJMIGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJYmxvYlN0b3JlID0gbmV3IEJsb2JTdG9yZShnZXRCbG9iU3RvcmVMb2NhdGlvbihsb2NhdGlvbiksIDEyOCk7Ci0JCWluaXRpYWxpemVNYXBwZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYXJ0aWZhY3REZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCSgoQXJ0aWZhY3REZXNjcmlwdG9yKSBpLm5leHQoKSkuc2V0UmVwb3NpdG9yeSh0aGlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlcigpIHsKLQkJbWFwcGVyID0gbmV3IE1hcHBlcigpOwotCQltYXBwZXIuaW5pdGlhbGl6ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBtYXBwaW5nUnVsZXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ZvbGRlckJhc2VkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBpZiB0aGUgYXJ0aWZhY3QgaXMganVzdCBhIHJlZmVyZW5jZSB0aGVuIHJldHVybiB0aGUgcmVmZXJlbmNlIGxvY2F0aW9uCi0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgQXJ0aWZhY3REZXNjcmlwdG9yKSB7Ci0JCQlTdHJpbmcgdXNlQXJ0aWZhY3RGb2xkZXIgPSAoKEFydGlmYWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0UmVwb3NpdG9yeVByb3BlcnR5KEFSVElGQUNUX0ZPTERFUik7Ci0JCQlpZiAodXNlQXJ0aWZhY3RGb2xkZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHVzZUFydGlmYWN0Rm9sZGVyKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQkvL1RPRE86IHJlZmFjdG9yIHRoaXMgd2hlbiB0aGUgYXJ0aWZhY3QgZm9sZGVyIHByb3BlcnR5IGlzIGNvbnNpc3RlbnRseSBzZXQgaW4gcmVwb3NpdG9yeSBwcm9wZXJ0aWVzCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShBUlRJRkFDVF9GT0xERVIpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNGb3JjZVRocmVhZGluZygpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoZ2V0UHJvcGVydGllcygpLmdldChQUk9QX0ZPUkNFX1RIUkVBRElORykpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTG9jYWwoKSB7Ci0JCXJldHVybiAiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShsb2NhdGlvbi5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJcmV0dXJuIGlzTG9jYWwoKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIHByb2Nlc3NEZXN0aW5hdGlvbihQcm9jZXNzaW5nU3RlcEhhbmRsZXIgaGFuZGxlciwgSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZXN0aW5hdGlvbiA9IGFkZFBvc3RTdGVwcyhoYW5kbGVyLCBkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCWRlc3RpbmF0aW9uID0gaGFuZGxlci5jcmVhdGVBbmRMaW5rKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCksIGRlc2NyaXB0b3IsIGRlc3RpbmF0aW9uLCBtb25pdG9yKTsKLQkJZGVzdGluYXRpb24gPSBhZGRQcmVTdGVwcyhoYW5kbGVyLCBkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiBkZXN0aW5hdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQWxsKCkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gdG9SZW1vdmUgPSAoSUFydGlmYWN0RGVzY3JpcHRvcltdKSBhcnRpZmFjdERlc2NyaXB0b3JzLnRvQXJyYXkobmV3IElBcnRpZmFjdERlc2NyaXB0b3JbYXJ0aWZhY3REZXNjcmlwdG9ycy5zaXplKCldKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspCi0JCQljaGFuZ2VkIHw9IGRvUmVtb3ZlQXJ0aWZhY3QodG9SZW1vdmVbaV0pOwotCQlpZiAoY2hhbmdlZCkKLQkJCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRvUmVtb3ZlQXJ0aWZhY3QoZGVzY3JpcHRvcikpCi0JCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gdG9SZW1vdmUgPSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKQotCQkJY2hhbmdlZCB8PSBkb1JlbW92ZUFydGlmYWN0KHRvUmVtb3ZlW2ldKTsKLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVwb3J0U3RhdHVzKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJU3RhdHVzIHN0YXR1cykgewotCQkvLyBJZiB0aGUgZGVzdGluYXRpb24gaXMganVzdCBhIG5vcm1hbCBzdHJlYW0gdGhlbiB0aGUgc3RhdHVzIGlzIHNpbXBsZS4gIEp1c3QgcmV0dXJuCi0JCS8vIGl0IGFuZCBkbyBub3QgY2xvc2UgdGhlIGRlc3RpbmF0aW9uCi0JCWlmICghKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgUHJvY2Vzc2luZ1N0ZXApKQotCQkJcmV0dXJuIHN0YXR1czsKLQotCQkvLyBJZiB0aGUgZGVzdGluYXRpb24gaXMgYSBwcm9jZXNzaW5nIHN0ZXAgdGhlbiBjbG9zZSB0aGUgc3RyZWFtIHRvIGZsdXNoIHRoZSBkYXRhIHRocm91Z2ggYWxsCi0JCS8vIHRoZSBzdGVwcy4gIHRoZW4gY29sbGVjdCB1cCB0aGUgc3RhdHVzIGZyb20gYWxsIHRoZSBzdGVwcyBhbmQgcmV0dXJuCi0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLnNhcl9yZXBvcnRTdGF0dXMsIGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0ZXBTdGF0dXMgPSAoKFByb2Nlc3NpbmdTdGVwKSBkZXN0aW5hdGlvbikuZ2V0U3RhdHVzKHRydWUpOwotCQkvLyBpZiB0aGUgc3RlcHMgYWxsIHJhbiBvayBhbmQgdGhlcmUgaXMgbm8gaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24sIHJldHVybiB0aGUgc3RhdHVzIGZyb20gdGhpcyBtZXRob2QKLQkJaWYgKCFzdGVwU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSAmJiBzdGVwU3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCS8vIGVsc2UgZ2F0aGVyIHVwIHRoZSBzdGF0dXMgZnJvbSB0aGUgc3RlcHMKLQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5JRCwgSVN0YXR1cy5PSywgbmV3IElTdGF0dXNbMF0sIE5MUy5iaW5kKE1lc3NhZ2VzLnNhcl9yZXBvcnRTdGF0dXMsIGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKS50b0V4dGVybmFsRm9ybSgpKSwgbnVsbCk7Ci0JCXJlc3VsdC5tZXJnZShzdGF0dXMpOwotCQlyZXN1bHQubWVyZ2Uoc3RlcFN0YXR1cyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHsKLQkJYm9vbGVhbiBjb21wcmVzcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFBST1BfQ09NUFJFU1NFRCkpOyAvLyROT04tTkxTLTEkCi0JCXNhdmUoY29tcHJlc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoYm9vbGVhbiBjb21wcmVzcykgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCVVSTCBhY3R1YWxMb2NhdGlvbiA9IGdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCBmYWxzZSk7Ci0JCQkJRmlsZSBhcnRpZmFjdHNGaWxlID0gbmV3IEZpbGUoYWN0dWFsTG9jYXRpb24uZ2V0UGF0aCgpKTsKLQkJCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShnZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgdHJ1ZSkuZ2V0UGF0aCgpKTsKLQkJCQlpZiAoIWNvbXByZXNzKSB7Ci0JCQkJCWlmIChqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlqYXJGaWxlLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWlmICghYXJ0aWZhY3RzRmlsZS5leGlzdHMoKSkgewotCQkJCQkJLy8gY3JlYXRlIHBhcmVudCBmb2xkZXJzCi0JCQkJCQlhcnRpZmFjdHNGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJfQotCQkJCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFydGlmYWN0c0ZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChhcnRpZmFjdHNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlhcnRpZmFjdHNGaWxlLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWlmICghamFyRmlsZS5leGlzdHMoKSkgewotCQkJCQkJaWYgKCFqYXJGaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJCQlqYXJGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJCWphckZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQl9Ci0JCQkJCUphck91dHB1dFN0cmVhbSBqT3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGphckZpbGUpKTsKLQkJCQkJak9zLnB1dE5leHRFbnRyeShuZXcgSmFyRW50cnkobmV3IFBhdGgoYWN0dWFsTG9jYXRpb24uZ2V0RmlsZSgpKS5sYXN0U2VnbWVudCgpKSk7Ci0JCQkJCW9zID0gak9zOwotCQkJCX0KLQkJCQlzdXBlci5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX1RJTUVTVEFNUCwgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotCQkJCW5ldyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlJTygpLndyaXRlKHRoaXMsIG9zKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIHByb3BlciBleGNlcHRpb24gaGFuZGxpbmcKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob3MgIT0gbnVsbCkKLQkJCQkJb3MuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHN1cGVyLnNldFByb3BlcnR5KGtleSwgbmV3VmFsdWUpOwotCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgfHwgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUuZXF1YWxzKG5ld1ZhbHVlKSkpCi0JCQlyZXR1cm4gb2xkVmFsdWU7Ci0JCWlmIChQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MuZXF1YWxzKGtleSkpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQkJCW1hcHBpbmdSdWxlcyA9IFBBQ0tFRF9NQVBQSU5HX1JVTEVTOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hcHBpbmdSdWxlcyA9IERFRkFVTFRfTUFQUElOR19SVUxFUzsKLQkJCQl9Ci0JCQkJaW5pdGlhbGl6ZU1hcHBlcigpOwotCQkJfQotCQl9Ci0JCXNhdmUoKTsKLQkJLy9mb3JjZSByZXBvc2l0b3J5IG1hbmFnZXIgdG8gcmVsb2FkIHRoaXMgcmVwb3NpdG9yeSBiZWNhdXNlIGl0IGNhY2hlcyBwcm9wZXJ0aWVzCi0JCUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShnZXRMb2NhdGlvbigpKSkKLQkJCW1hbmFnZXIuYWRkUmVwb3NpdG9yeSh0aGlzKTsKLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSdWxlcyhTdHJpbmdbXVtdIHJ1bGVzKSB7Ci0JCW1hcHBpbmdSdWxlcyA9IHJ1bGVzOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTaWduYXR1cmVWZXJpZmljYXRpb24oYm9vbGVhbiB2YWx1ZSkgewotCQlzaWduYXR1cmVWZXJpZmljYXRpb24gPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlJTy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ZkMWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLk9yZGVyZWRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCB3cml0ZXMgYXJ0aWZhY3QgcmVwb3NpdG9yeSBtZXRhZGF0YQotICogKGUuZy4gdGFibGUgb2YgY29udGVudHMgZmlsZXMpOwotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGFjdHVhbCBhcnRpZmFjdHMuCi0gKi8KLQotLy8gVE9ETzogU2hvdWxkIGEgcmVnaXN0cmF0aW9uL2ZhY3RvcnkgbWVjaGFuaXNtIGJlIHN1cHBvcnRlZAotLy8JCSBmb3IgZ2V0dGluZyBhIHJlcG9zaXRvcnkgcmVhZGVyL3dyaXRlciBnaXZlbiBhIHJlcG9zaXRvcnkgdHlwZQotcHVibGljIGNsYXNzIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPIHsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byB0aGUgc3RyZWFtLgotCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGJ1ZmZlcmluZywgYW5kIGNsb3NlcyB0aGUgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnksIE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLQkJT3V0cHV0U3RyZWFtIGJ1ZmZlcmVkT3V0cHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRPdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJCQlXcml0ZXIgcmVwb3NpdG9yeVdyaXRlciA9IG5ldyBXcml0ZXIoYnVmZmVyZWRPdXRwdXQpOwotCQkJCXJlcG9zaXRvcnlXcml0ZXIud3JpdGUocmVwb3NpdG9yeSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChidWZmZXJlZE91dHB1dCAhPSBudWxsKSB7Ci0JCQkJCWJ1ZmZlcmVkT3V0cHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIFRPRE8gc2hvdWxkbid0IHRoaXMgdGhyb3cgYSBjb3JlIGV4Y2VwdGlvbj8KLQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IGZyb20gdGhlIGdpdmVuIHN0cmVhbSwKLQkgKiBhbmQgcmV0dXJucyB0aGUgY29udGFpbmVkIGFycmF5IG9mIGFic3RyYWN0IGFydGlmYWN0IHJlcG9zaXRvcmllcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBidWZmZXJpbmcsIGFuZCBjbG9zZXMgdGhlIHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlYWQoVVJMIGxvY2F0aW9uLCBJbnB1dFN0cmVhbSBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZmZXJlZElucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRJbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0KTsKLQkJCQlQYXJzZXIgcmVwb3NpdG9yeVBhcnNlciA9IG5ldyBQYXJzZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWN0aXZhdG9yLklEKTsKLQkJCQlyZXBvc2l0b3J5UGFyc2VyLnBhcnNlKGlucHV0KTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHJlcG9zaXRvcnlQYXJzZXIuZ2V0U3RhdHVzKCk7Ci0JCQkJc3dpdGNoIChyZXN1bHQuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCQljYXNlIElTdGF0dXMuQ0FOQ0VMIDoKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihyZXN1bHQpOwotCQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlcG9zaXRvcnlQYXJzZXIuZ2V0UmVwb3NpdG9yeSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYnVmZmVyZWRJbnB1dCAhPSBudWxsKQotCQkJCQlidWZmZXJlZElucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFELCBtc2csIGlvZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgWE1MQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxDb25zdGFudHMgewotCi0JCS8vIENvbnN0YW50cyBkZWZpbmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBYTUwgZm9yIGEgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5Ci0KLQkJLy8gQSBmb3JtYXQgdmVyc2lvbiBudW1iZXIgZm9yIHNpbXBsZSBhcnRpZmFjdCByZXBvc2l0b3J5IFhNTC4KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uIENVUlJFTlRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25SYW5nZSBYTUxfVE9MRVJBTkNFID0gbmV3IFZlcnNpb25SYW5nZShDVVJSRU5UX1ZFUlNJT04sIHRydWUsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSk7Ci0KLQkJLy8gQ29uc3RhbnRzIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9SRVBPU0lUT1JZX1RBUkdFVCA9ICJhcnRpZmFjdFJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgWE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIFBJX0RFRkFVTFRTID0gbmV3IFhNTFdyaXRlci5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7WE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5tYWtlQ2xhc3NWZXJzaW9uSW5zdHJ1Y3Rpb24oUElfUkVQT1NJVE9SWV9UQVJHRVQsIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcywgQ1VSUkVOVF9WRVJTSU9OKX07Ci0KLQkJLy8gQ29uc3RhbnRzIGZvciBhcnRpZmFjdCByZXBvc2l0b3J5IGVsZW1lbnRzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfRUxFTUVOVCA9ICJyZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1BST1BFUlRJRVNfRUxFTUVOVCA9ICJyZXBvc2l0b3J5UHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19SVUxFU19FTEVNRU5UID0gIm1hcHBpbmdzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1JVTEVfRUxFTUVOVCA9ICJydWxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVFNfRUxFTUVOVCA9ICJhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0VMRU1FTlQgPSAiYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NJTkdfU1RFUFNfRUxFTUVOVCA9ICJwcm9jZXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCA9ICJzdGVwIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENvbnN0YW50cyBmb3IgYXR0cmlidXRlcyBvZiBhcnRpZmFjdCByZXBvc2l0b3J5IGVsZW1lbnRzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUklGWV9TSUdOQVRVUkVfQVRUUklCVVRFID0gInZlcmlmeSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1JVTEVfRklMVEVSX0FUVFJJQlVURSA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfUlVMRV9PVVRQVVRfQVRUUklCVVRFID0gIm91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9DTEFTU0lGSUVSX0FUVFJJQlVURSA9IENMQVNTSUZJRVJfQVRUUklCVVRFOwotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBfREFUQV9BVFRSSUJVVEUgPSAiZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9SRVFVSVJFRF9BVFRSSUJVVEUgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gWE1MIHdyaXRlciBmb3IgYSBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkKLQlwcm90ZWN0ZWQgY2xhc3MgV3JpdGVyIGV4dGVuZHMgWE1MV3JpdGVyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCQlwdWJsaWMgV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihvdXRwdXQsIFBJX0RFRkFVTFRTKTsKLQkJfQotCi0JCS8qKgotCQkgKiBXcml0ZSB0aGUgZ2l2ZW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHdyaXRlKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdGFydChSRVBPU0lUT1JZX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKE5BTUVfQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldE5hbWUoKSk7Ci0JCQlhdHRyaWJ1dGUoVFlQRV9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0VHlwZSgpKTsKLQkJCWF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQlVURSwgcmVwb3NpdG9yeS5nZXRWZXJzaW9uKCkpOwotCQkJYXR0cmlidXRlT3B0aW9uYWwoUFJPVklERVJfQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldFByb3ZpZGVyKCkpOwotCQkJYXR0cmlidXRlT3B0aW9uYWwoREVTQ1JJUFRJT05fQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldERlc2NyaXB0aW9uKCkpOyAvLyBUT0RPOiBjb3VsZCBiZSBjZGF0YT8KLQkJCWF0dHJpYnV0ZShWRVJJRllfU0lHTkFUVVJFX0FUVFJJQlVURSwgcmVwb3NpdG9yeS5nZXRTaWduYXR1cmVWZXJpZmljYXRpb24oKSwgZmFsc2UpOwotCi0JCQl3cml0ZVByb3BlcnRpZXMocmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJd3JpdGVNYXBwaW5nUnVsZXMocmVwb3NpdG9yeS5nZXRSdWxlcygpKTsKLQkJCXdyaXRlQXJ0aWZhY3RzKHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWVuZChSRVBPU0lUT1JZX0VMRU1FTlQpOwotCQkJZmx1c2goKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB3cml0ZU1hcHBpbmdSdWxlcyhTdHJpbmdbXVtdIHJ1bGVzKSB7Ci0JCQlpZiAocnVsZXMubGVuZ3RoID4gMCkgewotCQkJCXN0YXJ0KE1BUFBJTkdfUlVMRVNfRUxFTUVOVCk7Ci0JCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHJ1bGVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlzdGFydChNQVBQSU5HX1JVTEVfRUxFTUVOVCk7Ci0JCQkJCWF0dHJpYnV0ZShNQVBQSU5HX1JVTEVfRklMVEVSX0FUVFJJQlVURSwgcnVsZXNbaV1bMF0pOwotCQkJCQlhdHRyaWJ1dGUoTUFQUElOR19SVUxFX09VVFBVVF9BVFRSSUJVVEUsIHJ1bGVzW2ldWzFdKTsKLQkJCQkJZW5kKE1BUFBJTkdfUlVMRV9FTEVNRU5UKTsKLQkJCQl9Ci0JCQkJZW5kKE1BUFBJTkdfUlVMRVNfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgd3JpdGVBcnRpZmFjdHMoU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMpIHsKLQkJCXN0YXJ0KEFSVElGQUNUU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBhcnRpZmFjdERlc2NyaXB0b3JzLnNpemUoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEFydGlmYWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJSUFydGlmYWN0S2V5IGtleSA9IGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKTsKLQkJCQlzdGFydChBUlRJRkFDVF9FTEVNRU5UKTsKLQkJCQlhdHRyaWJ1dGUoQVJUSUZBQ1RfQ0xBU1NJRklFUl9BVFRSSUJVVEUsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQkJCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIGtleS5nZXRJZCgpKTsKLQkJCQlhdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJVVEUsIGtleS5nZXRWZXJzaW9uKCkpOwotCQkJCXdyaXRlUHJvY2Vzc2luZ1N0ZXBzKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkpOwotCQkJCXdyaXRlUHJvcGVydGllcyhkZXNjcmlwdG9yLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJd3JpdGVQcm9wZXJ0aWVzKFJFUE9TSVRPUllfUFJPUEVSVElFU19FTEVNRU5ULCBkZXNjcmlwdG9yLmdldFJlcG9zaXRvcnlQcm9wZXJ0aWVzKCkpOwotCQkJCWVuZChBUlRJRkFDVF9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChBUlRJRkFDVFNfRUxFTUVOVCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgd3JpdGVQcm9jZXNzaW5nU3RlcHMoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gcHJvY2Vzc2luZ1N0ZXBzKSB7Ci0JCQlpZiAocHJvY2Vzc2luZ1N0ZXBzLmxlbmd0aCA+IDApIHsKLQkJCQlzdGFydChQUk9DRVNTSU5HX1NURVBTX0VMRU1FTlQpOwotCQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBwcm9jZXNzaW5nU3RlcHMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NpbmdTdGVwcy5sZW5ndGg7IGkrKykgewotCQkJCQlzdGFydChQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCk7Ci0JCQkJCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5nZXRQcm9jZXNzb3JJZCgpKTsKLQkJCQkJYXR0cmlidXRlKFNURVBfREFUQV9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5nZXREYXRhKCkpOwotCQkJCQlhdHRyaWJ1dGUoU1RFUF9SRVFVSVJFRF9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5pc1JlcXVpcmVkKCkpOwotCQkJCQllbmQoUFJPQ0VTU0lOR19TVEVQX0VMRU1FTlQpOwotCQkJCX0KLQkJCQllbmQoUFJPQ0VTU0lOR19TVEVQU19FTEVNRU5UKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUGFyc2VyIGZvciB0aGUgY29udGVudHMgb2YgYSBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnksCi0JICogYXMgd3JpdHRlbiBieSB0aGUgV3JpdGVyIGNsYXNzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCQlwcml2YXRlIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSB0aGVSZXBvc2l0b3J5ID0gbnVsbDsKLQotCQlwdWJsaWMgUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlwYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aGlzLnN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE86IGN1cnJlbnRseSBub3QgY2FjaGluZyB0aGUgcGFyc2VyIHNpbmNlIHdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMKLQkJCQkvLwkJIG9yIHJlc3RyaWN0aW9ucyBvbiBjb25jdXJyZW50IHBhcnNpbmcKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlSZXBvc2l0b3J5SGFuZGxlciByZXBvc2l0b3J5SGFuZGxlciA9IG5ldyBSZXBvc2l0b3J5SGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUmVwb3NpdG9yeURvY0hhbmRsZXIoUkVQT1NJVE9SWV9FTEVNRU5ULCByZXBvc2l0b3J5SGFuZGxlcikpOwotCQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQl0aGVSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeUhhbmRsZXIuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQkJcmV0dXJuIHRoZVJlcG9zaXRvcnk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhlUmVwb3NpdG9yeTsKLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgUmVwb3NpdG9yeURvY0hhbmRsZXIgZXh0ZW5kcyBEb2NIYW5kbGVyIHsKLQotCQkJcHVibGljIFJlcG9zaXRvcnlEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChQSV9SRVBPU0lUT1JZX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQkvLyBUT0RPOiBzaG91bGQgdGhlIHJvb3QgaGFuZGxlciBiZSBjb25zdHJ1Y3RlZCBiYXNlZCBvbiBjbGFzcwotCQkJCQkvLyAJCSB2aWEgYW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5IG1lY2hhbmlzbT8KLQkJCQkJLy8gU3RyaW5nIGNsYXp6ID0gZXh0cmFjdFBJQ2xhc3MoZGF0YSk7Ci0JCQkJCS8vIFRPRE86IHZlcnNpb24gdG9sZXJhbmNlIGJ5IGV4dGVuc2lvbgotCQkJCQlWZXJzaW9uIHJlcG9zaXRvcnlWZXJzaW9uID0gZXh0cmFjdFBJVmVyc2lvbih0YXJnZXQsIGRhdGEpOwotCQkJCQlpZiAoIVhNTF9UT0xFUkFOQ0UuaXNJbmNsdWRlZChyZXBvc2l0b3J5VmVyc2lvbikpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuaW9faW5jb21wYXRpYmxlVmVyc2lvbiwgcmVwb3NpdG9yeVZlcnNpb24sIFhNTF9UT0xFUkFOQ0UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZXBvc2l0b3J5SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRV9BVFRSSUJVVEUsIFRZUEVfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG9wdGlvbmFsID0gbmV3IFN0cmluZ1tdIHtERVNDUklQVElPTl9BVFRSSUJVVEUsIFBST1ZJREVSX0FUVFJJQlVURSwgVkVSSUZZX1NJR05BVFVSRV9BVFRSSUJVVEV9OwotCi0JCQlwcml2YXRlIFN0cmluZ1tdIGF0dHJWYWx1ZXMgPSBuZXcgU3RyaW5nW3JlcXVpcmVkLmxlbmd0aCArIG9wdGlvbmFsLmxlbmd0aF07Ci0KLQkJCXByaXZhdGUgTWFwcGluZ1J1bGVzSGFuZGxlciBtYXBwaW5nUnVsZXNIYW5kbGVyID0gbnVsbDsKLQkJCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcHJvcGVydGllc0hhbmRsZXIgPSBudWxsOwotCQkJcHJpdmF0ZSBBcnRpZmFjdHNIYW5kbGVyIGFydGlmYWN0c0hhbmRsZXIgPSBudWxsOwotCi0JCQlwcml2YXRlIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbnVsbDsKLQotCQkJcHVibGljIFJlcG9zaXRvcnlIYW5kbGVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKLQkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUm9vdEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJYXR0clZhbHVlcyA9IHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCwgb3B0aW9uYWwpOwotCQkJCWF0dHJWYWx1ZXNbMl0gPSBjaGVja1ZlcnNpb24oUkVQT1NJVE9SWV9FTEVNRU5ULCBWRVJTSU9OX0FUVFJJQlVURSwgYXR0clZhbHVlc1syXSkudG9TdHJpbmcoKTsKLQkJCQlhdHRyVmFsdWVzWzVdID0gY2hlY2tCb29sZWFuKFJFUE9TSVRPUllfRUxFTUVOVCwgVkVSSUZZX1NJR05BVFVSRV9BVFRSSUJVVEUsIGF0dHJWYWx1ZXNbNV0sIGZhbHNlKS50b1N0cmluZygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChNQVBQSU5HX1JVTEVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChtYXBwaW5nUnVsZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCW1hcHBpbmdSdWxlc0hhbmRsZXIgPSBuZXcgTWFwcGluZ1J1bGVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKEFSVElGQUNUU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlhcnRpZmFjdHNIYW5kbGVyID0gbmV3IEFydGlmYWN0c0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChQUk9QRVJUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlwcm9wZXJ0aWVzSGFuZGxlciA9IG5ldyBQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJU3RyaW5nW11bXSBtYXBwaW5nUnVsZXMgPSAobWFwcGluZ1J1bGVzSGFuZGxlciA9PSBudWxsID8gbmV3IFN0cmluZ1swXVswXSAvLwotCQkJCQkJCTogbWFwcGluZ1J1bGVzSGFuZGxlci5nZXRNYXBwaW5nUnVsZXMoKSk7Ci0JCQkJCU1hcCBwcm9wZXJ0aWVzID0gKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwgPyBuZXcgT3JkZXJlZFByb3BlcnRpZXMoMCkgLy8KLQkJCQkJCQk6IHByb3BlcnRpZXNIYW5kbGVyLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJCVNldCBhcnRpZmFjdHMgPSAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsID8gbmV3IEhhc2hTZXQoMCkgLy8KLQkJCQkJCQk6IGFydGlmYWN0c0hhbmRsZXIuZ2V0QXJ0aWZhY3RzKCkpOwotCQkJCQlib29sZWFuIHZlcmlmeVNpZ25hdHVyZSA9IChhdHRyVmFsdWVzWzVdID09IG51bGwgPyBmYWxzZSAvLwotCQkJCQkJCTogbmV3IEJvb2xlYW4oYXR0clZhbHVlc1s1XSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlyZXBvc2l0b3J5ID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeShhdHRyVmFsdWVzWzBdLCBhdHRyVmFsdWVzWzFdLCBhdHRyVmFsdWVzWzJdLCBhdHRyVmFsdWVzWzNdLCAvLwotCQkJCQkJCWF0dHJWYWx1ZXNbNF0sIHZlcmlmeVNpZ25hdHVyZSwgYXJ0aWZhY3RzLCBtYXBwaW5nUnVsZXMsIHByb3BlcnRpZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBNYXBwaW5nUnVsZXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBMaXN0IG1hcHBpbmdSdWxlczsKLQotCQkJcHVibGljIE1hcHBpbmdSdWxlc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIE1BUFBJTkdfUlVMRVNfRUxFTUVOVCk7Ci0JCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJCW1hcHBpbmdSdWxlcyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXVtdIGdldE1hcHBpbmdSdWxlcygpIHsKLQkJCQlTdHJpbmdbXVtdIHJ1bGVzID0gbmV3IFN0cmluZ1ttYXBwaW5nUnVsZXMuc2l6ZSgpXVsyXTsKLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWFwcGluZ1J1bGVzLnNpemUoKTsgaW5kZXgrKykgewotCQkJCQlTdHJpbmdbXSBydWxlQXR0cmlidXRlcyA9IChTdHJpbmdbXSkgbWFwcGluZ1J1bGVzLmdldChpbmRleCk7Ci0JCQkJCXJ1bGVzW2luZGV4XSA9IHJ1bGVBdHRyaWJ1dGVzOwotCQkJCX0KLQkJCQlyZXR1cm4gcnVsZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKE1BUFBJTkdfUlVMRV9FTEVNRU5UKSkgewotCQkJCQluZXcgTWFwcGluZ1J1bGVIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIG1hcHBpbmdSdWxlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIGNsYXNzIE1hcHBpbmdSdWxlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge01BUFBJTkdfUlVMRV9GSUxURVJfQVRUUklCVVRFLCBNQVBQSU5HX1JVTEVfT1VUUFVUX0FUVFJJQlVURX07Ci0KLQkJCXB1YmxpYyBNYXBwaW5nUnVsZUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBtYXBwaW5nUnVsZXMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBNQVBQSU5HX1JVTEVfRUxFTUVOVCk7Ci0JCQkJbWFwcGluZ1J1bGVzLmFkZChwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIGNsYXNzIEFydGlmYWN0c0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIFNldCBhcnRpZmFjdHM7Ci0KLQkJCXB1YmxpYyBBcnRpZmFjdHNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBBUlRJRkFDVFNfRUxFTUVOVCk7Ci0JCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJCWFydGlmYWN0cyA9IChzaXplICE9IG51bGwgPyBuZXcgTGlua2VkSGFzaFNldChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBMaW5rZWRIYXNoU2V0KDQpKTsKLQkJCX0KLQotCQkJcHVibGljIFNldCBnZXRBcnRpZmFjdHMoKSB7Ci0JCQkJcmV0dXJuIGFydGlmYWN0czsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoQVJUSUZBQ1RfRUxFTUVOVCkpIHsKLQkJCQkJbmV3IEFydGlmYWN0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBhcnRpZmFjdHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBBcnRpZmFjdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtBUlRJRkFDVF9DTEFTU0lGSUVSX0FUVFJJQlVURSwgSURfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0KLQkJCXByaXZhdGUgU2V0IGFydGlmYWN0czsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBjdXJyZW50QXJ0aWZhY3QgPSBudWxsOwotCi0JCQlwcml2YXRlIFByb3BlcnRpZXNIYW5kbGVyIHByb3BlcnRpZXNIYW5kbGVyID0gbnVsbDsKLQkJCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcmVwb3NpdG9yeVByb3BlcnRpZXNIYW5kbGVyID0gbnVsbDsKLQkJCXByaXZhdGUgUHJvY2Vzc2luZ1N0ZXBzSGFuZGxlciBwcm9jZXNzaW5nU3RlcHNIYW5kbGVyID0gbnVsbDsKLQotCQkJcHVibGljIEFydGlmYWN0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTZXQgYXJ0aWZhY3RzKSB7Ci0JCQkJc3VwZXIocGFyZW50SGFuZGxlciwgQVJUSUZBQ1RfRUxFTUVOVCk7Ci0JCQkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7Ci0JCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpOwotCQkJCVZlcnNpb24gdmVyc2lvbiA9IGNoZWNrVmVyc2lvbihBUlRJRkFDVF9FTEVNRU5ULCBWRVJTSU9OX0FUVFJJQlVURSwgdmFsdWVzWzJdKTsKLQkJCQkvLyBUT0RPOiByZXNvbHZlIGFjY2VzcyByZXN0cmljdGlvbiBvbiBBcnRpZmFjdEtleSBjb25zdHJ1Y3Rpb24KLQkJCQljdXJyZW50QXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKG5ldyBBcnRpZmFjdEtleSh2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmVyc2lvbikpOwotCQkJfQotCi0JCQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdG9yIGdldEFydGlmYWN0KCkgewotCQkJCXJldHVybiBjdXJyZW50QXJ0aWZhY3Q7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKFBST0NFU1NJTkdfU1RFUFNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJaWYgKHByb2Nlc3NpbmdTdGVwc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2luZ1N0ZXBzSGFuZGxlciA9IG5ldyBQcm9jZXNzaW5nU3RlcHNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoUFJPUEVSVElFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAocHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJcHJvcGVydGllc0hhbmRsZXIgPSBuZXcgUHJvcGVydGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChSRVBPU0lUT1JZX1BST1BFUlRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJaWYgKHJlcG9zaXRvcnlQcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlyZXBvc2l0b3J5UHJvcGVydGllc0hhbmRsZXIgPSBuZXcgUHJvcGVydGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCQlpZiAoaXNWYWxpZFhNTCgpICYmIGN1cnJlbnRBcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJCU1hcCBwcm9wZXJ0aWVzID0gKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwgPyBuZXcgT3JkZXJlZFByb3BlcnRpZXMoMCkgOiBwcm9wZXJ0aWVzSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJCQljdXJyZW50QXJ0aWZhY3QuYWRkUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotCQkJCQlwcm9wZXJ0aWVzID0gKHJlcG9zaXRvcnlQcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKDApIDogcmVwb3NpdG9yeVByb3BlcnRpZXNIYW5kbGVyLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJCWN1cnJlbnRBcnRpZmFjdC5hZGRSZXBvc2l0b3J5UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotCQkJCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBwcm9jZXNzaW5nU3RlcHMgPSAocHJvY2Vzc2luZ1N0ZXBzSGFuZGxlciA9PSBudWxsID8gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvclswXSAvLwotCQkJCQkJCTogcHJvY2Vzc2luZ1N0ZXBzSGFuZGxlci5nZXRQcm9jZXNzaW5nU3RlcHMoKSk7Ci0JCQkJCWN1cnJlbnRBcnRpZmFjdC5zZXRQcm9jZXNzaW5nU3RlcHMocHJvY2Vzc2luZ1N0ZXBzKTsKLQkJCQkJYXJ0aWZhY3RzLmFkZChjdXJyZW50QXJ0aWZhY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBQcm9jZXNzaW5nU3RlcHNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBMaXN0IHByb2Nlc3NpbmdTdGVwczsKLQotCQkJcHVibGljIFByb2Nlc3NpbmdTdGVwc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFBST0NFU1NJTkdfU1RFUFNfRUxFTUVOVCk7Ci0JCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJCXByb2Nlc3NpbmdTdGVwcyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBnZXRQcm9jZXNzaW5nU3RlcHMoKSB7Ci0JCQkJcmV0dXJuIChQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSkgcHJvY2Vzc2luZ1N0ZXBzLnRvQXJyYXkobmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltwcm9jZXNzaW5nU3RlcHMuc2l6ZSgpXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKFBST0NFU1NJTkdfU1RFUF9FTEVNRU5UKSkgewotCQkJCQluZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHByb2Nlc3NpbmdTdGVwcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIGNsYXNzIFByb2Nlc3NpbmdTdGVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge0lEX0FUVFJJQlVURSwgU1RFUF9SRVFVSVJFRF9BVFRSSUJVVEV9OwotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBvcHRpb25hbCA9IG5ldyBTdHJpbmdbXSB7U1RFUF9EQVRBX0FUVFJJQlVURX07Ci0KLQkJCXB1YmxpYyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBwcm9jZXNzaW5nU3RlcHMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCk7Ci0JCQkJU3RyaW5nW10gYXR0cmlidXRlVmFsdWVzID0gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBvcHRpb25hbCk7Ci0JCQkJcHJvY2Vzc2luZ1N0ZXBzLmFkZChuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKGF0dHJpYnV0ZVZhbHVlc1swXSwgYXR0cmlidXRlVmFsdWVzWzFdLCBjaGVja0Jvb2xlYW4oUFJPQ0VTU0lOR19TVEVQX0VMRU1FTlQsIFNURVBfUkVRVUlSRURfQVRUUklCVVRFLCBhdHRyaWJ1dGVWYWx1ZXNbMl0pLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5pb19wYXJzZUVycm9yOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCS8vIFRPRE86Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Vbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Vbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjg5M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBVbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0JLyoqCi0JICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qIElOU1RBTkNFIEZJRUxEUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0JcHJpdmF0ZSBieXRlW10gZkJpdHMgPSBuZXcgYnl0ZVtCWVRFU19TSVpFXTsKLQotCS8qIE5PTi1GSU5BTCBQUklWQVRFIFNUQVRJQyBGSUVMRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0JcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBmZ1ByZXZpb3VzQ2xvY2tWYWx1ZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgZmdDbG9ja0FkanVzdG1lbnQgPSAwOwotCXByaXZhdGUgc3RhdGljIGludCBmZ0Nsb2NrU2VxdWVuY2UgPSAtMTsKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gbm9kZUFkZHJlc3M7Ci0KLQlzdGF0aWMgewotCQlub2RlQWRkcmVzcyA9IGNvbXB1dGVOb2RlQWRkcmVzcygpOwotCX0KLQotCS8qIFBSSVZBVEUgU1RBVElDIEZJTkFMIEZJRUxEUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0JcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIGZnUmFuZG9tTnVtYmVyR2VuZXJhdG9yID0gbmV3IFJhbmRvbSgpOwotCi0JLyogUFVCTElDIFNUQVRJQyBGSU5BTCBGSUVMRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19TSVpFID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gVU5ERUZJTkVEX1VVSURfQllURVMgPSBuZXcgYnl0ZVsxNl07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NMT0NLX1NFUVVFTkNFID0gMHg0MDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DTE9DS19BREpVU1RNRU5UID0gMHg3RkZGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfRklFTERfU1RBUlQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfRklFTERfU1RPUCA9IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9ISUdIX0FORF9WRVJTSU9OID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTE9DS19TRVFVRU5DRV9ISUdIX0FORF9SRVNFUlZFRCA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPQ0tfU0VRVUVOQ0VfTE9XID0gOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX0FERFJFU1NfU1RBUlQgPSAxMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX0FERFJFU1NfQllURV9TSVpFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEVfTUFTSyA9IDB4RkY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISUdIX05JQkJMRV9NQVNLID0gMHhGMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV19OSUJCTEVfTUFTSyA9IDB4MEY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSElGVF9OSUJCTEUgPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hpZnRCeXRlID0gODsKLQotCS8qKgotCSBVbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyIGRlZmF1bHQgY29uc3RydWN0b3IgcmV0dXJucyBhCi0JIG5ldyBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIGEgdW5pcXVlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBVbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyKCkgewotCQl0aGlzLnNldFZlcnNpb24oMSk7Ci0JCXRoaXMuc2V0VmFyaWFudCgxKTsKLQkJdGhpcy5zZXRUaW1lVmFsdWVzKCk7Ci0JCXRoaXMuc2V0Tm9kZShnZXROb2RlQWRkcmVzcygpKTsKLQl9Ci0KLQkvKioKLQkgQ29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIHRoZSBieXRlcyB0byB1c2UgZm9yIHRoZSBpbnN0YW5jZS4mbmJzcDsmbmJzcDsgVGhlIGZvcm1hdAotCSBvZiB0aGUgYnl0ZSBhcnJheSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIDxjb2RlPnRvQnl0ZXMoKTwvY29kZT4gbWV0aG9kLgotCi0JIDxwPlRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHRoZSB1bmRlZmluZWQgdXVpZCBpZiB0aGUgYnl0ZSBhcnJheSBpcyBpbnZhbGlkLgotCi0JIEBzZWUgI3RvQnl0ZXMoKQotCSBAc2VlICNCWVRFU19TSVpFCi0JICovCi0JcHVibGljIFVuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIoYnl0ZVtdIGJ5dGVWYWx1ZSkgewotCQlmQml0cyA9IG5ldyBieXRlW0JZVEVTX1NJWkVdOwotCQlpZiAoYnl0ZVZhbHVlLmxlbmd0aCA+PSBCWVRFU19TSVpFKQotCQkJU3lzdGVtLmFycmF5Y29weShieXRlVmFsdWUsIDAsIGZCaXRzLCAwLCBCWVRFU19TSVpFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kQnl0ZVN0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBieXRlIHZhbHVlKSB7Ci0JCVN0cmluZyBoZXhTdHJpbmc7Ci0KLQkJaWYgKHZhbHVlIDwgMCkKLQkJCWhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoMjU2ICsgdmFsdWUpOwotCQllbHNlCi0JCQloZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZhbHVlKTsKLQkJaWYgKGhleFN0cmluZy5sZW5ndGgoKSA9PSAxKQotCQkJYnVmZmVyLmFwcGVuZCgiMCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoaGV4U3RyaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGNsb2NrVmFsdWVOb3coKSB7Ci0JCUdyZWdvcmlhbkNhbGVuZGFyIG5vdyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotCQlCaWdJbnRlZ2VyIG5vd01pbGxpcyA9IEJpZ0ludGVnZXIudmFsdWVPZihub3cuZ2V0VGltZSgpLmdldFRpbWUoKSk7Ci0JCUJpZ0ludGVnZXIgYmFzZU1pbGxpcyA9IEJpZ0ludGVnZXIudmFsdWVPZihub3cuZ2V0R3JlZ29yaWFuQ2hhbmdlKCkuZ2V0VGltZSgpKTsKLQotCQlyZXR1cm4gKG5vd01pbGxpcy5zdWJ0cmFjdChiYXNlTWlsbGlzKS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwMDBMKSkpOwotCX0KLQotCS8qKgotCSBTaW1wbHkgaW5jcmVhc2VzIHRoZSB2aXNpYmlsaXR5IG9mIDxjb2RlPk9iamVjdDwvY29kZT4ncyBjbG9uZS4KLQkgT3RoZXJ3aXNlLCBubyBuZXcgYmVoYXZpb3VyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkNsb25lIG5vdCBzdXBwb3J0ZWQiKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRpbWUoYnl0ZVtdIGZCaXRzMSwgYnl0ZVtdIGZCaXRzMikgewotCQlmb3IgKGludCBpID0gVElNRV9GSUVMRF9TVE9QOyBpID49IDA7IGktLSkKLQkJCWlmIChmQml0czFbaV0gIT0gZkJpdHMyW2ldKQotCQkJCXJldHVybiAoMHhGRiAmIGZCaXRzMVtpXSkgLSAoMHhGRiAmIGZCaXRzMltpXSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIG5vZGUgYWRkcmVzcyBhdHRlbXB0aW5nIHRvIG1hc2sgdGhlIElQCi0JICogYWRkcmVzcyBvZiB0aGlzIG1hY2hpbmUuCi0JICogCi0JICogQHJldHVybiBieXRlW10gdGhlIG5vZGUgYWRkcmVzcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb21wdXRlTm9kZUFkZHJlc3MoKSB7Ci0KLQkJYnl0ZVtdIGFkZHJlc3MgPSBuZXcgYnl0ZVtOT0RFX0FERFJFU1NfQllURV9TSVpFXTsKLQotCQkvLyBTZWVkIHRoZSBzZWN1cmUgcmFuZG9taXplciB3aXRoIHNvbWUgb2Z0LXZhcnlpbmcgaW5wdXRzCi0JCWludCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCk7Ci0JCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpbnQgb2JqZWN0SWQgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShuZXcgU3RyaW5nKCkpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShieXRlT3V0KTsKLQkJYnl0ZVtdIGlwQWRkcmVzcyA9IGdldElQQWRkcmVzcygpOwotCi0JCXRyeSB7Ci0JCQlpZiAoaXBBZGRyZXNzICE9IG51bGwpCi0JCQkJb3V0LndyaXRlKGlwQWRkcmVzcyk7Ci0JCQlvdXQud3JpdGUodGhyZWFkKTsKLQkJCW91dC53cml0ZUxvbmcodGltZSk7Ci0JCQlvdXQud3JpdGUob2JqZWN0SWQpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgewotCQkJLy9pZ25vcmUgdGhlIGZhaWx1cmUsIHdlJ3JlIGp1c3QgdHJ5aW5nIHRvIGNvbWUgdXAgd2l0aCBhIHJhbmRvbSBzZWVkCi0JCX0KLQkJYnl0ZVtdIHJhbmQgPSBieXRlT3V0LnRvQnl0ZUFycmF5KCk7Ci0KLQkJU2VjdXJlUmFuZG9tIHJhbmRvbWl6ZXIgPSBuZXcgU2VjdXJlUmFuZG9tKHJhbmQpOwotCQlyYW5kb21pemVyLm5leHRCeXRlcyhhZGRyZXNzKTsKLQotCQkvLyBzZXQgdGhlIE1TQiBvZiB0aGUgZmlyc3Qgb2N0ZXQgdG8gMSB0byBkaXN0aW5ndWlzaCBmcm9tIElFRUUgbm9kZSBhZGRyZXNzZXMKLQkJYWRkcmVzc1swXSA9IChieXRlKSAoYWRkcmVzc1swXSB8IChieXRlKSAweDgwKTsKLQotCQlyZXR1cm4gYWRkcmVzczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYnl0ZVtdIG90aGVyID0gKChVbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyKSBvYmopLmZCaXRzOwotCQlpZiAoZkJpdHMgPT0gb3RoZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZCaXRzLmxlbmd0aCAhPSBvdGhlci5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkJpdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmQml0c1tpXSAhPSBvdGhlcltpXSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JIEFuc3dlcnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIG1hY2hpbmUgdXNpbmcgdGhlCi0JIEphdmEgQVBJIGNsYXNzIDxjb2RlPkluZXRBZGRyZXNzPC9jb2RlPi4KLQotCSBAcmV0dXJuIGJ5dGVbXSB0aGUgbmV0d29yayBhZGRyZXNzIGluIG5ldHdvcmsgb3JkZXIKLQkgQHNlZSAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRMb2NhbEhvc3QoKQotCSBAc2VlICAgIGphdmEubmV0LkluZXRBZGRyZXNzI2dldEFkZHJlc3MoKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGdldElQQWRkcmVzcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRBZGRyZXNzKCk7Ci0JCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCS8vdmFsaWQgZm9yIHRoaXMgdG8gYmUgdGhyb3duIGJlIGEgbWFjaGluZSB3aXRoIG5vIElQIGNvbm5lY3Rpb24KLQkJCS8vSXQgaXMgVkVSWSBpbXBvcnRhbnQgTk9UIHRvIHRocm93IHRoaXMgZXhjZXB0aW9uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXROb2RlQWRkcmVzcygpIHsKLQkJcmV0dXJuIG5vZGVBZGRyZXNzOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmQml0c1swXSArIGZCaXRzWzNdICsgZkJpdHNbN10gKyBmQml0c1sxMV0gKyBmQml0c1sxNV07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRDbG9ja1NlcXVlbmNlKCkgewotCi0JCWlmIChmZ0Nsb2NrU2VxdWVuY2UgPT0gLTEpCi0JCQlmZ0Nsb2NrU2VxdWVuY2UgPSAoaW50KSAoZmdSYW5kb21OdW1iZXJHZW5lcmF0b3IubmV4dERvdWJsZSgpICogTUFYX0NMT0NLX1NFUVVFTkNFKTsKLQotCQlmZ0Nsb2NrU2VxdWVuY2UgPSAoZmdDbG9ja1NlcXVlbmNlICsgMSkgJSBNQVhfQ0xPQ0tfU0VRVUVOQ0U7Ci0KLQkJcmV0dXJuIGZnQ2xvY2tTZXF1ZW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIG5leHRUaW1lc3RhbXAoKSB7Ci0KLQkJQmlnSW50ZWdlciB0aW1lc3RhbXAgPSBjbG9ja1ZhbHVlTm93KCk7Ci0JCWludCB0aW1lc3RhbXBDb21wYXJpc29uOwotCi0JCXRpbWVzdGFtcENvbXBhcmlzb24gPSB0aW1lc3RhbXAuY29tcGFyZVRvKGZnUHJldmlvdXNDbG9ja1ZhbHVlKTsKLQotCQlpZiAodGltZXN0YW1wQ29tcGFyaXNvbiA9PSAwKSB7Ci0JCQlpZiAoZmdDbG9ja0FkanVzdG1lbnQgPT0gTUFYX0NMT0NLX0FESlVTVE1FTlQpIHsKLQkJCQl3aGlsZSAodGltZXN0YW1wLmNvbXBhcmVUbyhmZ1ByZXZpb3VzQ2xvY2tWYWx1ZSkgPT0gMCkKLQkJCQkJdGltZXN0YW1wID0gY2xvY2tWYWx1ZU5vdygpOwotCQkJCXRpbWVzdGFtcCA9IG5leHRUaW1lc3RhbXAoKTsKLQkJCX0gZWxzZQotCQkJCWZnQ2xvY2tBZGp1c3RtZW50Kys7Ci0JCX0gZWxzZSB7Ci0JCQlmZ0Nsb2NrQWRqdXN0bWVudCA9IDA7Ci0KLQkJCWlmICh0aW1lc3RhbXBDb21wYXJpc29uIDwgMCkKLQkJCQluZXh0Q2xvY2tTZXF1ZW5jZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2xvY2tTZXF1ZW5jZShpbnQgY2xvY2tTZXEpIHsKLQkJaW50IGNsb2NrU2VxSGlnaCA9IChjbG9ja1NlcSA+Pj4gU2hpZnRCeXRlKSAmIExPV19OSUJCTEVfTUFTSzsKLQkJaW50IHJlc2VydmVkID0gZkJpdHNbQ0xPQ0tfU0VRVUVOQ0VfSElHSF9BTkRfUkVTRVJWRURdICYgSElHSF9OSUJCTEVfTUFTSzsKLQotCQlmQml0c1tDTE9DS19TRVFVRU5DRV9ISUdIX0FORF9SRVNFUlZFRF0gPSAoYnl0ZSkgKHJlc2VydmVkIHwgY2xvY2tTZXFIaWdoKTsKLQkJZkJpdHNbQ0xPQ0tfU0VRVUVOQ0VfTE9XXSA9IChieXRlKSAoY2xvY2tTZXEgJiBCWVRFX01BU0spOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5vZGUoYnl0ZVtdIGJ5dGVzKSB7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IE5PREVfQUREUkVTU19CWVRFX1NJWkU7IGluZGV4KyspCi0JCQlmQml0c1tpbmRleCArIE5PREVfQUREUkVTU19TVEFSVF0gPSBieXRlc1tpbmRleF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRpbWVzdGFtcChCaWdJbnRlZ2VyIHRpbWVzdGFtcCkgewotCQlCaWdJbnRlZ2VyIHZhbHVlID0gdGltZXN0YW1wOwotCQlCaWdJbnRlZ2VyIGJpZ0J5dGUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMjU2TCk7Ci0JCUJpZ0ludGVnZXJbXSByZXN1bHRzOwotCQlpbnQgdmVyc2lvbjsKLQkJaW50IHRpbWVIaWdoOwotCi0JCWZvciAoaW50IGluZGV4ID0gVElNRV9GSUVMRF9TVEFSVDsgaW5kZXggPCBUSU1FX0ZJRUxEX1NUT1A7IGluZGV4KyspIHsKLQkJCXJlc3VsdHMgPSB2YWx1ZS5kaXZpZGVBbmRSZW1haW5kZXIoYmlnQnl0ZSk7Ci0JCQl2YWx1ZSA9IHJlc3VsdHNbMF07Ci0JCQlmQml0c1tpbmRleF0gPSAoYnl0ZSkgcmVzdWx0c1sxXS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXZlcnNpb24gPSBmQml0c1tUSU1FX0hJR0hfQU5EX1ZFUlNJT05dICYgSElHSF9OSUJCTEVfTUFTSzsKLQkJdGltZUhpZ2ggPSB2YWx1ZS5pbnRWYWx1ZSgpICYgTE9XX05JQkJMRV9NQVNLOwotCQlmQml0c1tUSU1FX0hJR0hfQU5EX1ZFUlNJT05dID0gKGJ5dGUpICh0aW1lSGlnaCB8IHZlcnNpb24pOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lVmFsdWVzKCkgewotCQl0aGlzLnNldFRpbWVzdGFtcCh0aW1lc3RhbXAoKSk7Ci0JCXRoaXMuc2V0Q2xvY2tTZXF1ZW5jZShmZ0Nsb2NrU2VxdWVuY2UpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2V0VmFyaWFudChpbnQgdmFyaWFudElkZW50aWZpZXIpIHsKLQkJaW50IGNsb2NrU2VxSGlnaCA9IGZCaXRzW0NMT0NLX1NFUVVFTkNFX0hJR0hfQU5EX1JFU0VSVkVEXSAmIExPV19OSUJCTEVfTUFTSzsKLQkJaW50IHZhcmlhbnQgPSB2YXJpYW50SWRlbnRpZmllciAmIExPV19OSUJCTEVfTUFTSzsKLQotCQlmQml0c1tDTE9DS19TRVFVRU5DRV9ISUdIX0FORF9SRVNFUlZFRF0gPSAoYnl0ZSkgKCh2YXJpYW50IDw8IFNISUZUX05JQkJMRSkgfCBjbG9ja1NlcUhpZ2gpOwotCQlyZXR1cm4gKHZhcmlhbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb25JZGVudGlmaWVyKSB7Ci0JCWludCB0aW1lSGlnaCA9IGZCaXRzW1RJTUVfSElHSF9BTkRfVkVSU0lPTl0gJiBMT1dfTklCQkxFX01BU0s7Ci0JCWludCB2ZXJzaW9uID0gdmVyc2lvbklkZW50aWZpZXIgJiBMT1dfTklCQkxFX01BU0s7Ci0KLQkJZkJpdHNbVElNRV9ISUdIX0FORF9WRVJTSU9OXSA9IChieXRlKSAodGltZUhpZ2ggfCAodmVyc2lvbiA8PCBTSElGVF9OSUJCTEUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIHRpbWVzdGFtcCgpIHsKLQkJQmlnSW50ZWdlciB0aW1lc3RhbXA7Ci0KLQkJaWYgKGZnUHJldmlvdXNDbG9ja1ZhbHVlID09IG51bGwpIHsKLQkJCWZnQ2xvY2tBZGp1c3RtZW50ID0gMDsKLQkJCW5leHRDbG9ja1NlcXVlbmNlKCk7Ci0JCQl0aW1lc3RhbXAgPSBjbG9ja1ZhbHVlTm93KCk7Ci0JCX0gZWxzZQotCQkJdGltZXN0YW1wID0gbmV4dFRpbWVzdGFtcCgpOwotCi0JCWZnUHJldmlvdXNDbG9ja1ZhbHVlID0gdGltZXN0YW1wOwotCQlyZXR1cm4gZmdDbG9ja0FkanVzdG1lbnQgPT0gMCA/IHRpbWVzdGFtcCA6IHRpbWVzdGFtcC5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGZnQ2xvY2tBZGp1c3RtZW50KSk7Ci0JfQotCi0JLyoqIAotCSBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgKGJ5dGVbXSkgY29uc3RydWN0b3IuCi0KLQkgQHNlZSAjVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcihieXRlW10pCi0JICovCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVzKCkgewotCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZkJpdHMubGVuZ3RoXTsKLQotCQlTeXN0ZW0uYXJyYXljb3B5KGZCaXRzLCAwLCByZXN1bHQsIDAsIGZCaXRzLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQml0cy5sZW5ndGg7IGkrKykKLQkJCWFwcGVuZEJ5dGVTdHJpbmcoYnVmZmVyLCBmQml0c1tpXSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nQXNCeXRlcygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJ7IjsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkJpdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdCArPSBmQml0c1tpXTsKLQkJCWlmIChpIDwgZkJpdHMubGVuZ3RoICsgMSkKLQkJCQlyZXN1bHQgKz0gIiwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdCArICJ9IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3REZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM3N2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gYXJ0aWZhY3Qgc3RvcmVkIG9uIGEgcGFydGljdWxhciBieXRlIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRvciBpbXBsZW1lbnRzIElBcnRpZmFjdERlc2NyaXB0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gRU1QVFlfU1RFUFMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yWzBdOwotCi0JcHJvdGVjdGVkIElBcnRpZmFjdEtleSBrZXk7IC8vIFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXJ0aWZhY3QKLQotCS8vIFRoZSBsaXN0IG9mIHBvc3QgcHJvY2Vzc2luZyBzdGVwcyB0aGF0IG11c3QgYmUgYXBwbGllZCBvbmUgdGhlIGFydGlmYWN0IG9uY2UgaXQgCi0JLy8gaGFzIGJlZW4gZG93bmxvYWRlZCAoZS5nLCB1bnBhY2ssIHRoZW4gbWQ1IGNoZWNrc3VtLCB0aGVuLi4uKQotCXByb3RlY3RlZCBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBwcm9jZXNzaW5nU3RlcHMgPSBFTVBUWV9TVEVQUzsKLQotCXByb3RlY3RlZCBNYXAgcHJvcGVydGllcyA9IG5ldyBPcmRlcmVkUHJvcGVydGllcygpOwotCXByb3RlY3RlZCBNYXAgcmVwb3NpdG9yeVByb3BlcnRpZXMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKTsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCi0JLy8gUVVFU1RJT046IERvIHdlIG5lZWQgYW55IGRlc2NyaXB0aW9uIG9yIHVzZXIgcmVhZGFibGUgbmFtZQotCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJa2V5ID0gYmFzZS5nZXRBcnRpZmFjdEtleSgpOwotCQlwcm9jZXNzaW5nU3RlcHMgPSBiYXNlLmdldFByb2Nlc3NpbmdTdGVwcygpOwotCQlwcm9wZXJ0aWVzLnB1dEFsbChiYXNlLmdldFByb3BlcnRpZXMoKSk7Ci0JCXJlcG9zaXRvcnkgPSBiYXNlLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVE9ETyB0aGlzIHByb3BlcnR5IGlzIGhhcmRjb2RlZCBmb3IgdGhlIGJsb2Igc3RvcmUuCi0JCS8vCQlzZXRQcm9wZXJ0eSgiYXJ0aWZhY3QudXVpZCIsIGJhc2UuZ2V0UHJvcGVydHkoImFydGlmYWN0LnV1aWQiKSk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRvcihBcnRpZmFjdERlc2NyaXB0b3IgYmFzZSkgewotCQlzdXBlcigpOwotCQlrZXkgPSBiYXNlLmtleTsKLQkJcHJvY2Vzc2luZ1N0ZXBzID0gYmFzZS5wcm9jZXNzaW5nU3RlcHM7Ci0JCXByb3BlcnRpZXMgPSBiYXNlLnByb3BlcnRpZXM7Ci0JCXJlcG9zaXRvcnkgPSBiYXNlLnJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMua2V5ID0ga2V5OwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXkgZ2V0QXJ0aWZhY3RLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlLZXkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5S2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotCQllbHNlCi0JCQlwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0aWVzKE1hcCBhZGRpdGlvbmFsUHJvcGVydGllcykgewotCQlwcm9wZXJ0aWVzLnB1dEFsbChhZGRpdGlvbmFsUHJvcGVydGllcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlYWQtb25seSBjb2xsZWN0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIE9yZGVyZWRQcm9wZXJ0aWVzLnVubW9kaWZpYWJsZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5S2V5KSB7Ci0JCXJldHVybiAoU3RyaW5nKSByZXBvc2l0b3J5UHJvcGVydGllcy5nZXQocHJvcGVydHlLZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXBvc2l0b3J5UHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLQkJZWxzZQotCQkJcmVwb3NpdG9yeVByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlcG9zaXRvcnlQcm9wZXJ0aWVzKE1hcCBhZGRpdGlvbmFsUHJvcGVydGllcykgewotCQlyZXBvc2l0b3J5UHJvcGVydGllcy5wdXRBbGwoYWRkaXRpb25hbFByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSBwcm9wZXJ0aWVzIG9mIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgcHJvcGVydGllcyBvZiB0aGlzIGFydGlmYWN0IGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIE1hcCBnZXRSZXBvc2l0b3J5UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIE9yZGVyZWRQcm9wZXJ0aWVzLnVubW9kaWZpYWJsZVByb3BlcnRpZXMocmVwb3NpdG9yeVByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBnZXRQcm9jZXNzaW5nU3RlcHMoKSB7Ci0JCXJldHVybiBwcm9jZXNzaW5nU3RlcHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc2luZ1N0ZXBzKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHZhbHVlKSB7Ci0JCXByb2Nlc3NpbmdTdGVwcyA9IHZhbHVlID09IG51bGwgPyBFTVBUWV9TVEVQUyA6IHZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlBcnRpZmFjdERlc2NyaXB0b3Igb3RoZXIgPSAoQXJ0aWZhY3REZXNjcmlwdG9yKSBvYmo7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmtleSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICgha2V5LmVxdWFscyhvdGhlci5rZXkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIUFycmF5cy5lcXVhbHMocHJvY2Vzc2luZ1N0ZXBzLCBvdGhlci5wcm9jZXNzaW5nU3RlcHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIucHJvcGVydGllcyAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghcHJvcGVydGllcy5lcXVhbHMob3RoZXIucHJvcGVydGllcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgaW50IGhhc2hDb2RlKE9iamVjdFtdIGFycmF5KSB7Ci0JCWludCBwcmltZSA9IDMxOwotCQlpZiAoYXJyYXkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykgewotCQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoYXJyYXlbaW5kZXhdID09IG51bGwgPyAwIDogYXJyYXlbaW5kZXhdLmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBoYXNoQ29kZShwcm9jZXNzaW5nU3RlcHMpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocHJvcGVydGllcyA9PSBudWxsKSA/IDAgOiBwcm9wZXJ0aWVzLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSB2YWx1ZSkgewotCQlyZXBvc2l0b3J5ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGZvcm1hdCA9IGdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRk9STUFUKTsKLQkJaWYgKGZvcm1hdCA9PSBudWxsKQotCQkJcmV0dXJuICJjYW5vbmljYWw6ICIgKyBrZXkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZm9ybWF0ICsgIjogIiArIGtleS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGViYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdERlc2NyaXB0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfU0laRSA9ICJkb3dubG9hZC5zaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1NJWkUgPSAiYXJ0aWZhY3Quc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9NRDUgPSAiZG93bmxvYWQubWQ1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX01ENSA9ICJhcnRpZmFjdC5tZDUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUga2V5IGZvciB0aGUgYXJ0aWZhY3QgZGVzY3JpYmVkIGJ5IHRoaXMgZGVzY3JpcHRvci4KLQkgKiBAcmV0dXJuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQXJ0aWZhY3RLZXkgZ2V0QXJ0aWZhY3RLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoaXMgZGVzY3JpcHRvciAgPGNvZGU+bnVsbDwvY29kZT4gCi0JICogaXMgcmV0dXJuZWQgaWYgbm8gc3VjaCBwcm9wZXJ0eSBleGlzdHMKLQkgKiBAcGFyYW0ga2V5IHRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3IKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlYWQtb25seSBjb2xsZWN0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpOwotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBwcm9jZXNzaW5nIHN0ZXBzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlc2NyaXB0b3IuCi0JICogQW4gZW1wdHkgc2V0IG9mIHN0ZXBzIGltcGxpZXMgdGhhdCB0aGlzIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGEgY29tcGxldGUKLQkgKiBjb3B5IG9mIHRoZSBhcnRpZmFjdCBpbiBpdHMgbmF0aXZlIGZvcm0uCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBwcm9jZXNzaW5nIHN0ZXBzIGZvciB0aGlzIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZ2V0UHJvY2Vzc2luZ1N0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFydGlmYWN0IHJlcG9zaXRvcnkgdGhhdCBob2xkcyB0aGUgYXJ0aWZhY3QgZGVzY3JpYmVkIGJ5IHRoaXMgZGVzY3JpcHRvci4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBpZiB0aGlzIGRlc2NyaXB0b3IgaXMgbm90IGhlbGQgaW4gYSByZXBvc2l0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgaG9sZGluZyB0aGlzIGFydGlmYWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjZWM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgcmVwb3NpdG9yeSBjb250YWluaW5nIGFydGlmYWN0cy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuICBBcnRpZmFjdCByZXBvc2l0b3J5Ci0gKiBpbXBsZW1lbnRhdGlvbnMgbXVzdCBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnl9IHJhdGhlciB0aGFuIAotICogaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBJUmVwb3NpdG9yeSB7Ci0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBkZXNjcmlwdG9yIHRvIHRoZSBzZXQgb2YgZGVzY3JpcHRvcnMgaW4gdGhpcyByZXBvc2l0b3J5LiAgVGhpcyBpcyAKLQkgKiBhIHJlbGF0aXZlbHkgbG93LWxldmVsIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgYWN0dWFsIHJlbGF0ZWQgCi0JICogY29udGVudCBpcyBpbiB0aGlzIHJlcG9zaXRvcnkgYW5kIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFjY3VyYXRlbHkgZGVzY3JpYmVzIAotCSAqIHRoYXQgY29udGVudC4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvciB0byBhZGQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBhcnRpZmFjdCBkZXNjcmlwdG9ycyB0byB0aGlzIHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3JzIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3JzKElBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyk7Ci0KLQkvKiogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVwb3NpdG9yeSBjb250YWlucyB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvciB0byBxdWVyeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBpcyBhbHJlYWR5IGluIHRoaXMgcmVwb3NpdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0KLQkvKiogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVwb3NpdG9yeSBjb250YWlucyB0aGUgZ2l2ZW4gYXJ0aWZhY3Qga2V5LgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBxdWVyeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGFscmVhZHkgaW4gdGhpcyByZXBvc2l0b3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSUFydGlmYWN0S2V5IGtleSk7Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBnaXZlbiBzdHJlYW0gd2l0aCB0aGUgZGVzY3JpYmVkIGFydGlmYWN0LiBTZXRzIHN0YXR1cyBhY2NvcmRpbmdseS4gCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0QXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBhcnRpZmFjdCBkZXNjcmlwdG9ycyBkZXNjcmliaW5nIHRoZSB3YXlzIHRoYXQgdGhpcyByZXBvc2l0b3J5Ci0JICogY2FuIHN1cHBseSB0aGUgYXJ0aWZhY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhcnRpZmFjdCBrZXkKLQkgKiBAcGFyYW0ga2V5IHRoZSBhcnRpZmFjdCBrZXkgdG8gbG9va3VwCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkKLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0RGVzY3JpcHRvcltdIGdldEFydGlmYWN0RGVzY3JpcHRvcnMoSUFydGlmYWN0S2V5IGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFydGlmYWN0IGtleXMgbWFuYWdlZCBieSB0aGlzIHJlcG9zaXRvcnkKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYXJ0aWZhY3Qga2V5cwotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBhcnRpZmFjdCByZXF1ZXN0cyBvbiB0aGlzIGJ5dGUgc2VydmVyLgotCSAqIEBwYXJhbSByZXF1ZXN0cyBUaGUgYXJ0aWZhY3QgcmVxdWVzdHMKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHRoYXQgaXMgPGNvZGU+T0s8L2NvZGU+IGlmIHJlcXVlc3RzIHdlcmUKLQkgKiBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UsIGEgc3RhdHVzIGluZGljYXRpbmcgaW5mb3JtYXRpb24sCi0JICogd2FybmluZ3MsIG9yIGVycm9ycyB0aGF0IG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgYXJ0aWZhY3QgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogT3BlbiBhbiBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIGEgY2xpZW50IGNhbiB3cml0ZSB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIAotCSAqIGFydGlmYWN0IGRlc2NyaXB0b3IuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgZGVzY3JpYmluZyB0aGUgYXJ0aWZhY3QgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSAKLQkgKiByZXN1bHRhbnQgc3RyZWFtCi0JICogQHJldHVybiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBhcnRpZmFjdCBjb250ZW50IGNhbiBiZSB3cml0dGVuLiBUaGUgcmV0dXJuZWQgb3V0cHV0Ci0JICogIHN0cmVhbSBtYXkgaW1wbGVtZW50IDxjb2RlPklTdGF0ZWZ1bDwvY29kZT4uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIG91dHB1dCBzdHJlYW0gY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5BbiBJL08gZXhjZXB0aW9uIG9jY3VycmVkIChAbGluayB7QGxpbmsgUHJvdmlzaW9uRXhjZXB0aW9uI1JFUE9TSVRPUllfRkFJTEVEX1dSSVRFfSkgLjwvbGk+Ci0JICogPGxpPkFuIGFydGlmYWN0IGFscmVhZHkgZXhpc3RzIGF0IHRoYXQgbG9jYXRpb24gKHtAbGluayBQcm92aXNpb25FeGNlcHRpb24jQVJUSUZBQ1RfRVhJU1RTfSkuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYWxsIGtleXMsIGRlc2NyaXB0b3JzLCBhbmQgY29udGVudHMgZnJvbSB0aGlzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGdpdmVuIGRlc2NyaXB0b3IgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhpcyByZXBvc2l0b3J5LiAgCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gcmVtb3ZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4ga2V5IGFuZCBhbGwgcmVsYXRlZCBjb250ZW50IGFuZCBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgcmVwb3NpdG9yeS4gIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI3ODEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBUaGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGlzIHVzZWQgdG8gY3JlYXRlLCBhY2Nlc3MsIGFuZCBtYW5pcHVsYXRlCi0gKiB7QGxpbmsgSUFydGlmYWN0UmVwb3NpdG9yeX0gaW5zdGFuY2VzLiBUaGUgbWFuYWdlciBrZWVwcyB0cmFjayBvZiBhIAotICogc2V0IG9mIGtub3duIHJlcG9zaXRvcmllcywgYW5kIHByb3ZpZGVzIGNhY2hpbmcgb2YgdGhlc2Uga25vd24gcmVwb3NpdG9yaWVzCi0gKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBsb2FkaW5nIG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBkaXNrIG9yIG5ldHdvcmsuICBUaGUKLSAqIG1hbmFnZXIgZmlyZXMge0BsaW5rIFJlcG9zaXRvcnlFdmVudH1zIHdoZW4gdGhlIHNldCBvZiBrbm93biByZXBvc2l0b3JpZXMKLSAqIGNoYW5nZXMuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJQXJ0aWZhY3RSZXF1ZXN0W10gTk9fQVJUSUZBQ1RfUkVRVUVTVCA9IG5ldyBJQXJ0aWZhY3RSZXF1ZXN0WzBdOwotCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFsbCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfQUxMID0gMDsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBzeXN0ZW0gcmVwb3NpdG9yaWVzIGFyZSBvZiBpbnRlcmVzdC4KLQkgKiBAc2VlIElSZXBvc2l0b3J5I1BST1BfU1lTVEVNCi0JICogQHNlZSAjZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUklFU19TWVNURU0gPSAxIDw8IDA7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm9uLXN5c3RlbSByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0Ci0JICogQHNlZSBJUmVwb3NpdG9yeSNQUk9QX1NZU1RFTQotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSA9IDEgPDwgMTsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfTE9DQUwgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBSZXBvc2l0b3J5IHR5cGUgZm9yIGEgc2ltcGxlIHJlcG9zaXRvcnkgYmFzZWQgb24gYSBVUkwgb3IgbG9jYWwgZmlsZSBzeXN0ZW0gbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSByZXBvc2l0b3J5IHRvIHRoZSBsaXN0IG9mIGFydGlmYWN0IHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5IHRoZSByZXBvc2l0b3J5Ci0JICogbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyByZXF1ZXN0IHRvIGRvd25sb2FkIHRoZSBnaXZlbiBhcnRpZmFjdCBhbmQgc3RvcmUgaXQgYXQgdGhlIGdpdmVuIGRlc3RpbmF0aW9uLgotCSAqIEBwYXJhbSBrZXkgdGhlIGFydGlmYWN0IHRvIGRvd25sb2FkCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGUgYXJ0aWZhY3Qgd2lsbCBiZSBzdG9yZWQKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJlcXVlc3Qgb2JqZWN0Ci0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcXVlc3QgY3JlYXRlRG93bmxvYWRSZXF1ZXN0KElBcnRpZmFjdEtleSBrZXksIElQYXRoIGRlc3RpbmF0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyByZXF1ZXN0IHRvIG1pcnJvciB0aGUgZ2l2ZW4gYXJ0aWZhY3QgaW50byB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeS4KLQkgKiBAcGFyYW0ga2V5IHRoZSBhcnRpZmFjdCB0byBtaXJyb3IKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSBhcnRpZmFjdCB3aWxsIGJlIG1pcnJvcmVkCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByZXF1ZXN0IG9iamVjdAotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZU1pcnJvclJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgcmVxdWVzdCB0byBtaXJyb3IgdGhlIGdpdmVuIGFydGlmYWN0IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkuCi0JICogQHBhcmFtIGtleSB0aGUgYXJ0aWZhY3QgdG8gbWlycm9yCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGUgYXJ0aWZhY3Qgd2lsbCBiZSBtaXJyb3JlZAotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbkRlc2NyaXB0b3JQcm9wZXJ0aWVzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdXNlIGluIGNyZWF0aW5nIHRoZSByZXBvc2l0b3IncyBBcnRpZmFjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25SZXBvc2l0b3J5UHJvcGVydGllcyBhZGRpdGlvbmFsIHJlcG9zaXRvcnkgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgdXNlIGluIGNyZWF0aW5nIHRoZSByZXBvc2l0b3IncyBBcnRpZmFjdERlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJlcXVlc3Qgb2JqZWN0Ci0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcXVlc3QgY3JlYXRlTWlycm9yUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uLCBQcm9wZXJ0aWVzIGRlc3RpbmF0aW9uRGVzY3JpcHRvclByb3BlcnRpZXMsIFByb3BlcnRpZXMgZGVzdGluYXRpb25SZXBvc2l0b3J5UHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFydGlmYWN0IHJlcG9zaXRvcnkgb2YgdGhlIGdpdmVuIHR5cGUgYXQgCi0JICogdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeSBpcyA8Yj5ub3Q8L2I+IGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5Ci0JICogdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gQ2xpZW50cyBtdXN0IG1ha2UgYSBzdWJzZXF1ZW50IGNhbGwgdG8ge0BsaW5rICNhZGRSZXBvc2l0b3J5KFVSTCl9Ci0JICogaWYgdGhleSB3YW50IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIgdG8gcmVtZW1iZXIgdGhlIHJlcG9zaXRvcnkgZm9yIHN1YnNlcXVlbnQKLQkgKiBsb2FkIGF0dGVtcHRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gdHlwZSB0aGUga2luZCBvZiByZXBvc2l0b3J5IHRvIGNyZWF0ZQotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgdHlwZSBpcyB1bmtub3duLjwvbGk+Ci0JICogPGxpPlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPkEgcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBsb2NhdGlvbnMga25vd24gdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBhIHZhbGlkIHJlcG9zaXRvcnkKLQkgKiBleGlzdHMgYXQgYW55IG9mIHRoZSByZXR1cm5lZCBsb2NhdGlvbnMgYXQgYW55IHBhcnRpY3VsYXIgbW9tZW50IGluIHRpbWUuCi0JICogQSBzdWJzZXF1ZW50IGF0dGVtcHQgdG8gbG9hZCBhIHJlcG9zaXRvcnkgYXQgYW55IG9mIHRoZSBnaXZlbiBsb2NhdGlvbnMgbWF5Ci0JICogb3IgbWF5IG5vdCBzdWNjZWVkLgotCSAqIAotCSAqIEBwYXJhbSBmbGFncyBhbiBpbnRlZ2VyIGJpdC1tYXNrIGluZGljYXRpbmcgd2hpY2ggcmVwb3NpdG9yaWVzIHNob3VsZCBiZQotCSAqIHJldHVybmVkLiAgPGNvZGU+UkVQT1NJVE9SSUVTX0FMTDwvY29kZT4gY2FuIGJlIHVzZWQgYXMgdGhlIG1hc2sgd2hlbgotCSAqIGFsbCByZXBvc2l0b3JpZXMgc2hvdWxkIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9ucyBvZiB0aGUgcmVwb3NpdG9yaWVzIG1hbmFnZWQgYnkgdGhpcyByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0FMTAotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19TWVNURU0KLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTQotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19MT0NBTAotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRLbm93blJlcG9zaXRvcmllcyhpbnQgZmxhZ3MpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBVUkwsIAotCSAqIHdpdGhvdXQgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgc29tZSBwcm9wZXJ0aWVzIGZvciBhIHJlcG9zaXRvcnkgY2FuIG9ubHkgYmUKLQkgKiBkZXRlcm1pbmVkIHdoZW4gdGhhdCByZXBvc2l0b3J5IGlzIGxvYWRlZC4gIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogZm9yIHN1Y2ggcHJvcGVydGllcy4gIE9ubHkgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBhbHJlYWR5Ci0JICoga25vd24gYnkgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2lsbCBiZSByZXR1cm5lZC4gCi0JICogPHA+Ci0JICogSWYgYSBjbGllbnQgd2lzaGVzIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBhIHJlcG9zaXRvcnkgCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgY29zdCBvZiByZXRyaWV2aW5nIGl0LCB0aGUgY2xpZW50IHNob3VsZCBsb2FkIHRoZSAKLQkgKiByZXBvc2l0b3J5IGFuZCB0aGVuIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSByZXBvc2l0b3J5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIFVSTCBvZiB0aGUgcmVwb3NpdG9yeSBpbiBxdWVzdGlvbgotCSAqIEBwYXJhbSBrZXkgdGhlIFN0cmluZyBrZXkgb2YgdGhlIHByb3BlcnR5IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5Ci0JICogZG9lcyBub3QgZXhpc3QsIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIAotCSAqIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAc2VlICNsb2FkUmVwb3NpdG9yeShVUkwsIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNlZSBJUmVwb3NpdG9yeSNnZXRQcm9wZXJ0aWVzKCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlQcm9wZXJ0eShVUkwgbG9jYXRpb24sIFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiAgVGhlIGxvY2F0aW9uIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gCi0JICogZGF0YSB0aGF0IGRlc2NyaWJlcyBhIHZhbGlkIGFydGlmYWN0IHJlcG9zaXRvcnkgb2YgYSBrbm93biB0eXBlLiAgSWYgdGhpcyBtYW5hZ2VyCi0JICogYWxyZWFkeSBrbm93cyBhIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIHRoZW4gdGhhdCByZXBvc2l0b3J5IGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgdHJhY2tlZCBieQotCSAqIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuIENsaWVudHMgbXVzdCBtYWtlIGEgc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjcmVtb3ZlUmVwb3NpdG9yeShVUkwpfQotCSAqIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciB0byByZW1lbWJlciB0aGUgcmVwb3NpdG9yeSBmb3Igc3Vic2VxdWVudAotCSAqIGxvYWQgYXR0ZW1wdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gaW4gd2hpY2ggdG8gbG9vayBmb3IgYSByZXBvc2l0b3J5IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSByZXBvc2l0b3J5IG9iamVjdCBmb3IgdGhlIGdpdmVuIGxvY2F0aW9uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIHJlcG9zaXRvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVVJMLiBUaGlzIG1ldGhvZCBkaXNjYXJkcwotCSAqIGFueSBjYWNoZWQgc3RhdGUgaGVsZCBieSB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIGFuZCByZWxvYWRzIHRoZSByZXBvc2l0b3J5Ci0JICogY29udGVudHMuIFRoZSBwcm92aWRlZCByZXBvc2l0b3J5IGxvY2F0aW9uIG11c3QgYWxyZWFkeSBiZSBrbm93biB0byB0aGUgcmVwb3NpdG9yeQotCSAqIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byByZWZyZXNoCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gVGhlIHJlZnJlc2hlZCBtZXRhZGF0YSByZXBvc2l0b3J5Ci0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgbG9jYXRpb24gaXMgbm90IGtub3duIHRvIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuPC9saT4KLQkgKiA8bGk+VGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24gY291bGQgbm90IGJlIHJlYWQuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlZnJlc2hSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBnaXZlbiByZXBvc2l0b3J5IGZyb20gdGhpcyBtYW5hZ2VyLiAgRG8gbm90aGluZyBpZiB0aGUgcmVwb3NpdG9yeQotCSAqIGlzIG5vdCBjdXJyZW50bHkgbWFuYWdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIHJlbW92ZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSByZXBvc2l0b3J5IHdhcyByZW1vdmVkLCBhbmQgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMTI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFydGlmYWN0UmVxdWVzdCB7Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5IGdldEFydGlmYWN0S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGNhbGwgdG8ge0BsaW5rIEFydGlmYWN0UmVxdWVzdCNwZXJmb3JtKElQcm9ncmVzc01vbml0b3IpfSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwZXJmb3JtIGhhcyBuZXZlciBiZWVuIGNhbGxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBlcmZvcm0gY2FsbC4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRSZXN1bHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JRmlsZUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JRmlsZUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZlMDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBJQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBmdWxsIGxvY2FsIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gCi0JICogYXJ0aWZhY3Qga2V5IHRvIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhdmFpbGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcXVlc3RlZCBhcnRpZmFjdCBvcjxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0S2V5IGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NhbCBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIAotCSAqIGFydGlmYWN0IGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhdmFpbGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yIG9yPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JU3RhdGVmdWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSVN0YXRlZnVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMmQ3ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JU3RhdGVmdWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogSW1wbGVtZW50aW5nIDxjb2RlPklTdGF0ZWZ1bDwvY29kZT4gYWRkcyB0aGUgYWJpbGl0eSB0byBzdG9yZSBzdGF0dXMgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlZnVsIHsKLQotCS8qKgotCSAqIFNldCB0aGUgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgaWYgc3RhdHVzIGVxdWFscyBudWxsID0+IGdldFN0YXR1cygpLmlzT0sKLQkgKi8KLQl2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cyk7Ci0KLQkvKioKLQkgKiBHZXQgc3RhdHVzLgotCSAqIEByZXR1cm4gc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTI2ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICAgSUJNIENvcnBvcmF0aW9uIC0gY29udGludWluZyBkZXZlbG9wbWVudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSVN0YXRlZnVsOwotCi0vKioKLSAqIFByb2Nlc3NpbmdTdGVwcyBwcm9jZXNzIHRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlbSBhbmQgcGFzcyB0aGUgcmVzdWx0YW50IGRhdGEgb24KLSAqIHRvIGEgY29uZmlndXJlZCBkZXN0aW5hdGlvbiBzdHJlYW0uICBTdGVwcyBtYXkgbW9uaXRvciAoZS5nLiwgY291bnQpIHRoZSBkYXRhLCBjb21wdXRlIGluZm9ybWF0aW9uIAotICogYWJvdXQgdGhlIGRhdGEgKGUuZy4sIGNoZWNrc3VtIG9yIGhhc2gpIG9yIHRyYW5zZm9ybSB0aGUgZGF0YSAoZS5nLiwgdW5wYWNrMjAwKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NpbmdTdGVwIGV4dGVuZHMgT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgSVN0YXRlZnVsIHsKLQotCXByaXZhdGUgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NpbmdTdGVwKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm9jZXNzaW5nIHN0ZXAgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gCi0JICogZGVzY3JpcHRvciBhbmQgY29udGV4dC4gIEFmdGVyIGluaXRpYWxpemF0aW9uLCB0aGlzIHN0ZXAgaXMgcmVhZHkgZm9yIGxpbmtpbmcgCi0JICogd2l0aCBvdGhlciBzdGVwcyBvciBvdXRwdXQgc3RyZWFtcwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGVwCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0ZXAgaXMgYmVpbmcgdXNlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUhCi0JfQotCi0JLyoqCi0JICogTGluayB0aGlzIHN0ZXAgd2l0aCB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSBhbmQgY29uZmlndXJlIHRoZSBzdGVwIHRvIHVzZSB0aGUgZ2l2ZW4KLQkgKiBwcm9ncmVzcyBtb25pdG9yLiAgQWZ0ZXIgbGlua2luZyB0aGUgc3RlcCBpcyByZWFkeSB0byBoYXZlIGRhdGEgd3JpdHRlbiB0byBpdC4KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIHN0cmVhbSBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSBwcm9jZXNzZWQgZGF0YQotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBmb3IgcmVwb3J0aW5nIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgbGluayhPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnl0ZSBhbmQgcGFzcyB0aGUgcmVzdWx0IG9uIHRvIHRoZSBjb25maWd1cmVkIGRlc3RpbmF0aW9uIHN0cmVhbQotCSAqIEBwYXJhbSBiIHRoZSBieXRlIGJlaW5nIHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB0byBkbyBoZXJlIQotCX0KLQotCS8qKiAKLQkgKiBGbHVzaCBhbnkgdW53cml0dGVuIGRhdGEgZnJvbSB0aGlzIHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmZsdXNoKCk7Ci0JCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKQotCQkJZGVzdGluYXRpb24uZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGlzIHN0cmVhbSBhbmQsIGlmIHRoZSBjb25maWd1cmVkIGRlc3RpbmF0aW9uIGlzIGEgUHJvY2Vzc2luZ1N0ZXAsIAotCSAqIGNsb3NlIGl0IGFzIHdlbGwuICBUeXBpY2FsbHkgYSBjaGFpbiBvZiBzdGVwcyB0ZXJtaW5hdGVzIGluIGEgY29udmVudGlvbmFsIAotCSAqIG91dHB1dCBzdHJlYW0uICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGV5IHNldCB0aGUgCi0JICogc3RhdHVzIG9mIHRoZSBzdGVwLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgUHJvY2Vzc2luZ1N0ZXApCi0JCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCQltb25pdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXRoaXMuc3RhdHVzID0gc3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4gCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvcjsgbWF5IGJlIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBwcm9jZXNzZWQgZGF0YSBpbnRvLgotCSAqIAotCSAqIEByZXR1cm4gb3V0cHV0IHN0cmVhbSBmb3IgcHJvY2Vzc2VkIGRhdGEKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldERlc3RpbmF0aW9uKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhpcyBzdGVwLiAgVGhlIHN0YXR1cyB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIHN0ZXAgaGFzIG5vdCB5ZXQgZXhlY3V0ZWQuIElmIHRoZSBzdGVwIGhhcyBleGVjdXRlZCB0aGUgcmV0dXJuZWQgc3RhdHVzCi0JICogaW5kaWNhdGVzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIHN0ZXAuCi0JICogQHBhcmFtIGRlZXAgd2hldGhlciBvciBub3QgdG8gYWdncmVnYXRlIHRoZSBzdGF0dXMgb2YgYW55IGxpbmtlZCBzdGVwcwotCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBzdGF0dXMgCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKGJvb2xlYW4gZGVlcCkgewotCQlpZiAoIWRlZXApCi0JCQlyZXR1cm4gZ2V0U3RhdHVzKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2V2ZXJpdHkgPSBjb2xsZWN0U3RhdHVzKGxpc3QpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5PSykKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlJU3RhdHVzW10gcmVzdWx0ID0gKElTdGF0dXNbXSkgbGlzdC50b0FycmF5KG5ldyBJU3RhdHVzW2xpc3Quc2l6ZSgpXSk7Ci0JCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoQWN0aXZhdG9yLklELCBzZXZlcml0eSwgcmVzdWx0LCAiUmVzdWx0IG9mIHByb2Nlc3Npbmcgc3RlcHMiLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb2xsZWN0U3RhdHVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCWxpc3QuYWRkKGdldFN0YXR1cygpKTsKLQkJaWYgKCEoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBQcm9jZXNzaW5nU3RlcCkpCi0JCQlyZXR1cm4gZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKTsKLQkJaW50IHJlc3VsdCA9ICgoUHJvY2Vzc2luZ1N0ZXApIGRlc3RpbmF0aW9uKS5jb2xsZWN0U3RhdHVzKGxpc3QpOwotCQkvLyBUT0RPIGdyZWF0ZXIgdGhhbiB0ZXN0IGhlcmUgaXMgYSBsaXR0bGUgYnJpdHRsZSBidXQgaXQgaXMgdmVyeSB1bmxpa2VseSB0aGF0IHdlIHdpbGwgYWRkCi0JCS8vIGEgbmV3IHN0YXR1cyBzZXZlcml0eS4KLQkJaWYgKGdldFN0YXR1cygpLmdldFNldmVyaXR5KCkgPiByZXN1bHQpCi0JCQlyZXR1cm4gZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyMGZiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi0vKioKLSAqIFRoZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3NvciBzdGVwLgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb2Nlc3NvcklkOyAvL3RoZSBvcGVyYXRpb24gdG8gYmUgYXBwbGllZCAoZS5nOiB1bnBhY2ssIG1kNSwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgZXRjLikKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkYXRhOyAvL2RhdGEgcmVxdWVzdGVkIGZvciB0aGUgcHJvY2Vzc2luZyAoZWcuIGV4cGVjdGVkIGNoZWNrc3VtKQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiByZXF1aXJlZDsgLy93aGV0aGVyIHRoZSBzdGVwIGlzIG9wdGlvbmFsIG9yIG5vdAotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvY2Vzc2luZyBzdGVwIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3JJZAotCSAqIEBwYXJhbSBkYXRhCi0JICogQHBhcmFtIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcihTdHJpbmcgcHJvY2Vzc29ySWQsIFN0cmluZyBkYXRhLCBib29sZWFuIHJlcXVpcmVkKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvY2Vzc29ySWQgPSBwcm9jZXNzb3JJZDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29ySWQoKSB7Ci0JCXJldHVybiBwcm9jZXNzb3JJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkYXRhID09IG51bGwpID8gMCA6IGRhdGEuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChwcm9jZXNzb3JJZCA9PSBudWxsKSA/IDAgOiBwcm9jZXNzb3JJZC5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAocmVxdWlyZWQgPyAxMjMxIDogMTIzNyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Igb3RoZXIgPSAoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKSBvYmo7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5kYXRhICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFkYXRhLmVxdWFscyhvdGhlci5kYXRhKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHByb2Nlc3NvcklkID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5wcm9jZXNzb3JJZCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghcHJvY2Vzc29ySWQuZXF1YWxzKG90aGVyLnByb2Nlc3NvcklkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlcXVpcmVkICE9IG90aGVyLnJlcXVpcmVkKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMzgyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICBJQk0gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBwcm9jZXNzaW5nIHN0ZXAgaW5zdGFuY2VzIGZyb20gZXh0ZW5zaW9ucyBhbmQgZXhlY3V0ZXMgdGhlbS4KLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdTdGVwSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0lOR19TVEVQU19FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja1N0YXR1cyhPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0JCWlmICghKG91dHB1dCBpbnN0YW5jZW9mIFByb2Nlc3NpbmdTdGVwKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gKChQcm9jZXNzaW5nU3RlcCkgb3V0cHV0KS5nZXRTdGF0dXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIHRoYXQgd2UgaGF2ZSBwcm9jZXNzb3JzIGZvciBhbGwgdGhlIHN0ZXBzIGluIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHByb2Nlc3NvcnMgZm9yIGFsbCB0aGUgZGVzY3JpcHRvcidzIHN0ZXBzIGFyZSBpbnN0YWxsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUHJvY2VzcyhJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBST0NFU1NJTkdfU1RFUFNfRVhURU5TSU9OX0lEKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHN0ZXBzID0gZGVzY3JpcHRvci5nZXRQcm9jZXNzaW5nU3RlcHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBvaW50LmdldEV4dGVuc2lvbihzdGVwc1tpXS5nZXRQcm9jZXNzb3JJZCgpKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBbXSBjcmVhdGUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlQcm9jZXNzaW5nU3RlcFtdIHJlc3VsdCA9IG5ldyBQcm9jZXNzaW5nU3RlcFtkZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotCQkJcmVzdWx0W2ldID0gY3JlYXRlKGRlc2NyaXB0b3JzW2ldLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXAgY3JlYXRlKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uKFBST0NFU1NJTkdfU1RFUFNfRVhURU5TSU9OX0lELCBkZXNjcmlwdG9yLmdldFByb2Nlc3NvcklkKCkpOwotCQlFeGNlcHRpb24gZXJyb3I7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJdHJ5IHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gY29uZmlnWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9jZXNzaW5nU3RlcCBzdGVwID0gKFByb2Nlc3NpbmdTdGVwKSBvYmplY3Q7Ci0JCQkJc3RlcC5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQkJCXJldHVybiBzdGVwOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvciA9IGU7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZXJyb3IgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGV4dGVuc2lvbiAiICsgUFJPQ0VTU0lOR19TVEVQU19FWFRFTlNJT05fSUQgKyAiIGZvciBkZXNyaXB0b3IgaWQgIiArIGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc29ySWQoKSk7Ci0KLQkJaW50IHNldmVyaXR5ID0gZGVzY3JpcHRvci5pc1JlcXVpcmVkKCkgPyBJU3RhdHVzLkVSUk9SIDogSVN0YXR1cy5JTkZPOwotCQlQcm9jZXNzaW5nU3RlcCByZXN1bHQgPSBuZXcgRW1wdHlQcm9jZXNzaW5nU3RlcCgpOwotCQlyZXN1bHQuc2V0U3RhdHVzKG5ldyBTdGF0dXMoc2V2ZXJpdHksIEFjdGl2YXRvci5JRCwgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBzdGVwOiIgKyBkZXNjcmlwdG9yLmdldFByb2Nlc3NvcklkKCksIGVycm9yKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE91dHB1dFN0cmVhbSBjcmVhdGVBbmRMaW5rKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQsIE91dHB1dFN0cmVhbSBvdXRwdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCXJldHVybiBvdXRwdXQ7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBjcmVhdGUoZGVzY3JpcHRvcnMsIGNvbnRleHQpOwotCQlyZXR1cm4gbGluayhzdGVwcywgb3V0cHV0LCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGxpbmsoUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcywgT3V0cHV0U3RyZWFtIG91dHB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU91dHB1dFN0cmVhbSBwcmV2aW91cyA9IG91dHB1dDsKLQkJZm9yIChpbnQgaSA9IHN0ZXBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlQcm9jZXNzaW5nU3RlcCBzdGVwID0gc3RlcHNbaV07Ci0JCQlzdGVwLmxpbmsocHJldmlvdXMsIG1vbml0b3IpOwotCQkJcHJldmlvdXMgPSBzdGVwOwotCQl9Ci0JCXJldHVybiBwcmV2aW91czsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5UHJvY2Vzc2luZ1N0ZXAgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0JCS8vIEp1c3QgdG8gaG9sZCB0aGUgc3RhdHVzCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9jZXNzaW5nU3RlcEhhbmRsZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlzdXBlcihtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0Fic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzcwOTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0Fic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5VUkxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LkFic3RyYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBVUkwgbG9jYXRpb24sIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKG5hbWUsIHR5cGUsIHZlcnNpb24sIGxvY2F0aW9uLCBkZXNjcmlwdGlvbiwgcHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIGFic3RyYWN0IElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpOwotCi0JcHVibGljIGFic3RyYWN0IElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpOwotCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZ2V0QXJ0aWZhY3RzKElBcnRpZmFjdFJlcXVlc3RbXSByZXF1ZXN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmICghaXNNb2RpZmlhYmxlKCkpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5yZXBvUmVhZE9ubHksIGdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSkpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3JzKElBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQlpZiAoIWlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG5vdCBtb2RpZmlhYmxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSkgewotCQlpZiAoIWlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG5vdCBtb2RpZmlhYmxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQlpZiAoIWlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG5vdCBtb2RpZmlhYmxlIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGdldExvY2F0aW9uKCksICgoQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkpIG8pLmdldExvY2F0aW9uKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLmhhc2hDb2RlKCkpICogODc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlNGY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFydGlmYWN0IHJlcG9zaXRvcnkgb2YgdGhlIGdpdmVuIHR5cGUgYXQgCi0JICogdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gZm9yIHRoZSBuZXcgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSB0eXBlIHRoZSBraW5kIG9mIHJlcG9zaXRvcnkgdG8gY3JlYXRlCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByZXBvc2l0b3J5Ci0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSB0eXBlIGlzIHVua25vd24uPC9saT4KLQkgKiA8bGk+VGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGdpdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+QSByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gIFRoZSBsb2NhdGlvbiBpcyBleHBlY3RlZCB0byBjb250YWluIAotCSAqIGRhdGEgdGhhdCBkZXNjcmliZXMgYSB2YWxpZCBhcnRpZmFjdCByZXBvc2l0b3J5IG9mIGEga25vd24gdHlwZS4gIElmIHRoaXMgbWFuYWdlcgotCSAqIGFscmVhZHkga25vd3MgYSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiB0aGVuIHRoYXQgcmVwb3NpdG9yeSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIGluIHdoaWNoIHRvIGxvb2sgZm9yIGEgcmVwb3NpdG9yeSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcmVwb3NpdG9yeSBvYmplY3QgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbgotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24gY291bGQgbm90IGJlIHJlYWQuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YjIyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIFBST1RPQ09MX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJbG9uZyB0aW1lID0gMDsKLQkJZmluYWwgU3RyaW5nIGRlYnVnTXNnID0gIlJlc3RvcmluZyBhcnRpZmFjdCByZXBvc2l0b3J5ICI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFRyYWNpbmcuREVCVUdfTUVUQURBVEFfUEFSU0lORykgewotCQkJVHJhY2luZy5kZWJ1ZyhkZWJ1Z01zZyArIGxvY2F0aW9uKTsKLQkJCXRpbWUgPSAtU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJRmlsZSBsb2NhbEZpbGUgPSBudWxsOwotCQlib29sZWFuIGxvY2FsID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAzMDApOwotCQkJT3V0cHV0U3RyZWFtIGFydGlmYWN0cyA9IG51bGw7Ci0JCQkvLyB0cnkgd2l0aCBjb21wcmVzc2VkCi0JCQlib29sZWFuIGNvbXByZXNzID0gdHJ1ZTsKLQkJCWlmIChQUk9UT0NPTF9GSUxFLmVxdWFscyhsb2NhdGlvbi5nZXRQcm90b2NvbCgpKSkgewotCQkJCWxvY2FsID0gdHJ1ZTsKLQkJCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIHRydWUpLmdldFBhdGgoKSk7Ci0JCQkJaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCBmYWxzZSkuZ2V0UGF0aCgpKTsKLQkJCQkJY29tcHJlc3MgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vZG93bmxvYWQgdG8gbG9jYWwgdGVtcCBmaWxlCi0JCQkJbG9jYWxGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYXJ0aWZhY3RzIiwgIi54bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdHJ5IHsKLQkJCQkJYXJ0aWZhY3RzID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSkpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGdldFRyYW5zcG9ydCgpLmRvd25sb2FkKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgY29tcHJlc3MpLnRvRXh0ZXJuYWxGb3JtKCksIGFydGlmYWN0cywgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCS8vIHJldHJ5IHVuY29tcHJlc3NlZAotCQkJCQkJY29tcHJlc3MgPSBmYWxzZTsKLQkJCQkJCXN0YXR1cyA9IGdldFRyYW5zcG9ydCgpLmRvd25sb2FkKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgY29tcHJlc3MpLnRvRXh0ZXJuYWxGb3JtKCksIGFydGlmYWN0cywgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgbnVsbCkpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGFydGlmYWN0cyAhPSBudWxsKQotCQkJCQkJYXJ0aWZhY3RzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJSW5wdXRTdHJlYW0gZGVzY3JpcHRvclN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3JTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2FsRmlsZSkpOwotCQkJCWlmIChjb21wcmVzcykgewotCQkJCQlVUkwgYWN0dWFsRmlsZSA9IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgZmFsc2UpOwotCQkJCQlKYXJJbnB1dFN0cmVhbSBqSW5TdHJlYW0gPSBuZXcgSmFySW5wdXRTdHJlYW0oZGVzY3JpcHRvclN0cmVhbSk7Ci0JCQkJCUphckVudHJ5IGphckVudHJ5ID0gakluU3RyZWFtLmdldE5leHRKYXJFbnRyeSgpOwotCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBuZXcgUGF0aChhY3R1YWxGaWxlLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKTsKLQkJCQkJd2hpbGUgKGphckVudHJ5ICE9IG51bGwgJiYgIShmaWxlbmFtZS5lcXVhbHMoamFyRW50cnkuZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCWphckVudHJ5ID0gakluU3RyZWFtLmdldE5leHRKYXJFbnRyeSgpOwotCQkJCQl9Ci0JCQkJCWlmIChqYXJFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG5vdCBmb3VuZCBpbiAiICsgYWN0dWFsRmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZGVzY3JpcHRvclN0cmVhbSA9IGpJblN0cmVhbTsKLQkJCQl9Ci0JCQkJU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5SU8gaW8gPSBuZXcgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5SU8oKTsKLQkJCQlTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgcmVzdWx0ID0gKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSkgaW8ucmVhZChsb2NhbEZpbGUudG9VUkwoKSwgZGVzY3JpcHRvclN0cmVhbSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCXJlc3VsdC5pbml0aWFsaXplQWZ0ZXJMb2FkKGxvY2F0aW9uKTsKLQkJCQlpZiAoVHJhY2luZy5ERUJVR19NRVRBREFUQV9QQVJTSU5HKSB7Ci0JCQkJCXRpbWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVRyYWNpbmcuZGVidWcoZGVidWdNc2cgKyAidGltZSAobXMpOiAiICsgdGltZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChkZXNjcmlwdG9yU3RyZWFtICE9IG51bGwpCi0JCQkJCWRlc2NyaXB0b3JTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIG1zZywgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuaW9fZmFpbGVkUmVhZCwgbG9jYXRpb24pOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQsIG1zZywgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKCFsb2NhbCAmJiBsb2NhbEZpbGUgIT0gbnVsbCAmJiAhbG9jYWxGaWxlLmRlbGV0ZSgpKQotCQkJCWxvY2FsRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeShuYW1lLCBsb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KCkgewotCQlyZXR1cm4gRUNGVHJhbnNwb3J0LmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmJlN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU1YjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0jVGh1IFNlcCAxMyAyMjowMjo0MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYjZhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTc6NDQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjAzNDU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb25zb2xlLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scyIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7Y29tbW9uPXNwbGl0LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZTt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjQuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4zIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL1Byb3Zpc2lvbmluZyBjb25zb2xlLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL1Byb3Zpc2lvbmluZyBjb25zb2xlLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkODc2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9Qcm92aXNpb25pbmcgY29uc29sZS5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5FcXVpbm94TGF1bmNoZXIiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSJkOlx0bXBcc2VsZmhvc3RpbmciLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMqMy4yLjIwMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LGphdmF4LnNlcnZsZXQqMi40LjAudjIwMDcxMTAyMTAzMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkqMy4yLjIwMC52MjAwNzA3MTdAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnMqMy4zLjEwMC52MjAwODAyMjRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUubmV0KjEuMC4xMDAuSTIwMDgwMjI2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMqMy4xLjIwMC52MjAwNzEyMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwMzA0QDosb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCozLjIuMTAwLnYyMDA3MDUwMkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUqMy4zLjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLnNhdDRqLnBiKjIuMC4wLnYyMDA4MDMwN0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcioxLjYuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YqMS40LjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuc2F0NGouY29yZSoyLjAuMC52MjAwODAzMDdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IqMC4xLjAucXVhbGlmaWVyQDE6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSoxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgQ29uc29sZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb25zb2xlL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM5OGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb25zb2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciwgU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHsKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX05BTUUgPSAib3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZS5Db21tYW5kUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwcm9maWxlVHJhY2tlcjsKLQlwcml2YXRlIFByb3ZDb21tYW5kUHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHByb3ZpZGVyUmVnaXN0cmF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQkJYm9vbGVhbiByZWdpc3RlckNvbW1hbmRzID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoUFJPVklERVJfTkFNRSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmVnaXN0ZXJDb21tYW5kcyA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKHJlZ2lzdGVyQ29tbWFuZHMpIHsKLQkJCXByb2ZpbGVUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCXByb2ZpbGVUcmFja2VyLm9wZW4oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcHJvZmlsZVRyYWNrZXIuY2xvc2UoKTsKLQkJaWYgKHByb3ZpZGVyUmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQlwcm92aWRlclJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCXByb3ZpZGVyUmVnaXN0cmF0aW9uID0gbnVsbDsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlJUHJvZmlsZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlwcm92aWRlciA9IG5ldyBQcm92Q29tbWFuZFByb3ZpZGVyKGNvbnRleHQuZ2V0UHJvcGVydHkoImVjbGlwc2UucDIucHJvZmlsZSIpLCByZWdpc3RyeSk7Ci0JCXByb3ZpZGVyUmVnaXN0cmF0aW9uID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoUFJPVklERVJfTkFNRSwgcHJvdmlkZXIsIG51bGwpOwotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCWlmIChwcm92aWRlclJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJcHJvdmlkZXJSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotCQlwcm92aWRlclJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb25zb2xlL1Byb3ZDb21tYW5kUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvUHJvdkNvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNiMmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvUHJvdkNvbW1hbmRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJQmFuZCBYSSAtIGFkZCBtb3JlIGNvbW1hbmRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JVVByb3BlcnR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZEludGVycHJldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLS8qKgotICogQW4gT1NHaSBjb25zb2xlIGNvbW1hbmQgcHJvdmlkZXIgdGhhdCBhZGRzIHZhcmlvdXMgY29tbWFuZHMgZm9yIGludGVyYWN0aW5nCi0gKiB3aXRoIHRoZSBwcm92aXNpb25pbmcgc3lzdGVtLgotICovCi1wdWJsaWMgY2xhc3MgUHJvdkNvbW1hbmRQcm92aWRlciBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTERDQVJEX0FOWSA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8vCXByaXZhdGUgUHJvZmlsZSBwcm9maWxlOwotCi0JcHVibGljIFByb3ZDb21tYW5kUHJvdmlkZXIoU3RyaW5nIHByb2ZpbGVJZCwgSVByb2ZpbGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvLyBsb29rIHVwIHRoZSBwcm9maWxlIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZyBhbmQgdXNlIGl0IGFzIHRoZQotCQkvLyBkZWZhdWx0LgotCQkvLyBUT0RPIGRlZmluZSBhIHdheSB0byBzcGVjIHRoZSBkZWZhdWx0IHByb2ZpbGUgdG8gbWFuYWdlCi0JCS8vCQlpZiAocHJvZmlsZUlkICE9IG51bGwpIHsKLQkJLy8JCQlwcm9maWxlID0gcmVnaXN0cnkuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQkvLwkJCWlmIChwcm9maWxlICE9IG51bGwpCi0JCS8vCQkJCXJldHVybjsKLQkJLy8JCX0KLQkJLy8JCS8vIEEgZGVmYXVsdCB3YXMgbm90IGRlZmluZWQgc28gbWFuYWdlIHRoZSBmaXJzdCBwcm9maWxlIHdlIGNhbiBmaW5kCi0JCS8vCQlQcm9maWxlW10gcHJvZmlsZXMgPSByZWdpc3RyeS5nZXRQcm9maWxlcygpOwotCQkvLwkJaWYgKHByb2ZpbGVzLmxlbmd0aCA+IDApCi0JCS8vCQkJcHJvZmlsZSA9IHByb2ZpbGVzWzBdOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRhZGF0YSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92YWRkcmVwbyhDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlpZiAodXJsU3RyaW5nID09IG51bGwpIHsKLQkJCWludGVycHJldGVyLnByaW50KCJSZXBvc2l0b3J5IGxvY2F0aW9uIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJCWludGVycHJldGVyLnByaW50bG4oKTsKLQkJCXJldHVybjsKLQkJfQotCQlVUkwgcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQlpZiAocmVwb1VSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoUHJvdmlzaW9uaW5nSGVscGVyLmFkZE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvVVJMKSA9PSBudWxsKQotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiVW5hYmxlIHRvIGFkZCByZXBvc2l0b3J5OiAiICsgcmVwb1VSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgX3Byb3ZkZWxyZXBvKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgdXJsU3RyaW5nID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnQoIlJlcG9zaXRvcnkgbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZCIpOwotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVVSTCByZXBvVVJMID0gdG9VUkwoaW50ZXJwcmV0ZXIsIHVybFN0cmluZyk7Ci0JCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVByb3Zpc2lvbmluZ0hlbHBlci5yZW1vdmVNZXRhZGF0YVJlcG9zaXRvcnkocmVwb1VSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgX3Byb3ZhZGRhcnRpZmFjdHJlcG8oQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyB1cmxTdHJpbmcgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludCgiUmVwb3NpdG9yeSBsb2NhdGlvbiBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVVJMIHJlcG9VUkwgPSB0b1VSTChpbnRlcnByZXRlciwgdXJsU3RyaW5nKTsKLQkJaWYgKHJlcG9VUkwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKFByb3Zpc2lvbmluZ0hlbHBlci5hZGRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb1VSTCkgPT0gbnVsbCkKLQkJCWludGVycHJldGVyLnByaW50bG4oIlVuYWJsZSB0byBhZGQgcmVwb3NpdG9yeTogIiArIHJlcG9VUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIF9wcm92ZGVsYXJ0aWZhY3RyZXBvKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgdXJsU3RyaW5nID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnQoIlJlcG9zaXRvcnkgbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZCIpOwotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVVSTCByZXBvVVJMID0gdG9VUkwoaW50ZXJwcmV0ZXIsIHVybFN0cmluZyk7Ci0JCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVByb3Zpc2lvbmluZ0hlbHBlci5yZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnkocmVwb1VSTCk7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbCBhIGdpdmVuIElVIHRvIGEgZ2l2ZW4gcHJvZmlsZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmluc3RhbGwoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyBpdSA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlTdHJpbmcgdmVyc2lvbiA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlTdHJpbmcgcHJvZmlsZUlkID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCWlmIChwcm9maWxlSWQgPT0gbnVsbCB8fCBwcm9maWxlSWQuZXF1YWxzKCJ0aGlzIikpCi0JCQlwcm9maWxlSWQgPSBJUHJvZmlsZVJlZ2lzdHJ5LlNFTEY7Ci0JCWlmIChpdSA9PSBudWxsIHx8IHZlcnNpb24gPT0gbnVsbCB8fCBwcm9maWxlSWQgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiSW5zdGFsbGFibGUgdW5pdCBpZCwgdmVyc2lvbiwgYW5kIHByb2ZpbGUgSWQgbXVzdCBiZSBwcm92aWRlZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdGF0dXMgcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzID0gUHJvdmlzaW9uaW5nSGVscGVyLmluc3RhbGwoaXUsIHZlcnNpb24sIFByb3Zpc2lvbmluZ0hlbHBlci5nZXRQcm9maWxlKHByb2ZpbGVJZCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiaW5zdGFsbGF0aW9uIGZhaWxlZCAiKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHMuaXNPSygpKQotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiaW5zdGFsbGF0aW9uIGNvbXBsZXRlIik7Ci0JCWVsc2UKLQkJCWludGVycHJldGVyLnByaW50bG4oImluc3RhbGxhdGlvbiBmYWlsZWQgIiArIHMuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvZmlsZSBnaXZlbiBhbiBpZCwgbG9jYXRpb24sIGFuZCBmbGF2b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmFkZHByb2ZpbGUoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyBwcm9maWxlSWQgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJU3RyaW5nIGxvY2F0aW9uID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCVN0cmluZyBmbGF2b3IgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8IGxvY2F0aW9uID09IG51bGwgfHwgZmxhdm9yID09IG51bGwpIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oIklkLCBsb2NhdGlvbiwgYW5kIGZsYXZvciBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudmlyb25tZW50cyA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcHJvcHMuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgbG9jYXRpb24pOwotCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0ZMQVZPUiwgZmxhdm9yKTsKLQkJaWYgKGVudmlyb25tZW50cyAhPSBudWxsKQotCQkJcHJvcHMuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsIGVudmlyb25tZW50cyk7Ci0KLQkJUHJvdmlzaW9uaW5nSGVscGVyLmFkZFByb2ZpbGUocHJvZmlsZUlkLCBwcm9wcyk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIHByb2ZpbGUgZ2l2ZW4gYW4gaWQsIGxvY2F0aW9uLCBhbmQgZmxhdm9yCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZkZWxwcm9maWxlKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgcHJvZmlsZUlkID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCWlmIChwcm9maWxlSWQgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiSWQgbXVzdCBiZSBwcm92aWRlZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVByb3Zpc2lvbmluZ0hlbHBlci5yZW1vdmVQcm9maWxlKHByb2ZpbGVJZCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdHMgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIFVSTCwgaWQsIGFuZC9vciB2ZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbnRlcnByZXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92bGl1KENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgdXJsU3RyaW5nID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJU3RyaW5nIGlkID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBwcm9jZXNzQXJndW1lbnQoaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCkpOwotCQlVUkwgcmVwb1VSTCA9IG51bGw7Ci0JCWlmICh1cmxTdHJpbmcgIT0gbnVsbCAmJiAhdXJsU3RyaW5nLmVxdWFscyhXSUxEQ0FSRF9BTlkpKQotCQkJcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQlJSW5zdGFsbGFibGVVbml0W10gdW5pdHMgPSBzb3J0KFByb3Zpc2lvbmluZ0hlbHBlci5nZXRJbnN0YWxsYWJsZVVuaXRzKHJlcG9VUkwsIG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uKSksIG51bGwpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykKLQkJCXByaW50bG4oaW50ZXJwcmV0ZXIsIHVuaXRzW2ldKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0cyB0aGUga25vd24gbWV0YWRhdGEgcmVwb3NpdG9yaWVzLCBvciB0aGUgY29udGVudHMgb2YgYSBnaXZlbgotCSAqIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGludGVycHJldGVyCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZscihDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyBpZCA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSB7Ci0JCQlVUkxbXSByZXBvc2l0b3JpZXMgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvc2l0b3JpZXMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykKLQkJCQkJaW50ZXJwcmV0ZXIucHJpbnRsbihyZXBvc2l0b3JpZXNbaV0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCVVSTCByZXBvVVJMID0gdG9VUkwoaW50ZXJwcmV0ZXIsIHVybFN0cmluZyk7Ci0JCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB1bml0cyA9IHNvcnQoUHJvdmlzaW9uaW5nSGVscGVyLmdldEluc3RhbGxhYmxlVW5pdHMocmVwb1VSTCwgbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24pKSwgbnVsbCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRzLmxlbmd0aDsgaSsrKQotCQkJcHJpbnRsbihpbnRlcnByZXRlciwgdW5pdHNbaV0pOwotCX0KLQotCS8qKgotCSAqIExpc3RzIHRoZSBncm91cCBJVXMgaW4gYWxsIGtub3duIG1ldGFkYXRhIHJlcG9zaXRvcmllcywgb3IgaW4gdGhlIGdpdmVuCi0JICogbWV0YWRhdGEgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJwcmV0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmxnKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgdXJsU3RyaW5nID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJSVF1ZXJ5YWJsZSBxdWVyeWFibGUgPSBudWxsOwotCQlpZiAodXJsU3RyaW5nID09IG51bGwpIHsKLQkJCXF1ZXJ5YWJsZSA9IChJUXVlcnlhYmxlKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChxdWVyeWFibGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlVUkwgcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQkJaWYgKHJlcG9VUkwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlxdWVyeWFibGUgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9VUkwpOwotCQkJaWYgKHF1ZXJ5YWJsZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCQlRdWVyeSBxdWVyeSA9IG5ldyBJVVByb3BlcnR5UXVlcnkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVAsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gc29ydChxdWVyeWFibGUucXVlcnkocXVlcnksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRzLmxlbmd0aDsgaSsrKQotCQkJcHJpbnRsbihpbnRlcnByZXRlciwgdW5pdHNbaV0pOwotCX0KLQotCS8qKgotCSAqIExpc3RzIHRoZSBrbm93biBhcnRpZmFjdCByZXBvc2l0b3JpZXMsIG9yIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuCi0JICogYXJ0aWZhY3QgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJwcmV0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmxhcihDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgewotCQkJVVJMW10gcmVwb3NpdG9yaWVzID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldEFydGlmYWN0UmVwb3NpdG9yaWVzKCk7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspCi0JCQkJaW50ZXJwcmV0ZXIucHJpbnRsbihyZXBvc2l0b3JpZXNbaV0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCVVSTCByZXBvVVJMID0gdG9VUkwoaW50ZXJwcmV0ZXIsIHVybFN0cmluZyk7Ci0JCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb1VSTCk7Ci0JCUlBcnRpZmFjdEtleVtdIGtleXMgPSBudWxsOwotCQl0cnkgewotCQkJa2V5cyA9IChyZXBvICE9IG51bGwpID8gcmVwby5nZXRBcnRpZmFjdEtleXMoKSA6IG51bGw7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oIlJlcG9zaXRvcnkgZG9lcyBub3Qgc3VwcG9ydCBsaXN0IGNvbW1hbmRzLiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChrZXlzID09IG51bGwgfHwga2V5cy5sZW5ndGggPT0gMCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiUmVwb3NpdG9yeSBoYXMgbm8gYXJ0aWZhY3RzIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgZmlsZVJlcG8gPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIHJlcG8uZ2V0QWRhcHRlcihJRmlsZUFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwby5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleXNbaV0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2pdOwotCQkJCUZpbGUgbG9jYXRpb24gPSBudWxsOwotCQkJCWlmIChmaWxlUmVwbyAhPSBudWxsKQotCQkJCQlsb2NhdGlvbiA9IGZpbGVSZXBvLmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQkJCQlwcmludGxuKGludGVycHJldGVyLCBrZXlzW2ldLCBsb2NhdGlvbik7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyBhcyBhbiBVUkwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHJpbmcKLQkgKiBjb3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gVVJMLgotCSAqLwotCXByaXZhdGUgVVJMIHRvVVJMKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgU3RyaW5nIHVybFN0cmluZykgewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWludGVycHJldGVyLnByaW50KGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWludGVycHJldGVyLnByaW50bG4oKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0FyZ3VtZW50KFN0cmluZyBhcmcpIHsKLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5lcXVhbHMoV0lMRENBUkRfQU5ZKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXJnOwotCX0KLQotCS8qKgotCSAqIExpc3RzIHRoZSBrbm93biBwcm9maWxlcywgb3IgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gcHJvZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJwcmV0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmxwKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgcHJvZmlsZUlkID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJU3RyaW5nIGlkID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJU3RyaW5nIHJhbmdlID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsKSB7Ci0JCQlJUHJvZmlsZVtdIHByb2ZpbGVzID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldFByb2ZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2ZpbGVzLmxlbmd0aDsgaSsrKQotCQkJCWludGVycHJldGVyLnByaW50bG4ocHJvZmlsZXNbaV0uZ2V0UHJvZmlsZUlkKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGRldGVybWluZSB3aGljaCBwcm9maWxlIGlzIHRvIGJlIGxpc3RlZAotCQlJUHJvZmlsZSB0YXJnZXQgPSBudWxsOwotCQlpZiAocHJvZmlsZUlkLmVxdWFscygidGhpcyIpKQotCQkJcHJvZmlsZUlkID0gSVByb2ZpbGVSZWdpc3RyeS5TRUxGOwotCQl0YXJnZXQgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbGlzdCB0aGUgcHJvZmlsZSBjb250ZW50cwotCQlJSW5zdGFsbGFibGVVbml0W10gcmVzdWx0ID0gc29ydCh0YXJnZXQucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCBuZXcgVmVyc2lvblJhbmdlKHJhbmdlKSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLQkJCWludGVycHJldGVyLnByaW50bG4ocmVzdWx0W2ldKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBzb3J0KENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgY29sbGVjdG9yLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCUFycmF5cy5zb3J0KHVuaXRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQlyZXR1cm4gYXJnMC50b1N0cmluZygpLmNvbXBhcmVUbyhhcmcxLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHVuaXRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscCgpIHsKLQkJU3RyaW5nQnVmZmVyIGhlbHAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIi0tLSIpOyAvLyROT04tTkxTLTEkCi0JCWhlbHAuYXBwZW5kKCJQcm92aXNpb25pbmcgQ29tbWFuZHMiKTsKLQkJaGVscC5hcHBlbmQoIi0tLSIpOyAvLyROT04tTkxTLTEkCi0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmxyIFs8cmVwb3NpdG9yeSBVUkw+IDxpdSBpZCB8ICo+IDx2ZXJzaW9uIHJhbmdlIHwgKj5dICAgLSBMaXN0cyBhbGwgbWV0YWRhdGEgcmVwb3NpdG9yaWVzLCBvciB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBtZXRhZGF0YSByZXBvc2l0b3J5Iik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmxhciBbPHJlcG9zaXRvcnkgVVJMPl0gLSBMaXN0cyBhbGwgYXJ0aWZhY3QgcmVwb3NpdG9yaWVzLCBvciB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBhcnRpZmFjdCByZXBvc2l0b3J5Iik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmxpdSBbPHJlcG9zaXRvcnkgVVJMIHwgKj4gPGl1IGlkIHwgKj4gPHZlcnNpb24gcmFuZ2UgfCAqPl0gLSBMaXN0cyB0aGUgSVVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4gaW4gdGhlIGdpdmVuIHJlcG8uICAqIG1hdGNoZXMgYWxsIik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmxwIFs8cHJvZmlsZSBpZCB8ICo+IC0gTGlzdHMgYWxsIHByb2ZpbGVzLCBvciB0aGUgY29udGVudHMgb2YgdGhlIHByb2ZpbGUgYXQgdGhlIGdpdmVuIHByb2ZpbGUiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRwcm92bGcgWzxyZXBvc2l0b3J5IFVSTD4gPGl1IGlkIHwgKj4gPHZlcnNpb24gcmFuZ2UgfCAqPl0gLSBMaXN0cyBhbGwgSVVzIHdpdGggZ3JvdXAgY2FwYWJpbGl0aWVzIGluIHRoZSBnaXZlbiByZXBvIG9yIGluIGFsbCByZXBvcyBpZiB0aGUgVVJMIGlzIG9taXR0ZWQiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRwcm92aW5zdGFsbCA8SW5zdGFsbGFibGVVbml0PiA8dmVyc2lvbj4gPHByb2ZpbGVJZD4gLSBQcm92aXNpb25zIGFuIElVIHRvIHRoZSBwcm9maWxlIHdpdGggdGhlIGdpdmUgaWQiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRwcm92YWRkcmVwbyA8cmVwb3NpdG9yeSBVUkw+IC0gQWRkcyBhIG1ldGFkYXRhIHJlcG9zaXRvcnkiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRwcm92YWRkYXJ0aWZhY3RyZXBvIDxyZXBvc2l0b3J5IFVSTD4gLSBBZGRzIGFuIGFydGlmYWN0IHJlcG9zaXRvcnkiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRwcm92YWRkcHJvZmlsZSA8cHJvZmlsZUlkPiA8bG9jYXRpb24+IDxmbGF2b3I+IC0gQWRkcyBhIHByb2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIGxvY2F0aW9uIGFuZCBmbGF2b3IiKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQlyZXR1cm4gaGVscC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gdG8gdGhlCi0JICogaXRlcnByZXRlcidzIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyLCBJSW5zdGFsbGFibGVVbml0IHVuaXQpIHsKLQkJaW50ZXJwcmV0ZXIucHJpbnQodW5pdC5nZXRJZCgpICsgJyAnICsgdW5pdC5nZXRWZXJzaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gdG8gdGhlCi0JICogaXRlcnByZXRlcidzIG91dHB1dCBzdHJlYW0sIGZvbGxvd2luZyBieSBhIGxpbmUgdGVybWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50bG4oQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyLCBJSW5zdGFsbGFibGVVbml0IHVuaXQpIHsKLQkJcHJpbnQoaW50ZXJwcmV0ZXIsIHVuaXQpOwotCQlpbnRlcnByZXRlci5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50bG4oQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyLCBJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXksIEZpbGUgbG9jYXRpb24pIHsKLQkJaW50ZXJwcmV0ZXIucHJpbnQoYXJ0aWZhY3RLZXkudG9TdHJpbmcoKSArICcgJyArIGxvY2F0aW9uKTsKLQkJaW50ZXJwcmV0ZXIucHJpbnRsbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb25zb2xlL1Byb3Zpc2lvbmluZ0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9Qcm92aXNpb25pbmdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3ZWVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb25zb2xlL1Byb3Zpc2lvbmluZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQcm92aXNpb25pbmdIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGFkZE1ldGFkYXRhUmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBtZXRhZGF0YSByZXBvc2l0b3J5IG1hbmFnZXIgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCX0KLQotCQkvLyBmb3IgY29udmVuaWVuY2UgY3JlYXRlIGFuZCBhZGQgYSByZXBvc2l0b3J5IGhlcmUKLQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gbG9jYXRpb24gKyAiIC0gbWV0YWRhdGEiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sIHJlcG9zaXRvcnlOYW1lLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXBvc2l0b3J5LmdldExvY2F0aW9uKCkpOwotCQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gbWV0YWRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGZvdW5kIik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gbWV0YWRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGZvdW5kIik7Ci0JCW1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFkZEFydGlmYWN0UmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQkvLyBUT0RPIGxvZyBoZXJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCS8vIGNvdWxkIG5vdCBsb2FkIGEgcmVwbyBhdCB0aGF0IGxvY2F0aW9uIHNvIGNyZWF0ZSBvbmUgYXMgYSBjb252ZW5pZW5jZQotCQlTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPSBsb2NhdGlvbiArICIgLSBhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sIHJlcG9zaXRvcnlOYW1lLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXBvc2l0b3J5LmdldExvY2F0aW9uKCkpOwotCQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuOwotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2ZpbGUgYWRkUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHByb2ZpbGVSZWdpc3RyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKQotCQkJcmV0dXJuIHByb2ZpbGU7Ci0KLQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucHV0KGtleSwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJfQotCi0JCWlmIChwcm9maWxlUHJvcGVydGllcy5nZXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpID09IG51bGwpIHsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVudmlyb25tZW50SW5mby5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPSIgKyBpbmZvLmdldE9TKCkgKyAiLG9zZ2kud3M9IiArIGluZm8uZ2V0V1MoKSArICIsb3NnaS5hcmNoPSIgKyBpbmZvLmdldE9TQXJjaCgpKTsKLQkJCWVsc2UKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICIiKTsKLQkJfQotCi0JCXJldHVybiBwcm9maWxlUmVnaXN0cnkuYWRkUHJvZmlsZShwcm9maWxlSWQsIHByb2ZpbGVQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcHJvZmlsZVJlZ2lzdHJ5LnJlbW92ZVByb2ZpbGUocHJvZmlsZUlkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlW10gZ2V0UHJvZmlsZXMoKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVByb2ZpbGVbMF07Ci0JCXJldHVybiBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIGdldFByb2ZpbGUoU3RyaW5nIGlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHF1ZXJ5Ci0JICogaW4gdGhlIGdpdmVuIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgcmVwbyB0byBzZWFyY2guICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKLQkgKiAgICAgICAgc2VhcmNoIGFsbCBrbm93biByZXBvcy4KLQkgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHBlcmZvcm0KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgSVVzIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0b3IgZ2V0SW5zdGFsbGFibGVVbml0cyhVUkwgbG9jYXRpb24sIFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVF1ZXJ5YWJsZSBxdWVyeWFibGUgPSBudWxsOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJcXVlcnlhYmxlID0gKElRdWVyeWFibGUpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJcXVlcnlhYmxlID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gcXVlcnlhYmxlLnF1ZXJ5KHF1ZXJ5LCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTFtdIHJlcG9zID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJaWYgKHJlcG9zLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gcmVwb3M7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGwgdGhlIGRlc2NyaWJlZCBJVQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpbnN0YWxsKFN0cmluZyB1bml0SWQsIFN0cmluZyB2ZXJzaW9uLCBJUHJvZmlsZSBwcm9maWxlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb2xsZWN0b3IgdW5pdHMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKG51bGwsIG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSh1bml0SWQsIG5ldyBWZXJzaW9uKHZlcnNpb24pKSwgcHJvZ3Jlc3MpOwotCQlpZiAodW5pdHMuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQllcnJvci5hcHBlbmQoIkluc3RhbGxhYmxlIHVuaXQgbm90IGZvdW5kOiAiICsgdW5pdElkICsgJyAnICsgdmVyc2lvbiArICdcbicpOwotCQkJZXJyb3IuYXBwZW5kKCJSZXBvc2l0b3JpZXMgc2VhcmNoZWQ6XG4iKTsKLQkJCVVSTFtdIHJlcG9zID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcy5sZW5ndGg7IGkrKykKLQkJCQkJZXJyb3IuYXBwZW5kKHJlcG9zW2ldICsgIlxuIik7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKGVycm9yLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJSVBsYW5uZXIgcGxhbm5lciA9IChJUGxhbm5lcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGFubmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJObyBwbGFubmVyIHNlcnZpY2UgZm91bmQuIik7Ci0KLQkJSUVuZ2luZSBlbmdpbmUgPSAoSUVuZ2luZSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGVuZ2luZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiTm8gZGlyZWN0b3Igc2VydmljZSBmb3VuZC4iKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvSW5zdGFsbCA9IChJSW5zdGFsbGFibGVVbml0W10pIHVuaXRzLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCVByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGwpOwotCQlQcm92aXNpb25pbmdQbGFuIHJlc3VsdCA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBjb250ZXh0LCBwcm9ncmVzcyk7Ci0JCWlmICghcmVzdWx0LmdldFN0YXR1cygpLmlzT0soKSkKLQkJCXJldHVybiByZXN1bHQuZ2V0U3RhdHVzKCk7Ci0KLQkJcmV0dXJuIGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcmVzdWx0LmdldE9wZXJhbmRzKCksIGNvbnRleHQsIHByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmluc3RhbGwgdGhlIGRlc2NyaWJlZCBJVQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB1bmluc3RhbGwoU3RyaW5nIHVuaXRJZCwgU3RyaW5nIHZlcnNpb24sIElQcm9maWxlIHByb2ZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkaXJlY3RvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiTm8gZGlyZWN0b3Igc2VydmljZSBmb3VuZC4iKTsKLQotCQkvLyByZXR1cm4gZGlyZWN0b3IudW5pbnN0YWxsKG5ldyBJbnN0YWxsYWJsZVVuaXRbXSB7dG9JbnN0YWxsfSwgcHJvZmlsZSwKLQkJLy8gbnVsbCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBraWNrKFN0cmluZyBwcm9maWxlSWQpIHsKLQkJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChDb25maWd1cmF0b3IpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHJvZmlsZUlkID09IG51bGwpCi0JCQl0cnkgewotCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIGRvIHNvbWUgd29yayBoZXJlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGtpY2sgc29tZSByYW5kb20gcHJvZmlsZQkJCQotCQkJLy8JCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oY29uZmlnVVJMKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0QXJ0aWZhY3RSZXBvc2l0b3JpZXMoKSB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTFtdIHJlcG9zID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJaWYgKHJlcG9zLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gcmVwb3M7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIHJlcG9VUkwpIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKQotCQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9VUkwsIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mb3IgY29uc29sZSwganVzdCBpZ25vcmUgcmVwb3NpdG9yaWVzIHRoYXQgY2FuJ3QgYmUgcmVhZAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNDJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNUdXJuIG9uIGRlYnVnZ2luZyBmb3IgcDIKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9kZWJ1Zz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgcDIgZGF0YSBmaWxlcwotb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2NvcmUvcGFyc2Vwcm9ibGVtcz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgc2l0ZS54bWwgYW5kIGZlYXR1cmUueG1sIGZpbGVzIGluIHRoZSBnZW5lcmF0b3IKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9nZW5lcmF0b3IvcGFyc2luZz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHNhdmluZy9yZXN0b3JpbmcgdGhlIGVuZ2luZSdzIGluc3RhbGwgcmVnaXN0cnkKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9lbmdpbmUvaW5zdGFsbHJlZ2lzdHJ5PWZhbHNlCi0KLSNEZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpbGUgc2F2aW5nL3Jlc3RvcmluZyBtZXRhZGF0YSByZXBvc2l0b3JpZXMKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9tZXRhZGF0YS9wYXJzaW5nPWZhbHNlCi0KLSNEZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgbWlycm9yIHNlbGVjdGlvbgotb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2FydGlmYWN0cy9taXJyb3JzPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYzE2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGY4YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgU2VwIDEzIDE2OjIzOjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU0MDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1Nzo0OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzkzM2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLAotIG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2c7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucmVzb2x2ZXIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjMiLAotIG9yZy54bWwuc2F4Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVyczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlcG9zaXRvcnlvcHRpbWl6ZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLmFwcCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiODMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjgzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlOTAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbi5BZ2VudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxvZy5GcmFtZXdvcmtMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQWdlbnRMb2NhdGlvbiBhZ2VudERhdGFMb2NhdGlvbiA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQUdFTlRfTE9DQVRJT04gPSAiLi4vcDIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIExvY2F0aW9uIGRvd25sb2FkTG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBpbnN0YW5jZTsKLQkvLyBEYXRhIG1vZGUgY29uc3RhbnRzIGZvciB1c2VyLCBjb25maWd1cmF0aW9uIGFuZCBkYXRhIGxvY2F0aW9ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fREVGQVVMVCA9ICJAbm9EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIkBub25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQUdFTlRfREFUQV9BUkVBID0gImVjbGlwc2UucDIuZGF0YS5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTkZJR19ESVIgPSAib3NnaS5jb25maWd1cmF0aW9uLmFyZWEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9ESVIgPSAidXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9IT01FID0gInVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT05MWV9BUkVBX1NVRkZJWCA9ICIucmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0NPTkZJR19ESVIgPSAiQGNvbmZpZy5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9VU0VSX0RJUiA9ICJAdXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9VU0VSX0hPTUUgPSAiQHVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBhZ2VudExvY2F0aW9uUmVnaXN0cmF0aW9uID0gbnVsbDsKLQlTZXJ2aWNlVHJhY2tlciBsb2dUcmFja2VyOwotCi0JLyoqCi0JICogTk9URTogVGhpcyBtZXRob2QgaXMgY29waWVkIGZyb20gTG9jYXRpb25IZWxwZXIgaW4gb3JnLmVjbGlwc2Uub3NnaQotCSAqIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFVSTCBhZGp1c3RUcmFpbGluZ1NsYXNoKFVSTCB1cmwsIGJvb2xlYW4gdHJhaWxpbmdTbGFzaCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJaWYgKHRyYWlsaW5nU2xhc2ggPT0gKGZpbGUuZW5kc1dpdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB1cmw7Ci0JCWZpbGUgPSB0cmFpbGluZ1NsYXNoID8gZmlsZSArICIvIiA6IGZpbGUuc3Vic3RyaW5nKDAsIGZpbGUubGVuZ3RoKCkgLSAxKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIGEgVVJMIHdpdGggdGhlIGdpdmVuIHNwZWNpZmljYXRpb24KLQkgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBjb3BpZWQgZnJvbSBMb2NhdGlvbkhlbHBlciBpbiBvcmcuZWNsaXBzZS5vc2dpCi0JICogZHVlIHRvIGFjY2VzcyByZXN0cmljdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHNwZWMgdGhlIFVSTCBzcGVjaWZpY2F0aW9uCi0JICogQHBhcmFtIHRyYWlsaW5nU2xhc2ggZmxhZyB0byBpbmRpY2F0ZSBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBzcGVjCi0JICogQHJldHVybiBhIFVSTAotCSAqLwotCXByaXZhdGUgc3RhdGljIFVSTCBidWlsZFVSTChTdHJpbmcgc3BlYywgYm9vbGVhbiB0cmFpbGluZ1NsYXNoKSB7Ci0JCWlmIChzcGVjID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBpc0ZpbGUgPSBzcGVjLnN0YXJ0c1dpdGgoImZpbGU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChpc0ZpbGUpCi0JCQkJcmV0dXJuIGFkanVzdFRyYWlsaW5nU2xhc2gobmV3IEZpbGUoc3BlYy5zdWJzdHJpbmcoNSkpLnRvVVJMKCksIHRyYWlsaW5nU2xhc2gpOwotCQkJcmV0dXJuIG5ldyBVUkwoc3BlYyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiB3ZSBmYWlsZWQgYW5kIGl0IGlzIGEgZmlsZSBzcGVjLCB0aGVyZSBpcyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvCi0JCQkvLyBvdGhlcndpc2UsIHRyeSB0byBtYWtlIHRoZSBzcGVjIGludG8gYSBmaWxlIFVSTC4KLQkJCWlmIChpc0ZpbGUpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl0cnkgewotCQkJCXJldHVybiBhZGp1c3RUcmFpbGluZ1NsYXNoKG5ldyBGaWxlKHNwZWMpLnRvVVJMKCksIHRyYWlsaW5nU2xhc2gpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmcmFtZXdvcmsgbG9nLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZyYW1ld29ya0xvZyBnZXRGcmFtZXdvcmtMb2coKSB7Ci0JCS8vcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2h1dGRvd24KLQkJQWN0aXZhdG9yIGEgPSBpbnN0YW5jZTsKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTZXJ2aWNlVHJhY2tlciB0cmFja2VyID0gYS5nZXRMb2dUcmFja2VyKCk7Ci0JCWlmICh0cmFja2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChGcmFtZXdvcmtMb2cpIHRyYWNrZXIuZ2V0U2VydmljZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdWJzdGl0dXRlVmFyKFN0cmluZyBzb3VyY2UsIFN0cmluZyB2YXIsIFN0cmluZyBwcm9wKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IEFjdGl2YXRvci5jb250ZXh0LmdldFByb3BlcnR5KHByb3ApOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlICsgc291cmNlLnN1YnN0cmluZyh2YXIubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgQWdlbnRMb2NhdGlvbiBidWlsZExvY2F0aW9uKFN0cmluZyBwcm9wZXJ0eSwgVVJMIGRlZmF1bHRMb2NhdGlvbiwgYm9vbGVhbiByZWFkT25seURlZmF1bHQsIGJvb2xlYW4gYWRkVHJhaWxpbmdTbGFzaCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBBY3RpdmF0b3IuY29udGV4dC5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCS8vIHRoZSB1c2VyL3Byb2R1Y3QgbWF5IHNwZWNpZnkgYSBub24tZGVmYXVsdCByZWFkT25seSBzZXR0aW5nICAgCi0JCVN0cmluZyB1c2VyUmVhZE9ubHlTZXR0aW5nID0gQWN0aXZhdG9yLmNvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHkgKyBSRUFEX09OTFlfQVJFQV9TVUZGSVgpOwotCQlib29sZWFuIHJlYWRPbmx5ID0gKHVzZXJSZWFkT25seVNldHRpbmcgPT0gbnVsbCA/IHJlYWRPbmx5RGVmYXVsdCA6IEJvb2xlYW4udmFsdWVPZih1c2VyUmVhZE9ubHlTZXR0aW5nKS5ib29sZWFuVmFsdWUoKSk7Ci0JCS8vIGlmIHRoZSBpbnN0YW5jZSBsb2NhdGlvbiBpcyBub3Qgc2V0LCBwcmVkaWN0IHdoZXJlIHRoZSB3b3Jrc3BhY2Ugd2lsbCBiZSBhbmQgCi0JCS8vIHB1dCB0aGUgaW5zdGFuY2UgYXJlYSBpbnNpZGUgdGhlIHdvcmtzcGFjZSBtZXRhIGFyZWEuCi0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCYXNpY0xvY2F0aW9uKHByb3BlcnR5LCBkZWZhdWx0TG9jYXRpb24sIHJlYWRPbmx5KTsKLQkJaWYgKGxvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9ORSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGxvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9fREVGQVVMVCkpCi0JCQlyZXR1cm4gbmV3IEJhc2ljTG9jYXRpb24ocHJvcGVydHksIG51bGwsIHJlYWRPbmx5KTsKLQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoVkFSX1VTRVJfSE9NRSkpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVkFSX1VTRVJfSE9NRSwgUFJPUF9VU0VSX0hPTUUpOwotCQkJbG9jYXRpb24gPSBuZXcgUGF0aChiYXNlKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBlbHNlIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKFZBUl9VU0VSX0RJUikpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVkFSX1VTRVJfRElSLCBQUk9QX1VTRVJfRElSKTsKLQkJCWxvY2F0aW9uID0gbmV3IFBhdGgoYmFzZSkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRpb24uc3RhcnRzV2l0aChWQVJfQ09ORklHX0RJUikpIHsKLQkJCS8vbm90ZSB0aGUgY29uZmlnIGRpciBzeXN0ZW0gcHJvcGVydHkgaXMgYWxyZWFkeSBhIFVSTAotCQkJbG9jYXRpb24gPSBzdWJzdGl0dXRlVmFyKGxvY2F0aW9uLCBWQVJfQ09ORklHX0RJUiwgUFJPUF9DT05GSUdfRElSKTsKLQkJfQotCQlVUkwgdXJsID0gYnVpbGRVUkwobG9jYXRpb24sIGFkZFRyYWlsaW5nU2xhc2gpOwotCQlCYXNpY0xvY2F0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IEJhc2ljTG9jYXRpb24ocHJvcGVydHksIG51bGwsIHJlYWRPbmx5KTsKLQkJCXJlc3VsdC5zZXQodXJsLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGdldExvZ1RyYWNrZXIoKSB7Ci0JCWlmIChsb2dUcmFja2VyICE9IG51bGwpCi0JCQlyZXR1cm4gbG9nVHJhY2tlcjsKLQkJLy9sYXp5IGluaXQgaWYgdGhlIGJ1bmRsZSBoYXMgYmVlbiBzdGFydGVkCi0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbG9nVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBGcmFtZXdvcmtMb2cuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJbG9nVHJhY2tlci5vcGVuKCk7Ci0JCXJldHVybiBsb2dUcmFja2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gYUNvbnRleHQ7Ci0JCVVSTCBkZWZhdWx0TG9jYXRpb24gPSBuZXcgVVJMKGFDb250ZXh0LmdldFByb3BlcnR5KFBST1BfQ09ORklHX0RJUikgKyBERUZBVUxUX0FHRU5UX0xPQ0FUSU9OICsgJy8nKTsKLQkJYWdlbnREYXRhTG9jYXRpb24gPSBidWlsZExvY2F0aW9uKFBST1BfQUdFTlRfREFUQV9BUkVBLCBkZWZhdWx0TG9jYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJRGljdGlvbmFyeSBsb2NhdGlvblByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWlmIChkZWZhdWx0TG9jYXRpb24gIT0gbnVsbCkgewotCQkJbG9jYXRpb25Qcm9wZXJ0aWVzLnB1dCgidHlwZSIsIFBST1BfQUdFTlRfREFUQV9BUkVBKTsgLy8kTk9OLU5MUy0xJAotCQkJYWdlbnRMb2NhdGlvblJlZ2lzdHJhdGlvbiA9IGFDb250ZXh0LnJlZ2lzdGVyU2VydmljZShBZ2VudExvY2F0aW9uLlNFUlZJQ0VfTkFNRSwgYWdlbnREYXRhTG9jYXRpb24sIGxvY2F0aW9uUHJvcGVydGllcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCWlmIChhZ2VudExvY2F0aW9uUmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQlhZ2VudExvY2F0aW9uUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJaWYgKGxvZ1RyYWNrZXIgIT0gbnVsbCkgewotCQkJbG9nVHJhY2tlci5jbG9zZSgpOwotCQkJbG9nVHJhY2tlciA9IG51bGw7Ci0JCX0KLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvQmFzaWNMb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9CYXNpY0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWEzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9CYXNpY0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljTG9jYXRpb24gaW1wbGVtZW50cyBBZ2VudExvY2F0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrTG9ja2VyIGltcGxlbWVudHMgTG9ja2VyIHsKLQkJcHVibGljIGJvb2xlYW4gbG9jaygpIHsKLQkJCS8vIGxvY2tpbmcgYWx3YXlzIHN1Y2Nlc3NmdWwKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gcmVsZWFzZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0JcHJpdmF0ZSBVUkwgbG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgTG9jYXRpb24gcGFyZW50OwotCXByaXZhdGUgVVJMIGRlZmF1bHRWYWx1ZTsKLQotCS8vIGxvY2tpbmcgcmVsYXRlZCBmaWVsZHMKLQlwcml2YXRlIEZpbGUgbG9ja0ZpbGU7Ci0JcHJpdmF0ZSBMb2NrZXIgbG9ja2VyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfT1NHSV9MT0NLSU5HID0gIm9zZ2kubG9ja2luZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUc7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUnVubmluZ1dpdGhOaW8oKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzcy5mb3JOYW1lKCJqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jayIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTG9ja2VyIGNyZWF0ZUxvY2tlcihGaWxlIGxvY2ssIFN0cmluZyBsb2NrTW9kZSkgewotCQlpZiAobG9ja01vZGUgPT0gbnVsbCkKLQkJCWxvY2tNb2RlID0gQWN0aXZhdG9yLmNvbnRleHQuZ2V0UHJvcGVydHkoUFJPUF9PU0dJX0xPQ0tJTkcpOwotCi0JCWlmICgibm9uZSIuZXF1YWxzKGxvY2tNb2RlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBNb2NrTG9ja2VyKCk7Ci0KLQkJaWYgKCJqYXZhLmlvIi5lcXVhbHMobG9ja01vZGUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IExvY2tlcl9KYXZhSW8obG9jayk7Ci0KLQkJaWYgKCJqYXZhLm5pbyIuZXF1YWxzKGxvY2tNb2RlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaXNSdW5uaW5nV2l0aE5pbygpKQotCQkJCXJldHVybiBuZXcgTG9ja2VyX0phdmFOaW8obG9jayk7Ci0JCQllbHNlCi0JCQkJLy8gVE9ETyBzaG91bGQgd2UgcmV0dXJuIG51bGwgaGVyZS4gIE5JTyB3YXMgcmVxdWVzdGVkIGJ1dCB3ZSBjb3VsZCBub3QgZG8gaXQuLi4KLQkJCQlyZXR1cm4gbmV3IExvY2tlcl9KYXZhSW8obG9jayk7Ci0JCX0KLQotCQkvLwlCYWNrdXAgY2FzZSBpZiBhbiBpbnZhbGlkIHZhbHVlIGhhcyBiZWVuIHNwZWNpZmllZAotCQlpZiAoaXNSdW5uaW5nV2l0aE5pbygpKQotCQkJcmV0dXJuIG5ldyBMb2NrZXJfSmF2YU5pbyhsb2NrKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBMb2NrZXJfSmF2YUlvKGxvY2spOwotCX0KLQotCXB1YmxpYyBCYXNpY0xvY2F0aW9uKFN0cmluZyBwcm9wZXJ0eSwgVVJMIGRlZmF1bHRWYWx1ZSwgYm9vbGVhbiBpc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFsbG93c0RlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWUgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBMb2NhdGlvbiBnZXRQYXJlbnRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFVSTCBnZXRVUkwoKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPSBudWxsKQotCQkJc2V0VVJMKGRlZmF1bHRWYWx1ZSwgZmFsc2UpOwotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2V0KCkgewotCQlyZXR1cm4gbG9jYXRpb24gIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRVUkwoVVJMIHZhbHVlLCBib29sZWFuIGxvY2spIHsKLQkJLy8JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkvLwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuRUNMSVBTRV9DQU5OT1RfQ0hBTkdFX0xPQ0FUSU9OKTsKLQkJLy8vLwkJRmlsZSBmaWxlID0gbnVsbDsKLQkJLy8vLwkJaWYgKHZhbHVlLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8vLwkJCXRyeSB7Ci0JCS8vLy8JCQkJU3RyaW5nIGJhc2VQYXRoID0gbmV3IEZpbGUodmFsdWUuZ2V0RmlsZSgpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCS8vLy8JCQkJdmFsdWUgPSBuZXcgVVJMKCJmaWxlOiIgKyBiYXNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8vLwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8vLwkJCQkvLyBkbyBub3RoaW5nIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCB2YWx1ZQotCQkvLy8vCQkJfQotCQkvLy8vCQkJZmlsZSA9IG5ldyBGaWxlKHZhbHVlLmdldEZpbGUoKSwgTE9DS19GSUxFTkFNRSk7Ci0JCS8vLy8JCX0KLQkJLy8JCWxvY2sgPSBsb2NrICYmICFpc1JlYWRPbmx5OwotCQkvLwkJaWYgKGxvY2spIHsKLQkJLy8JCQl0cnkgewotCQkvLwkJCQlpZiAoIWxvY2soZmlsZSkpCi0JCS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLwkJCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLwkJbG9ja0ZpbGUgPSBmaWxlOwotCQlsb2NhdGlvbiA9IHZhbHVlOwotCQkvLwkJTG9jYXRpb25NYW5hZ2VyLmJ1aWxkVVJMKHZhbHVlLnRvRXh0ZXJuYWxGb3JtKCksIHRydWUpOwotCQkvLwkJaWYgKHByb3BlcnR5ICE9IG51bGwpCi0JCS8vCQkJU3lzdGVtLnNldFByb3BlcnR5KHByb3BlcnR5LCBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJcmV0dXJuIGxvY2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0KFVSTCB2YWx1ZSwgYm9vbGVhbiBsb2NrKSB7Ci0JCWxvY2F0aW9uID0gdmFsdWU7Ci0JCXJldHVybiBsb2NrOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXJlbnQoTG9jYXRpb24gdmFsdWUpIHsKLQkJcGFyZW50ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzU2V0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsb2NrKGxvY2tGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9jayhGaWxlIGxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsb2NrID09IG51bGwgfHwgaXNSZWFkT25seSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGaWxlIHBhcmVudEZpbGUgPSBuZXcgRmlsZShsb2NrLmdldFBhcmVudCgpKTsKLQkJaWYgKCFwYXJlbnRGaWxlLmV4aXN0cygpKQotCQkJaWYgKCFwYXJlbnRGaWxlLm1rZGlycygpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQlzZXRMb2NrZXIobG9jayk7Ci0JCWlmIChsb2NrZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJbG9ja2VkID0gbG9ja2VyLmxvY2soKTsKLQkJCXJldHVybiBsb2NrZWQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoIWxvY2tlZCkKLQkJCQlsb2NrZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExvY2tlcihGaWxlIGxvY2spIHsKLQkJaWYgKGxvY2tlciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbG9ja01vZGUgPSBBY3RpdmF0b3IuY29udGV4dC5nZXRQcm9wZXJ0eShQUk9QX09TR0lfTE9DS0lORyk7Ci0JCWxvY2tlciA9IGNyZWF0ZUxvY2tlcihsb2NrLCBsb2NrTW9kZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChsb2NrZXIgIT0gbnVsbCkKLQkJCWxvY2tlci5yZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRBcnRpZmFjdFJlcG9zaXRvcnlVUkwoKSB7Ci0JCS8vdGhlIGNhY2hlIGlzIGEgY28tbG9jYXRlZCByZXBvc2l0b3J5Ci0JCXJldHVybiBnZXRNZXRhZGF0YVJlcG9zaXRvcnlVUkwoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldE1ldGFkYXRhUmVwb3NpdG9yeVVSTCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERhdGFBcmVhKEFjdGl2YXRvci5JRCksICJjYWNoZS8iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVVJMIGdldERhdGFBcmVhKFN0cmluZyB0b3VjaHBvaW50SWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLCB0b3VjaHBvaW50SWQgKyAnLycpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3NjE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9ja2VyIHsKLQlwdWJsaWMgYm9vbGVhbiBsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YUlvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlcl9KYXZhSW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzMjUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlcl9KYXZhSW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NrZXJfSmF2YUlvIGltcGxlbWVudHMgTG9ja2VyIHsKLQlwcml2YXRlIEZpbGUgbG9ja0ZpbGU7Ci0JcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGxvY2tSQUY7Ci0KLQlwdWJsaWMgTG9ja2VyX0phdmFJbyhGaWxlIGxvY2tGaWxlKSB7Ci0JCXRoaXMubG9ja0ZpbGUgPSBsb2NrRmlsZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vaWYgdGhlIGxvY2sgZmlsZSBhbHJlYWR5IGV4aXN0cywgdHJ5IHRvIGRlbGV0ZSwKLQkJLy9hc3N1bWUgZmFpbHVyZSBtZWFucyBhbm90aGVyIGVjbGlwc2UgaGFzIGl0IG9wZW4KLQkJaWYgKGxvY2tGaWxlLmV4aXN0cygpKQotCQkJbG9ja0ZpbGUuZGVsZXRlKCk7Ci0JCWlmIChsb2NrRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL29wZW4gdGhlIGxvY2sgZmlsZSBzbyBvdGhlciBpbnN0YW5jZXMgY2FuJ3QgY28tZXhpc3QKLQkJbG9ja1JBRiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlLCAicnciKTsgLy8kTk9OLU5MUy0xJAotCQlsb2NrUkFGLndyaXRlQnl0ZSgwKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChsb2NrUkFGICE9IG51bGwpIHsKLQkJCQlsb2NrUkFGLmNsb3NlKCk7Ci0JCQkJbG9ja1JBRiA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZG9uJ3QgY29tcGxhaW4sIHdlJ3JlIG1ha2luZyBhIGJlc3QgZWZmb3J0IHRvIGNsZWFuIHVwCi0JCX0KLQkJaWYgKGxvY2tGaWxlICE9IG51bGwpCi0JCQlsb2NrRmlsZS5kZWxldGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlcl9KYXZhTmlvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0xvY2tlcl9KYXZhTmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGUzZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YU5pby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEludGVybmFsIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgTG9ja2VyX0phdmFOaW8gaW1wbGVtZW50cyBMb2NrZXIgewotCXByaXZhdGUgRmlsZSBsb2NrRmlsZTsKLQlwcml2YXRlIEZpbGVMb2NrIGZpbGVMb2NrOwotCXByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSByYUZpbGU7Ci0KLQlwdWJsaWMgTG9ja2VyX0phdmFOaW8oRmlsZSBsb2NrRmlsZSkgewotCQl0aGlzLmxvY2tGaWxlID0gbG9ja0ZpbGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyYUZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShsb2NrRmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCS8vIEZpeCBmb3IgYnVnIGh0dHA6Ly9idWdzLnN1bi5jb20vdmlld19idWcuZG8/YnVnX2lkPTY2Mjg1NzUgYW5kCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDQ3MzUKLQkJCWZpbGVMb2NrID0gcmFGaWxlLmdldENoYW5uZWwoKS50cnlMb2NrKDAsIDEsIGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkvLyBwcmludCBleGNlcHRpb24gaWYgZGVidWdnaW5nCi0JCQlpZiAoQmFzaWNMb2NhdGlvbi5ERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMubG9jYXRpb25fY2Fubm90TG9jaywgbG9ja0ZpbGUpKTsKLQkJCS8vIHByb2R1Y2UgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UgZm9yIGNsaWVudHMKLQkJCVN0cmluZyBzcGVjaWZpY01lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5sb2NhdGlvbl9jYW5ub3RMb2NrTklPLCBuZXcgT2JqZWN0W10ge2xvY2tGaWxlLCBpb2UuZ2V0TWVzc2FnZSgpLCAiXCItRCIgKyBCYXNpY0xvY2F0aW9uLlBST1BfT1NHSV9MT0NLSU5HICsgIj1ub25lXCIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwZWNpZmljTWVzc2FnZSk7Ci0JCX0KLQkJaWYgKGZpbGVMb2NrICE9IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmFGaWxlLmNsb3NlKCk7Ci0JCXJhRmlsZSA9IG51bGw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZpbGVMb2NrICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZUxvY2sucmVsZWFzZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vZG9uJ3QgY29tcGxhaW4sIHdlJ3JlIG1ha2luZyBhIGJlc3QgZWZmb3J0IHRvIGNsZWFuIHVwCi0JCQl9Ci0JCQlmaWxlTG9jayA9IG51bGw7Ci0JCX0KLQkJaWYgKHJhRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJhRmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vZG9uJ3QgY29tcGxhaW4sIHdlJ3JlIG1ha2luZyBhIGJlc3QgZWZmb3J0IHRvIGNsZWFuIHVwCi0JCQl9Ci0JCQlyYUZpbGUgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTExMGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9DQU5OT1RfQ0hBTkdFX0xPQ0FUSU9OID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlcwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25fY2Fubm90TG9jazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbl9jYW5ub3RMb2NrTklPOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvUHJvdmlzaW9uaW5nRXZlbnRCdXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvUHJvdmlzaW9uaW5nRXZlbnRCdXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmZjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1Byb3Zpc2lvbmluZ0V2ZW50QnVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyLio7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIElQcm92aXNpb25pbmdFdmVudEJ1c30gc2VydmljZS4KLSAqLwotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ0V2ZW50QnVzIGltcGxlbWVudHMgRXZlbnREaXNwYXRjaGVyLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgewotCXByaXZhdGUgRXZlbnRMaXN0ZW5lcnMgc3luY0xpc3RlbmVycyA9IG5ldyBFdmVudExpc3RlbmVycygpOwotCXByaXZhdGUgRXZlbnRMaXN0ZW5lcnMgYXN5bmNMaXN0ZW5lcnMgPSBuZXcgRXZlbnRMaXN0ZW5lcnMoKTsKLQlwcml2YXRlIEV2ZW50TWFuYWdlciBldmVudE1hbmFnZXIgPSBuZXcgRXZlbnRNYW5hZ2VyKCJQcm92aXNpb25pbmcgRXZlbnQgRGlzcGF0Y2hlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5Qcm92aXNpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihQcm92aXNpb25pbmdMaXN0ZW5lciB0b0FkZCkgewotCQlpZiAodG9BZGQgaW5zdGFuY2VvZiBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHN5bmNMaXN0ZW5lcnMpIHsKLQkJCQlzeW5jTGlzdGVuZXJzLmFkZExpc3RlbmVyKHRvQWRkLCB0b0FkZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jTGlzdGVuZXJzKSB7Ci0JCQkJYXN5bmNMaXN0ZW5lcnMuYWRkTGlzdGVuZXIodG9BZGQsIHRvQWRkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXMjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlByb3Zpc2lvbmluZ0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKFByb3Zpc2lvbmluZ0xpc3RlbmVyIHRvUmVtb3ZlKSB7Ci0JCWlmICh0b1JlbW92ZSBpbnN0YW5jZW9mIFN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIpIHsKLQkJCXN5bmNocm9uaXplZCAoc3luY0xpc3RlbmVycykgewotCQkJCWlmIChzeW5jTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJc3luY0xpc3RlbmVycy5yZW1vdmVMaXN0ZW5lcih0b1JlbW92ZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3luY2hyb25pemVkIChhc3luY0xpc3RlbmVycykgewotCQkJCWlmIChhc3luY0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWFzeW5jTGlzdGVuZXJzLnJlbW92ZUxpc3RlbmVyKHRvUmVtb3ZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI3B1Ymxpc2hFdmVudChqYXZhLnV0aWwuRXZlbnRPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaEV2ZW50KEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCS8qIHF1ZXVlIHRvIGhvbGQgc2V0IG9mIGxpc3RlbmVycyAqLwotCQlMaXN0ZW5lclF1ZXVlIGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lclF1ZXVlKGV2ZW50TWFuYWdlcik7Ci0KLQkJLyogc3luY2hyb25pemUgd2hpbGUgYnVpbGRpbmcgdGhlIGxpc3RlbmVyIGxpc3QgKi8KLQkJc3luY2hyb25pemVkIChzeW5jTGlzdGVuZXJzKSB7Ci0JCQkvKiBhZGQgc2V0IG9mIEJ1bmRsZUNvbnRleHRzIHcvIGxpc3RlbmVycyB0byBxdWV1ZSAqLwotCQkJbGlzdGVuZXJzLnF1ZXVlTGlzdGVuZXJzKHN5bmNMaXN0ZW5lcnMsIHRoaXMpOwotCQkJLyogc3luY2hyb25vdXNseSBkaXNwYXRjaCB0byBwb3B1bGF0ZSBsaXN0ZW5lcnMgcXVldWUgKi8KLQkJCWxpc3RlbmVycy5kaXNwYXRjaEV2ZW50U3luY2hyb25vdXMoMCwgZXZlbnQpOwotCQl9Ci0KLQkJbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyUXVldWUoZXZlbnRNYW5hZ2VyKTsKLQkJc3luY2hyb25pemVkIChhc3luY0xpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnF1ZXVlTGlzdGVuZXJzKGFzeW5jTGlzdGVuZXJzLCB0aGlzKTsKLQkJCWxpc3RlbmVycy5kaXNwYXRjaEV2ZW50QXN5bmNocm9ub3VzKDAsIGV2ZW50KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXMjZGlzcGF0Y2hFdmVudChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGF0Y2hFdmVudChPYmplY3QgZXZlbnRMaXN0ZW5lciwgT2JqZWN0IGxpc3RlbmVyT2JqZWN0LCBpbnQgZXZlbnRBY3Rpb24sIE9iamVjdCBldmVudE9iamVjdCkgewotCQl0cnkgewotCQkJKChQcm92aXNpb25pbmdMaXN0ZW5lcikgZXZlbnRMaXN0ZW5lcikubm90aWZ5KChFdmVudE9iamVjdCkgZXZlbnRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vVE9ETyBOZWVkIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBsb2dnaW5nCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJZXZlbnRNYW5hZ2VyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9TdHJpbmdQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1N0cmluZ1Bvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMmIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1N0cmluZ1Bvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBIHN0cmluZyBwb29sIGlzIHVzZWQgZm9yIHNoYXJpbmcgc3RyaW5ncyBpbiBhIHdheSB0aGF0IGVsaW1pbmF0ZXMgZHVwbGljYXRlCi0gKiBlcXVhbCBzdHJpbmdzLiAgQSBzdHJpbmcgcG9vbCBpbnN0YW5jZSBjYW4gYmUgbWFpbnRhaW5lZCBvdmVyIGEgbG9uZyBwZXJpb2QKLSAqIG9mIHRpbWUsIG9yIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RydWN0dXJlIGR1cmluZyBhIHN0cmluZyBzaGFyaW5nIHBhc3Mgb3ZlcgotICogYSBkYXRhIHN0cnVjdHVyZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nUG9vbCB7Ci0JcHJpdmF0ZSBpbnQgc2F2aW5nczsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIHBvb2wuCi0JICovCi0JcHVibGljIFN0cmluZ1Bvb2woKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdGhlIHBvb2wuICBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSAqIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50IGJ1dCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhpcyBwb29sLgotCSAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHBvb2wKLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRkKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIHN0cmluZzsKLQkJT2JqZWN0IHJlc3VsdCA9IG1hcC5nZXQoc3RyaW5nKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlpZiAocmVzdWx0ICE9IHN0cmluZykKLQkJCQlzYXZpbmdzICs9IDQ0ICsgMiAqIHN0cmluZy5sZW5ndGgoKTsKLQkJCXJldHVybiAoU3RyaW5nKSByZXN1bHQ7Ci0JCX0KLQkJbWFwLnB1dChzdHJpbmcsIHN0cmluZyk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgc2l6ZSBpbiBieXRlcyB0aGF0IHdhcyBzYXZlZCBieSBzaGFyaW5nIHN0cmluZ3MgaW4gCi0JICogdGhlIHBvb2wuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHJldHVybnMgdGhlIHNpemUgb2YgYWxsIHN0cmluZ3MgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZQotCSAqIHBvb2wgYWZ0ZXIgYW4gZXF1YWwgc3RyaW5nIGhhZCBhbHJlYWR5IGJlZW4gYWRkZWQuICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkCi0JICogdG8gZXN0aW1hdGUgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgYSBzdHJpbmcgc2hhcmluZyBvcGVyYXRpb24sIGluIG9yZGVyIHRvIAotCSAqIGRldGVybWluZSBpZiBvciB3aGVuIGl0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWdhaW4uCi0JICogCi0JICogSW4gc29tZSBjYXNlcyB0aGlzIGRvZXMgbm90IHByZWNpc2VseSByZXByZXNlbnQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IAotCSAqIHdlcmUgc2F2ZWQuICBGb3IgZXhhbXBsZSwgc2F5IHRoZSBwb29sIGFscmVhZHkgY29udGFpbnMgc3RyaW5nIFMxLiAgTm93IAotCSAqIHN0cmluZyBTMiwgd2hpY2ggaXMgZXF1YWwgdG8gUzEgYnV0IG5vdCBpZGVudGljYWwsIGlzIGFkZGVkIHRvIHRoZSBwb29sIGZpdmUgCi0JICogdGltZXMuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHN0cmluZyBTMiBtdWx0aXBsaWVkIGJ5IHRoZSAKLQkgKiBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGFkZGVkLCBldmVuIHRob3VnaCB0aGUgYWN0dWFsIHNhdmluZ3MgaW4gdGhpcyBjYXNlCi0JICogaXMgb25seSB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBjb3B5IG9mIFMyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2F2ZWRTdHJpbmdDb3VudCgpIHsKLQkJcmV0dXJuIHNhdmluZ3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0ZpbGVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkzMDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHMgewotCi0JLyoqCi0JICogVW56aXAgZnJvbSBhIEZpbGUgdG8gYW4gb3V0cHV0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVbXSB1bnppcEZpbGUoRmlsZSB6aXBGaWxlLCBGaWxlIG91dHB1dERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHVuemlwU3RyZWFtKGluLCB6aXBGaWxlLmxlbmd0aCgpLCBvdXRwdXREaXIsIG51bGwsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBhZGQgdGhlIGZpbGUgbmFtZSB0byB0aGUgbWVzc2FnZQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlV0aWxfRXJyb3JfVW56aXBwaW5nLCB6aXBGaWxlLCBlLmdldE1lc3NhZ2UoKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVuemlwIGZyb20gYSBGaWxlIHRvIGFuIG91dHB1dCBkaXJlY3RvcnksIHdpdGggcHJvZ3Jlc3MgaW5kaWNhdGlvbi4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIHVuemlwRmlsZShGaWxlIHppcEZpbGUsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHVuemlwU3RyZWFtKGluLCB6aXBGaWxlLmxlbmd0aCgpLCBvdXRwdXREaXIsIHRhc2tOYW1lLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gYWRkIHRoZSBmaWxlIG5hbWUgdG8gdGhlIG1lc3NhZ2UKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5VdGlsX0Vycm9yX1VuemlwcGluZywgemlwRmlsZSwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCBmcm9tIGEgVVJMIHRvIGFuIG91dHB1dCBkaXJlY3RvcnksIHdpdGggcHJvZ3Jlc3MgaW5kaWNhdGlvbi4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIHVuemlwVVJMKFVSTCB6aXBVUkwsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSB6aXBVUkwub3BlbkNvbm5lY3Rpb24oKS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUlucHV0U3RyZWFtIGluID0gemlwVVJMLm9wZW5TdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXJldHVybiB1bnppcFN0cmVhbShpbiwgc2l6ZSwgb3V0cHV0RGlyLCB0YXNrTmFtZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGFkZCB0aGUgVVJMIHRvIHRoZSBtZXNzYWdlCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuVXRpbF9FcnJvcl9VbnppcHBpbmcsIHppcFVSTCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCBmcm9tIGFuIElucHV0U3RyZWFtIHRvIGFuIG91dHB1dCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlW10gdW56aXBTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBsb25nIHNpemUsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBtb25pdG9yID09IG51bGwgPyBzdHJlYW0gOiBzdHJlYW07IC8vIG5ldyBQcm9ncmVzc01vbml0b3JJbnB1dFN0cmVhbShzdHJlYW0sIHNpemUsIHNpemUsIHRhc2tOYW1lLCBtb25pdG9yKTsgVE9ETyBDb21tZW50ZWQgY29kZQotCQlaaXBJbnB1dFN0cmVhbSBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcykpOwotCQlaaXBFbnRyeSB6ZSA9IGluLmdldE5leHRFbnRyeSgpOwotCQlpZiAoemUgPT0gbnVsbCkgewotCQkJLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZW50cnkgaW4gYSB6aXAgZmlsZS4KLQkJCS8vIFdoZW4gdGhlcmUgaXNuJ3QgZ2V0TmV4dEVudHJ5IHJldHVybnMgbnVsbC4KLQkJCWluLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuVXRpbF9JbnZhbGlkX1ppcF9GaWxlX0Zvcm1hdCk7Ci0JCX0KLQkJQXJyYXlMaXN0IHVuemlwcGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRvIHsKLQkJCUZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciwgemUuZ2V0TmFtZSgpKTsKLQkJCXVuemlwcGVkRmlsZXMuYWRkKG91dEZpbGUpOwotCQkJaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlvdXRGaWxlLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob3V0RmlsZS5leGlzdHMoKSkgewotCQkJCQlvdXRGaWxlLmRlbGV0ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQljb3B5U3RyZWFtKGluLCBmYWxzZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSksIHRydWUpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRFTVA6IGlnbm9yZSB0aGlzIGZvciBub3cgaW4gY2FzZSB3ZSdyZSB0cnlpbmcgdG8gcmVwbGFjZQotCQkJCQkvLyBhIHJ1bm5pbmcgZWNsaXBzZS5leGUKLQkJCQl9Ci0JCQkJb3V0RmlsZS5zZXRMYXN0TW9kaWZpZWQoemUuZ2V0VGltZSgpKTsKLQkJCX0KLQkJCWluLmNsb3NlRW50cnkoKTsKLQkJfSB3aGlsZSAoKHplID0gaW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpOwotCQlpbi5jbG9zZSgpOwotCi0JCXJldHVybiAoRmlsZVtdKSB1bnppcHBlZEZpbGVzLnRvQXJyYXkobmV3IEZpbGVbdW56aXBwZWRGaWxlcy5zaXplKCldKTsKLQl9Ci0KLQkvLyBEZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMgdW5kZXIgZGlyLCBpbmNsdWRpbmcgZGlyIGl0c2VsZi4KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRW1wdHlEaXJzKEZpbGUgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSArPSAxKSB7Ci0JCQkJZGVsZXRlRW1wdHlEaXJzKGZpbGVzW2ldKTsKLQkJCX0KLQkJCWRpci5nZXRDYW5vbmljYWxGaWxlKCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQkvLyBEZWxldGUgdGhlIGdpdmVuIGZpbGUgd2hldGhlciBpdCBpcyBhIGZpbGUgb3IgYSBkaXJlY3RvcnkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotCQkJCQlkZWxldGVBbGwoZmlsZXNbaV0pOwotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbiBpbnB1dCBzdHJlYW0gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiBPcHRpb25hbGx5IGNsb3NlIHRoZSBzdHJlYW1zIHdoZW4gZG9uZS4KLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvcHlTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gY2xvc2VJbiwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBjbG9zZU91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWludCB3cml0dGVuID0gMDsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxNiAqIDEwMjRdOwotCQkJaW50IGxlbjsKLQkJCXdoaWxlICgobGVuID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0JCQkJd3JpdHRlbiArPSBsZW47Ci0JCQl9Ci0JCQlyZXR1cm4gd3JpdHRlbjsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNsb3NlSW4pIHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbG9zZU91dCkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgemlwKEZpbGVbXSBzb3VyY2VGaWxlcywgRmlsZSBkZXN0aW5hdGlvbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXppcChzb3VyY2VGaWxlcywgZGVzdGluYXRpb25BcmNoaXZlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgemlwKEZpbGVbXSBzb3VyY2VGaWxlcywgRmlsZSBkZXN0aW5hdGlvbkFyY2hpdmUsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uQXJjaGl2ZSkpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoc291cmNlRmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJemlwRGlyKG91dHB1dCwgc291cmNlRmlsZXNbaV0sIGluY2x1ZGVSb290ID8gbmV3IFBhdGgoc291cmNlRmlsZXNbaV0uZ2V0TmFtZSgpKSA6IG5ldyBQYXRoKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXppcEZpbGUob3V0cHV0LCBzb3VyY2VGaWxlc1tpXSwgbmV3IFBhdGgoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCS8vIE5vdGUhIFRoaXMgY2FsbCB3aWxsIGZhaWwgbWlzZXJhYmx5IGlmIG5vIGVudHJpZXMgd2VyZSBhZGRlZCB0byB0aGUgemlwIQotCQkJCS8vIFRoZSBmaWxlIGlzIGxlZnQgb3BlbiBhZnRlciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBaaXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkgaW50byB0aGUgemlwIGZpbGUgcmVwcmVzZW50ZWQgYnkKLQkgKiB0aGUgZ2l2ZW4gemlwIHN0cmVhbS4gUHJlcGVuZCB0aGUgZ2l2ZW4gcHJlZml4IHRvIHRoZSBmaWxlIHBhdGhzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgemlwRGlyKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgc291cmNlLCBJUGF0aCBwcmVmaXgpIHsKLQkJRmlsZVtdIGZpbGVzID0gc291cmNlLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkKLQkJCQkJemlwRmlsZShvdXRwdXQsIGZpbGVzW2ldLCBwcmVmaXgpOwotCQkJCWVsc2UKLQkJCQkJemlwRGlyKG91dHB1dCwgZmlsZXNbaV0sIHByZWZpeC5hcHBlbmQoZmlsZXNbaV0uZ2V0TmFtZSgpKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQWRkIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSB6aXAgZmlsZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBQcmVwZW5kIHRoZSBnaXZlbiBwcmVmaXggdG8gdGhlIHBhdGggb2YgdGhlIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB6aXBGaWxlKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgc291cmNlRmlsZSwgSVBhdGggcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSk7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShwcmVmaXguYXBwZW5kKHNvdXJjZUZpbGUuZ2V0TmFtZSgpKS50b1N0cmluZygpKTsKLQkJCXppcEVudHJ5LnNldFRpbWUoc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCQlvdXRwdXQucHV0TmV4dEVudHJ5KHppcEVudHJ5KTsKLQkJCWNvcHlTdHJlYW0oaW5wdXQsIHRydWUsIG91dHB1dCwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlvdXRwdXQuY2xvc2VFbnRyeSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0hlYWRlcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9IZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjJmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0hlYWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLS8qKgotICogSGVhZGVycyBjbGFzc2VzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBEaWN0aW9uYXJ5IHRoYXQgaGFzCi0gKiB0aGUgZm9sbG93aW5nIGJlaGF2aW91cjoKLSAqIDx1bD4KLSAqIDxsaT5wdXQgYW5kIHJlbW92ZSBjbGVhciB0aHJvdyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLSAqIFRoZSBEaWN0aW9uYXJ5IGlzIHRodXMgcmVhZC1vbmx5IHRvIG90aGVycy4KLSAqIDxsaT5UaGUgU3RyaW5nIGtleXMgaW4gdGhlIERpY3Rpb25hcnkgYXJlIGNhc2UtcHJlc2VydmVkLAotICogYnV0IHRoZSBnZXQgb3BlcmF0aW9uIGlzIGNhc2UtaW5zZW5zaXRpdmUuCi0gKiA8L3VsPgotICogVE9ETzogVGhpcyBjbGFzcyBpcyBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5vc2dpIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zLiBXZQotICogY2FuJ3QgbWFrZSB0aGlzIEFQSSBzbyB3ZSBuZWVkIHRvIGZpbmQgYSBwbGFjZSBmb3IgaXQuCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkZXJzIGV4dGVuZHMgRGljdGlvbmFyeSBpbXBsZW1lbnRzIE1hcCB7Ci0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBPYmplY3RbXSBoZWFkZXJzOwotCXByaXZhdGUgT2JqZWN0W10gdmFsdWVzOwotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVtcHR5IEhlYWRlcnMgZGljdGlvbmFyeS4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgVGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyBIZWFkZXJzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSGVhZGVycyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JCWhlYWRlcnMgPSBuZXcgT2JqZWN0W2luaXRpYWxDYXBhY2l0eV07Ci0JCXZhbHVlcyA9IG5ldyBPYmplY3RbaW5pdGlhbENhcGFjaXR5XTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBIZWFkZXJzIGRpY3Rpb25hcnkgZnJvbSBhIERpY3Rpb25hcnkuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWVzIFRoZSBpbml0aWFsIGRpY3Rpb25hcnkgZm9yIHRoaXMgSGVhZGVycyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGluIHRoZSBkaWN0aW9uYXJ5IHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgSGVhZGVycyhEaWN0aW9uYXJ5IHZhbHVlcykgewotCQl0aGlzKHZhbHVlcy5zaXplKCkpOwotCQkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzIGFuZCB2YWx1ZXMgKi8KLQkJRW51bWVyYXRpb24ga2V5cyA9IHZhbHVlcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJc2V0KGtleSwgdmFsdWVzLmdldChrZXkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhc2UtcHJlc2VydmVkIGtleXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBFbnVtZXJhdGlvbiBrZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5RW51bWVyYXRpb24oaGVhZGVycywgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogVmFsdWVzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlFbnVtZXJhdGlvbih2YWx1ZXMsIHNpemUpOwotCX0KLQotCXByaXZhdGUgaW50IGdldEluZGV4KE9iamVjdCBrZXkpIHsKLQkJYm9vbGVhbiBzdHJpbmdLZXkgPSBrZXkgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc3RyaW5nS2V5ICYmIChoZWFkZXJzW2ldIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCWlmICgoKFN0cmluZykgaGVhZGVyc1tpXSkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBrZXkpKQotCQkJCQlyZXR1cm4gaTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhlYWRlcnNbaV0uZXF1YWxzKGtleSkpCi0JCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZW1vdmUoaW50IHJlbW92ZSkgewotCQlPYmplY3QgcmVtb3ZlZCA9IHZhbHVlc1tyZW1vdmVdOwotCQlmb3IgKGludCBpID0gcmVtb3ZlOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaSA9PSBoZWFkZXJzLmxlbmd0aCAtIDEpIHsKLQkJCQloZWFkZXJzW2ldID0gbnVsbDsKLQkJCQl2YWx1ZXNbaV0gPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQloZWFkZXJzW2ldID0gaGVhZGVyc1tpICsgMV07Ci0JCQkJdmFsdWVzW2ldID0gdmFsdWVzW2kgKyAxXTsKLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlIDwgc2l6ZSkKLQkJCXNpemUtLTsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3QgaGVhZGVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gaGVhZGVycy5sZW5ndGgpIHsKLQkJCS8vIGdyb3cgdGhlIGFycmF5cwotCQkJT2JqZWN0W10gbmV3SGVhZGVycyA9IG5ldyBPYmplY3RbaGVhZGVycy5sZW5ndGggKyAxMF07Ci0JCQlPYmplY3RbXSBuZXdWYWx1ZXMgPSBuZXcgT2JqZWN0W3ZhbHVlcy5sZW5ndGggKyAxMF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlcnMsIDAsIG5ld0hlYWRlcnMsIDAsIGhlYWRlcnMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOwotCQkJaGVhZGVycyA9IG5ld0hlYWRlcnM7Ci0JCQl2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0JCX0KLQkJaGVhZGVyc1tzaXplXSA9IGhlYWRlcjsKLQkJdmFsdWVzW3NpemVdID0gdmFsdWU7Ci0JCXNpemUrKzsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGNhc2UtaW5zZW5zaXRpdml0eSBmb3Iga2V5cy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCQlpbnQgaSA9IC0xOwotCQlpZiAoKGkgPSBnZXRJbmRleChrZXkpKSAhPSAtMSkKLQkJCXJldHVybiB2YWx1ZXNbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCBhIGhlYWRlciB2YWx1ZSBvciBvcHRpb25hbGx5IHJlcGxhY2UgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0ga2V5IEtleSBuYW1lLgotCSAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUga2V5IG9yIG51bGwgdG8gcmVtb3ZlIGtleS4KLQkgKiBAcGFyYW0gcmVwbGFjZSBBIHZhbHVlIG9mIHRydWUgd2lsbCBhbGxvdyBhIHByZXZpb3VzCi0JICogdmFsdWUgb2YgdGhlIGtleSB0byBiZSByZXBsYWNlZC4gIEEgdmFsdWUgb2YgZmFsc2UgCi0JICogd2lsbCBjYXVzZSBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdG8gYmUgdGhyb3duIAotCSAqIGlmIGEgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGtleSBleGlzdHMuCi0JICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgdG8gd2hpY2ggdGhlIGtleSB3YXMgbWFwcGVkLAotCSAqIG9yIG51bGwgaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBwcmV2aW91cyBtYXBwaW5nLgotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGFscmVhZHkgcHJlc2VudC4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiByZXBsYWNlKSB7Ci0JCWlmIChyZWFkT25seSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJa2V5ID0gKChTdHJpbmcpIGtleSkuaW50ZXJuKCk7Ci0JCWludCBpID0gZ2V0SW5kZXgoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsgLyogcmVtb3ZlICovCi0JCQlpZiAoaSAhPSAtMSkKLQkJCQlyZXR1cm4gcmVtb3ZlKGkpOwotCQl9IGVsc2UgeyAvKiBwdXQgKi8KLQkJCWlmIChpICE9IC0xKSB7IC8qIGR1cGxpY2F0ZSBrZXkgKi8KLQkJCQlpZiAoIXJlcGxhY2UpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhFQURFUl9EVVBMSUNBVEVfS0VZX0VYQ0VQVElPTjogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPYmplY3Qgb2xkVmFsID0gdmFsdWVzW2ldOwotCQkJCXZhbHVlc1tpXSA9IHZhbHVlOwotCQkJCXJldHVybiBvbGRWYWw7Ci0JCQl9Ci0JCQlhZGQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgaGVhZGVyIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGtleSBLZXkgbmFtZS4KLQkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIGtleSBvciBudWxsIHRvIHJlbW92ZSBrZXkuCi0JICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgdG8gd2hpY2ggdGhlIGtleSB3YXMgbWFwcGVkLAotCSAqIG9yIG51bGwgaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBwcmV2aW91cyBtYXBwaW5nLgotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGFscmVhZHkgcHJlc2VudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBzZXQoa2V5LCB2YWx1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWFkT25seSgpIHsKLQkJcmVhZE9ubHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIChkaXN0aW5jdCBrZXlzKSBpbiB0aGlzIGRpY3Rpb25hcnkuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgbnVtYmVyIG9mIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoaXMgZGljdGlvbmFyeSBtYXBzIG5vIGtleXMgdG8gdmFsdWUuIFRoZSBnZW5lcmFsIGNvbnRyYWN0Ci0JICogZm9yIHRoZSA8dHQ+aXNFbXB0eTwvdHQ+IG1ldGhvZCBpcyB0aGF0IHRoZSByZXN1bHQgaXMgdHJ1ZSBpZiBhbmQgb25seQotCSAqIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBlbnRyaWVzLgotCSAqCi0JICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBkaWN0aW9uYXJ5IG1hcHMgbm8ga2V5cyB0byB2YWx1ZXM7Ci0JICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGtleSBoZWFkZXIgbmFtZS4KLQkgKiBAcGFyYW0gdmFsdWUgaGVhZGVyIHZhbHVlLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZWFkT25seSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gc2V0KGtleSwgdmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0ga2V5IGhlYWRlciBuYW1lLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAodmFsdWVzLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSGVhZGVycyBwYXJzZU1hbmlmZXN0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJSGVhZGVycyBoZWFkZXJzID0gbmV3IEhlYWRlcnMoMTApOwotCQl0cnkgewotCQkJTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW4sIGhlYWRlcnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGJ1bmRsZSBtYW5pZmVzdCIsIGUpOwotCQl9Ci0JCWhlYWRlcnMuc2V0UmVhZE9ubHkoKTsKLQkJcmV0dXJuIGhlYWRlcnM7Ci0JfQotCi0JY2xhc3MgQXJyYXlFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQkJcHJpdmF0ZSBPYmplY3RbXSBhcnJheTsKLQkJaW50IGN1ciA9IDA7Ci0KLQkJcHVibGljIEFycmF5RW51bWVyYXRpb24oT2JqZWN0W10gYXJyYXksIGludCBzaXplKSB7Ci0JCQl0aGlzLmFycmF5ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHRoaXMuYXJyYXksIDAsIHRoaXMuYXJyYXkubGVuZ3RoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCXJldHVybiBjdXIgPCBhcnJheS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJcmV0dXJuIGFycmF5W2N1cisrXTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIGdldEluZGV4KGtleSkgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YXIwKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXQga2V5U2V0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHZhcjApIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTG9nSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2ZkNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0xvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nLkZyYW1ld29ya0xvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2dIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlGcmFtZXdvcmtMb2cgbG9nID0gQWN0aXZhdG9yLmdldEZyYW1ld29ya0xvZygpOwotCQlpZiAobG9nICE9IG51bGwpIHsKLQkJCWxvZy5sb2coZ2V0TG9nKHN0YXR1cykpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCXN0YXR1cy5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coUHJvdmlzaW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlsb2cobmV3IFN0YXR1cyhleGNlcHRpb24uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSwgQWN0aXZhdG9yLklELCAiUHJvdmlzaW9uaW5nIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29waWVkIGZyb20gUGxhdGZvcm1Mb2dXcml0ZXIgaW4gY29yZSBydW50aW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZyYW1ld29ya0xvZ0VudHJ5IGdldExvZyhJU3RhdHVzIHN0YXR1cykgewotCQlUaHJvd2FibGUgdCA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJQXJyYXlMaXN0IGNoaWxkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpbnQgc3RhY2tDb2RlID0gdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24gPyAxIDogMDsKLQkJLy8gZW5zdXJlIGEgc3Vic3RhdHVzIGluc2lkZSBhIENvcmVFeGNlcHRpb24gaXMgcHJvcGVybHkgbG9nZ2VkIAotCQlpZiAoc3RhY2tDb2RlID09IDEpIHsKLQkJCUlTdGF0dXMgY29yZVN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoY29yZVN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJY2hpbGRsaXN0LmFkZChnZXRMb2coY29yZVN0YXR1cykpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWNoaWxkbGlzdC5hZGQoZ2V0TG9nKGNoaWxkcmVuW2ldKSk7Ci0JCQl9Ci0JCX0KLQotCQlGcmFtZXdvcmtMb2dFbnRyeVtdIGNoaWxkcmVuID0gKEZyYW1ld29ya0xvZ0VudHJ5W10pIChjaGlsZGxpc3Quc2l6ZSgpID09IDAgPyBudWxsIDogY2hpbGRsaXN0LnRvQXJyYXkobmV3IEZyYW1ld29ya0xvZ0VudHJ5W2NoaWxkbGlzdC5zaXplKCldKSk7Ci0KLQkJcmV0dXJuIG5ldyBGcmFtZXdvcmtMb2dFbnRyeShzdGF0dXMuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGFja0NvZGUsIHQsIGNoaWxkcmVuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjAwYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9JbnZhbGlkX1ppcF9GaWxlX0Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX0Vycm9yX1VuemlwcGluZzsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL09yZGVyZWRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvT3JkZXJlZFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyYzg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvT3JkZXJlZFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIFByb3BlcnRpZXMgY29sbGVjdGlvbiB0aGF0IG1haW50YWlucyB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgcHJvcGVydGllcyBzaW1pbGFyIHRvIHtAbGluayBqYXZhLnV0aWwuUHJvcGVydGllc30uCi0gKiBJbiBwYXJ0aWN1bGFyIGJvdGgga2V5cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIGFuZCBtdXN0IGJlIG5vdCBudWxsLgotICogSG93ZXZlciB0aGlzIGNsYXNzIGlzIHNvbWV3aGF0IHNpbXBsaWZpZWQgYW5kIGRvZXMgbm90IGltcGxlbWVudCBDbG9uZWFibGUsIAotICogU2VyaWFsaXphYmxlIGFuZCBIYXNodGFibGUuCi0gKiA8cD4KLSAqIEluIGNvbnRyYXN0IHRvIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHRoaXMgY2xhc3MgbWFpbnRhaW5zIHRoZSBvcmRlciBieSB3aGljaCAKLSAqIHByb3BlcnRpZXMgYXJlIGFkZGVkLiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEge0BsaW5rIExpbmtlZEhhc2hNYXB9LgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBkZWZhdWx0IHByb3BlcnRpZXMgYXMgdGhleSBjYW4gYmUgZXhwcmVzc2VkIGJ5IAotICogY3JlYXRpbmcgamF2YS51dGlsLlByb3BlcnRpZXMgaGllcmFyY2hpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmVkUHJvcGVydGllcyBleHRlbmRzIERpY3Rpb25hcnkgaW1wbGVtZW50cyBNYXAgewotCi0JTGlua2VkSGFzaE1hcCBwcm9wZXJ0eU1hcCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIE9yZGVyZWRQcm9wZXJ0aWVzIHVubW9kaWZpYWJsZVByb3BlcnRpZXMoTWFwIHByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBPcmRlcmVkUHJvcGVydGllcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT3JkZXJlZFByb3BlcnRpZXMoaW50IHNpemUpIHsKLQkJc3VwZXIoKTsKLQkJcHJvcGVydHlNYXAgPSBuZXcgTGlua2VkSGFzaE1hcChzaXplKTsKLQl9Ci0KLQlwdWJsaWMgT3JkZXJlZFByb3BlcnRpZXMoT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlcigpOwotCQlwcm9wZXJ0eU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKHByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJcHV0QWxsKHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUuCi0JICogPHA+Ci0JICogSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBwcmV2aW91cwotCSAqIHZhbHVlIGlzIHJlcGxhY2VkLiBPdGhlcndpc2UgYSBuZXcgcHJvcGVydHkgaXMgYWRkZWQgYXQKLQkgKiB0aGUgZW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGtleSAgIG11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gdmFsdWUgbXVzdCBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yIDx0dD5udWxsPC90dD4KLQkgKgkgICAgICAgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIGtleS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpbml0KCk7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoU3RyaW5nKSAocHJvcGVydHlNYXAgPT0gbnVsbCA/IG51bGwgOiBwcm9wZXJ0eU1hcC5nZXQoa2V5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0QWxsKE9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJcHV0QWxsKChNYXApIHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqCUluaXRpYWxpemUgdGhlIG1hcC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKHByb3BlcnR5TWFwID09IG51bGwpIHsKLQkJCXByb3BlcnR5TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwID09IG51bGwgPyAwIDogcHJvcGVydHlNYXAuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCA9PSBudWxsID8gdHJ1ZSA6IHByb3BlcnR5TWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCXByb3BlcnR5TWFwID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJaW5pdCgpOwotCQlyZXR1cm4gcHJvcGVydHlNYXAucHV0KGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC5jb250YWluc0tleShrZXkpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC5jb250YWluc1ZhbHVlKHZhbHVlKSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuZW50cnlTZXQoKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuZ2V0KGtleSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBTZXQga2V5U2V0KCkgewotCQlyZXR1cm4gcHJvcGVydHlNYXAgIT0gbnVsbCA/IHByb3BlcnR5TWFwLmtleVNldCgpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgYXJnMCkgewotCQlpbml0KCk7Ci0JCXByb3BlcnR5TWFwLnB1dEFsbChhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAucmVtb3ZlKGtleSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC52YWx1ZXMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBPcmRlcmVkUHJvcGVydGllcykgewotCQkJT3JkZXJlZFByb3BlcnRpZXMgcmhzID0gKE9yZGVyZWRQcm9wZXJ0aWVzKSBvOwotCQkJaWYgKHJocy5wcm9wZXJ0eU1hcCA9PSB0aGlzLnByb3BlcnR5TWFwKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKHJocy5wcm9wZXJ0eU1hcCA9PSBudWxsIHx8IHRoaXMucHJvcGVydHlNYXAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcmhzLnByb3BlcnR5TWFwLmVxdWFscyh0aGlzLnByb3BlcnR5TWFwKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlNYXAuZXF1YWxzKG8pOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuaGFzaENvZGUoKSA6IDA7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQocHJvcGVydHlNYXApOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVsZW1lbnRzRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0KLQkJcHVibGljIEVsZW1lbnRzRW51bShPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCQlpdGVyYXRvciA9IHByb3BlcnRpZXMucHJvcGVydHlNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50c0VudW0odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBLZXlzRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0KLQkJcHVibGljIEtleXNFbnVtKE9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJCWl0ZXJhdG9yID0gcHJvcGVydGllcy5wcm9wZXJ0eU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7Ci0JCXJldHVybiBuZXcgS2V5c0VudW0odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5tb2RpZmlhYmxlUHJvcGVydGllcyBleHRlbmRzIE9yZGVyZWRQcm9wZXJ0aWVzIHsKLQotCQlVbm1vZGlmaWFibGVQcm9wZXJ0aWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCXN1cGVyLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9TZXJ2aWNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDlmYjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9TZXJ2aWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VIZWxwZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2UgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBhcmd1bWVudHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhIGhlbHBlciBjbGFzcwotCSAqIHRoYXQgPGI+aW1tZWRpYXRlbHk8L2I+IHVuZ2V0cyB0aGUgc2VydmljZSByZWZlcmVuY2UuICBUaGlzIHJlc3VsdHMgaW4gYSB3aW5kb3cgd2hlcmUgdGhlCi0JICogc3lzdGVtIHRoaW5rcyB0aGUgc2VydmljZSBpcyBub3QgaW4gdXNlIGJ1dCBpbmRlZWQgdGhlIGNhbGxlciBpcyBhYm91dCB0byB1c2UgdGhlIHJldHVybmVkIAotCSAqIHNlcnZpY2Ugb2JqZWN0LiAgCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCBzZXJ2aWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UobmFtZSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgcmVzdWx0ID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzOwotCQl0cnkgewotCQkJcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZXMobmFtZSwgZmlsdGVyKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsIHx8IHJlZmVyZW5jZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJlc3VsdCA9IGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2VzWzBdKTsKLQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlc1swXSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL1RyYWNpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9UcmFjaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODFkZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL1RyYWNpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7Ci0KLS8qKgotICogTWFuYWdlcyBkZWJ1ZyB0cmFjaW5nIG9wdGlvbnMgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHByaW50aW5nCi0gKiBkZWJ1ZyBzdGF0ZW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2luZyB7Ci0JLy9tYXN0ZXIgcDIgZGVidWcgZmxhZwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLy9kZWJ1ZyBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfUEFSU0VfUFJPQkxFTVMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfR0VORVJBVE9SX1BBUlNJTkcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfSU5TVEFMTF9SRUdJU1RSWSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19NRVRBREFUQV9QQVJTSU5HID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX01JUlJPUlMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCURlYnVnT3B0aW9ucyBvcHRpb25zID0gKERlYnVnT3B0aW9ucykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5jb250ZXh0LCBEZWJ1Z09wdGlvbnMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewotCQkJREVCVUcgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9kZWJ1ZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERFQlVHKSB7Ci0JCQkJREVCVUdfUEFSU0VfUFJPQkxFTVMgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9jb3JlL3BhcnNlcHJvYmxlbXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlERUJVR19HRU5FUkFUT1JfUEFSU0lORyA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihBY3RpdmF0b3IuSUQgKyAiL2dlbmVyYXRvci9wYXJzaW5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJREVCVUdfSU5TVEFMTF9SRUdJU1RSWSA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihBY3RpdmF0b3IuSUQgKyAiL2VuZ2luZS9pbnN0YWxscmVnaXN0cnkiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlERUJVR19NRVRBREFUQV9QQVJTSU5HID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKEFjdGl2YXRvci5JRCArICIvbWV0YWRhdGEvcGFyc2luZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCURFQlVHX01JUlJPUlMgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9hcnRpZmFjdHMvbWlycm9ycyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBvbiBzdGRvdXQuIENhbGxlcnMgc2hvdWxkIGZpcnN0IGVuc3VyZSB0aGVpciBzcGVjaWZpYyAKLQkgKiBkZWJ1ZyBvcHRpb24gaXMgZW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiW3AyXSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAtIFsiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKG1lc3NhZ2UpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9VUkxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvVVJMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzdhZGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9VUkxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgbWFuaXB1bGF0aW5nIFVSTHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxVdGlsIHsKLQkvKgotCSAqIENvbXBhcmVzIHR3byBVUkwgZm9yIGVxdWFsaXR5LgotCSAqIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdGhlbSBpcyBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhbWVVUkwoVVJMIHVybDEsIFVSTCB1cmwyKSB7Ci0JCWlmICh1cmwxID09IHVybDIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHVybDEgPT0gbnVsbCB8fCB1cmwyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGNoZWNrIGlmIHdlIGhhdmUgdHdvIGxvY2FsIGZpbGUgcmVmZXJlbmNlcyB0aGF0IGFyZSBjYXNlIHZhcmlhbnRzCi0JCUZpbGUgZmlsZTEgPSB0b0ZpbGUodXJsMSk7Ci0JCXJldHVybiBmaWxlMSA9PSBudWxsID8gZmFsc2UgOiBmaWxlMS5lcXVhbHModG9GaWxlKHVybDIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgYXMgYSBsb2NhbCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4KLQkgKiBVUkwgZG9lcyBub3QgcmVwcmVzZW50IGEgbG9jYWwgZmlsZS4KLQkgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gcmV0dXJuIHRoZSBmaWxlIGZpbGUKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbCBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdG9GaWxlKFVSTCB1cmwpIHsKLQkJcmV0dXJuICJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRQcm90b2NvbCgpKSA/IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDg1YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVV0aWxfSW52YWxpZF9aaXBfRmlsZV9Gb3JtYXQ9SW52YWxpZCB6aXAgZmlsZSBmb3JtYXQKLVV0aWxfRXJyb3JfVW56aXBwaW5nPUVycm9yIHVuemlwcGluZyB7MH06IHsxfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFlNjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNlMDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX05vX1NBWF9QYXJzZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmVfQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9FcnJvcl9BdF9OYW1lX0xpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX0Vycm9yX0F0X05hbWVfTGluZV9Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX01pc3NpbmdfUmVxdWlyZWRfQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9VbmV4cGVjdGVkX0F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfSWxsZWdhbF9WYWx1ZV9Gb3JfQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9VbmV4cGVjdGVkX0VsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX0R1cGxpY2F0ZV9FbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9VbmV4cGVjdGVkX0NoYXJhY3Rlcl9EYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9FbGVtZW50X05vdF9BbGxvd2VkOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9YTUxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDdiODQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbnN0YW50cyB7Ci0KLQkvLyBDb25zdGFudHMgdXNlZCBpbiBkZWZpbmluZyBhIGRlZmF1bHQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotCS8vIGluY2x1ZGluZyBhIGNsYXNzIG5hbWUgYW5kIGEgdmVyc2lvbiBvZiB0aGUgYXNzb2NpYXRlZCBYTUwKLQkvLyBmb3Igc29tZSBjYXRlZ29yeSBvZiBvYmplY3RzLgotCS8vCWUuZy4gPD9jYXRlZ29yeSBjbGFzcz0nYS5iLmMuU29tZUNsYXNzJyB2ZXJzaW9uPScxLjIuMyc/PgotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1ZFUlNJT05fQVRUUklCVVRFID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBFbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgZm9yIGEgc3RhbmRhcmQgcHJvcGVydHkgY29sbGVjdGlvbi4KLQkvLwllLmcuIDxwcm9wZXJ0aWVzIHNpemU9JzEnPgotCS8vCQkJPHByb3BlcnR5IG5hbWU9J3NvbWVfbmFtZScgdmFsdWU9J3NvbWVfdmFsdWUnLz4KLQkvLwkJIDwvcHJvcGVydGllcz4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0VMRU1FTlQgPSAicHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTEVNRU5UID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUVfQVRUUklCVVRFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMVUVfQVRUUklCVVRFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29uc3RhbnRzIGZvciB0aGUgbmFtZXMgb2YgY29tbW9uIGdlbmVyYWwgYXR0cmlidXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfSURfQVRUUklCVVRFID0gInBhcmVudElkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUklCVVRFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0FUVFJJQlVURSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fUkFOR0VfQVRUUklCVVRFID0gInJhbmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BVFRSSUJVVEUgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTSUZJRVJfQVRUUklCVVRFID0gImNsYXNzaWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fQVRUUklCVVRFID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0FUVFJJQlVURSA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQVRUUklCVVRFID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgdGhlIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBlbGVtZW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VTX0VMRU1FTlQgPSAibGljZW5zZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9FTEVNRU5UID0gImxpY2Vuc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VMRU1FTlQgPSAiY29weXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQSBjb25zdGFudCBmb3IgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9mIGEgY29sbGVjdGlvbiBvciBhcnJheSBlbGVtZW50Ci0JLy8gc3BlY2lmeWluZyB0aGUgc2l6ZSBvciBsZW5ndGgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFID0gInNpemUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBBIGNvbnN0YW50IGZvciBhbiBlbXB0eSBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIG5vQXR0cmlidXRlcyA9IG5ldyBTdHJpbmdbMF07Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvWE1MUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMGQ4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvWE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuU3RyaW5nUG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotCi0JLy8gR2V0IHRoZSByb290IG9iamVjdCB0aGF0IGlzIGJlaW5nIHBhcnNlZC4KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8vIEdldCBhIGdlbmVyaWMgcGFyc2VyIGVycm9yIG1lc3NhZ2UgZm9yIGluY2x1c2lvbiBpbiBhbiBlcnJvciBzdGF0dXMKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIEJ1bmRsZUNvbnRleHQgY29udGV4dDsgLy8gcGFyc2VyIGNsYXNzIGJ1bmRsZSBjb250ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBidW5kbGVJZDsgLy8gcGFyc2VyIGNsYXNzIGJ1bmRsZSBpZAotCi0JcHJvdGVjdGVkIFhNTFJlYWRlciB4bWxSZWFkZXI7IC8vIHRoZSBYTUwgcmVhZGVyIGZvciB0aGUgcGFyc2VyCi0KLQlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgc3RhdHVzID0gbnVsbDsgLy8gYWNjdW11bGF0aW9uIG9mIG5vbi1mYXRhbCBlcnJvcnMKLQlwcm90ZWN0ZWQgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsgLy8gZG9jdW1lbnQgbG9jYXRvciwgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwYXJzZXIKLQotCXByb3RlY3RlZCBTdHJpbmdQb29sIHN0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbCgpOy8vdXNlZCB0byBlbGltaW5hdGUgc3RyaW5nIGR1cGxpY2F0aW9uCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlVHJhY2tlciB4bWxUcmFja2VyID0gbnVsbDsKLQotCXB1YmxpYyBYTUxQYXJzZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGx1Z2luSWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5idW5kbGVJZCA9IHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqICBOb24tZmF0YWwgZXJyb3JzIGFjY3VtdWxhdGVkIGR1cmluZyBwYXJzaW5nLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCA/IHN0YXR1cyA6IFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgc3RyaW5nLiBVc2VkIHRvIGVsaW1pbmF0ZSBkdXBsaWNhdGUgZXF1YWwgCi0JICogc3RyaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbm9uaWNhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdQb29sID09IG51bGwgPyBzdHJpbmcgOiBzdHJpbmdQb29sLmFkZChzdHJpbmcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwoKSB7Ci0JCXJldHVybiAoc3RhdHVzID09IG51bGwgfHwgIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IgfCBJU3RhdHVzLkNBTkNFTCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgYWNxdWlyZVhNTFBhcnNpbmcoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICh4bWxUcmFja2VyID09IG51bGwpIHsKLQkJCXhtbFRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgU0FYUGFyc2VyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkJeG1sVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJcmV0dXJuIChTQVhQYXJzZXJGYWN0b3J5KSB4bWxUcmFja2VyLmdldFNlcnZpY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVsZWFzZVhNTFBhcnNpbmcoKSB7Ci0JCWlmICh4bWxUcmFja2VyICE9IG51bGwpIHsKLQkJCXhtbFRyYWNrZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTQVhQYXJzZXIgZ2V0UGFyc2VyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IGFjcXVpcmVYTUxQYXJzaW5nKHRoaXMuY29udGV4dCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTWVzc2FnZXMuWE1MUGFyc2VyX05vX1NBWF9QYXJzZXIpOwotCQl9Ci0JCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9zdHJpbmctaW50ZXJuaW5nIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0JCQkvLyBzb21lIHBhcnNlcnMgbWF5IG5vdCBzdXBwb3J0IHN0cmluZyBpbnRlcm5pbmcKLQkJfQotCQlTQVhQYXJzZXIgdGhlUGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJaWYgKHRoZVBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLlhNTFBhcnNlcl9Ob19TQVhfUGFyc2VyKTsKLQkJfQotCQl4bWxSZWFkZXIgPSB0aGVQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCXJldHVybiB0aGVQYXJzZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVNpbXBsZU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBsb2NhbE5hbWU7Ci0JCX0KLQkJaW50IG5hbWVTcGFjZUluZGV4ID0gcXVhbGlmaWVkTmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIChuYW1lU3BhY2VJbmRleCA9PSAtMSA/IHF1YWxpZmllZE5hbWUgOiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhuYW1lU3BhY2VJbmRleCArIDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRvY3VtZW50IGxvY2F0b3IgZm9yIHRoZSBwYXJzZXIKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NldERvY3VtZW50TG9jYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGRvY0xvY2F0b3IpIHsKLQkJbG9jYXRvciA9IGRvY0xvY2F0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIHBhcnNlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250ZW50IGhhbmRsZXJzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCQlwcm90ZWN0ZWQgQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlciA9IG51bGw7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZWxlbWVudEhhbmRsZWQgPSBudWxsOwotCi0JCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgY2hhcmFjdGVycyA9IG51bGw7IC8vIGNoYXJhY3RlciBkYXRhIGluc2lkZSBhbiBlbGVtZW50Ci0KLQkJcHVibGljIEFic3RyYWN0SGFuZGxlcigpIHsKLQkJCS8vIEVtcHR5IGNvbnN0cnVjdG9yIGZvciBhIHJvb3QgaGFuZGxlcgotCQl9Ci0KLQkJcHVibGljIEFic3RyYWN0SGFuZGxlcihDb250ZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyKSB7Ci0JCQl0aGlzLnBhcmVudEhhbmRsZXIgPSBwYXJlbnRIYW5kbGVyOwotCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIEFic3RyYWN0SGFuZGxlcihDb250ZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBTdHJpbmcgZWxlbWVudEhhbmRsZWQpIHsKLQkJCXRoaXMucGFyZW50SGFuZGxlciA9IHBhcmVudEhhbmRsZXI7Ci0JCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCQl0aGlzLmVsZW1lbnRIYW5kbGVkID0gZWxlbWVudEhhbmRsZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0IHRoZSBkb2N1bWVudCBsb2NhdG9yIGZvciB0aGUgcGFyc2VyCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NldERvY3VtZW50TG9jYXRvcgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgZG9jTG9jYXRvcikgewotCQkJbG9jYXRvciA9IGRvY0xvY2F0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJZmluaXNoQ2hhcmFjdGVycygpOwotCQkJU3RyaW5nIG5hbWUgPSBtYWtlU2ltcGxlTmFtZShsb2NhbE5hbWUsIHFOYW1lKTsKLQkJCXRyYWNlKG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJc3RhcnRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb247Ci0KLQkJcHVibGljIHZvaWQgaW52YWxpZEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJdW5leHBlY3RlZEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQluZXcgSWdub3JpbmdIYW5kbGVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHsKLQkJCS8vIFRPRE86IHRocm93IGEgYmFkIHN0YXRlIGVycm9yIGlmIG1ha2VTaW1wbGVOYW1lKGxvY2FsTmFtZSwgcU5hbWUpICE9IGVsZW1lbnRIYW5kbGVkCi0JCQlmaW5pc2hDaGFyYWN0ZXJzKCk7Ci0JCQlmaW5pc2hlZCgpOwotCQkJLy8gUmVzdG9yZSB0aGUgcGFyZW50IGNvbnRlbnQgaGFuZGxlcgotCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHBhcmVudEhhbmRsZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAlBbiBpbXBsZW1lbnRhdGlvbiBmb3Igc3RhcnRFbGVtZW50IHdoZW4gdGhlcmUgYXJlIG5vIHN1Yi1lbGVtZW50cwotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgbm9TdWJFbGVtZW50cyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQl1bmV4cGVjdGVkRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCS8vIENyZWF0ZSBhIG5ldyBoYW5kbGVyIHRvIGlnbm9yZSBzdWJzZXF1ZW50IG5lc3RlZCBlbGVtZW50cwkJCQotCQkJbmV3IElnbm9yaW5nSGFuZGxlcih0aGlzKTsKLQkJfQotCi0JCS8qCi0JCSAqIFNhdmUgdXAgY2hhcmFjdGVyIGRhdGEgdW50aWwgZW5kRWxlbWVudCBvciBuZXN0ZWQgc3RhcnRFbGVtZW50Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCWlmICh0aGlzLmNoYXJhY3RlcnMgPT0gbnVsbCkgewotCQkJCXRoaXMuY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCX0KLQkJCXRoaXMuY2hhcmFjdGVycy5hcHBlbmQoY2hhcnMsIHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0KLQkJLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBhY2N1bXVsYXRlZCBpbiB0aGlzLmNoYXJhY3RlcnMuCi0JCS8vIENhbGxlZCBiZWZvcmUgc3RhcnRFbGVtZW50IG9yIGVuZEVsZW1lbnQKLQkJcHJpdmF0ZSBTdHJpbmcgZmluaXNoQ2hhcmFjdGVycygpIHsKLQkJCS8vIGNvbW1vbiBjYXNlIC0tIG5vIGNoYXJhY3RlcnMgb3Igb25seSB3aGl0ZXNwYWNlCi0JCQlpZiAodGhpcy5jaGFyYWN0ZXJzID09IG51bGwgfHwgdGhpcy5jaGFyYWN0ZXJzLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChhbGxXaGl0ZVNwYWNlKHRoaXMuY2hhcmFjdGVycykpIHsKLQkJCQl0aGlzLmNoYXJhY3RlcnMuc2V0TGVuZ3RoKDApOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBwcm9jZXNzIHRoZSBjaGFyYWN0ZXJzCi0JCQl0cnkgewotCQkJCVN0cmluZyB0cmltbWVkQ2hhcnMgPSB0aGlzLmNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCk7Ci0JCQkJaWYgKHRyaW1tZWRDaGFycy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiBkdWUgdG8gdGhlIHRlc3QgZm9yIGFsbFdoaXRlU3BhY2UgYWJvdmUKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJVbmV4cGVjdGVkIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnM6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgdHJpbW1lZENoYXJzKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXByb2Nlc3NDaGFyYWN0ZXJzKHRyaW1tZWRDaGFycyk7Ci0JCQkJcmV0dXJuIHRyaW1tZWRDaGFyczsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdGhpcy5jaGFyYWN0ZXJzLnNldExlbmd0aCgwKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZCB0byBvdmVycmlkZSBpbiB0aGUgaGFuZGxlciBvZiBhbiBlbGVtZW50IHdpdGggQ0RBVEEuIAotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hhcmFjdGVycyhTdHJpbmcgZGF0YSkgewotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdW5leHBlY3RlZENoYXJhY3RlckRhdGEodGhpcywgZGF0YSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmdCdWZmZXIgc2IpIHsKLQkJCWludCBsZW5ndGggPSBzYi5sZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc2IuY2hhckF0KGkpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogCUNhbGxlZCB3aGVuIHRoaXMgZWxlbWVudCBhbmQgYWxsIGVsZW1lbnRzIG5lc3RlZCBpbnRvIGl0IGhhdmUgYmVlbgotCQkgKiAJaGFuZGxlZC4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJLy8gRG8gbm90aGluZyBieSBkZWZhdWx0Ci0JCX0KLQotCQkvKgotCQkgKiAJQSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGhhbmRsZXIuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gKGVsZW1lbnRIYW5kbGVkICE9IG51bGwgPyBlbGVtZW50SGFuZGxlZCA6ICJOb05hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIFBhcnNlIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQgd2l0aCB0d28gcmVxdWlyZWQgYXR0cmlidXRlcy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCQlyZXR1cm4gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbmV3IFN0cmluZ1tdIHtuYW1lMSwgbmFtZTJ9KTsKLQkJfQotCi0JCS8qKgotCQkgKiBQYXJzZSB0aGUgYXR0cmlidXRlcyBvZiBhbiBlbGVtZW50IHdpdGggb25seSByZXF1aXJlZCBhdHRyaWJ1dGVzLgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZ1tdIHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU3RyaW5nW10gcmVxdWlyZWQpIHsKLQkJCXJldHVybiBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQsIG5vQXR0cmlidXRlcyk7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2UgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudCB3aXRoIGEgc2luZ2xlIG9wdGlvbmFsIGF0dHJpYnV0ZS4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG5vQXR0cmlidXRlcywgbmV3IFN0cmluZ1tdIHtuYW1lfSlbMF07Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2UgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudCwgZ2l2ZW4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgYW5kIG9wdGlvbmFsIG9uZXMuCi0JCSAqIFJldHVybiB2YWx1ZXMgaW4gc2FtZSBvcmRlciwgbnVsbCBmb3IgdGhvc2Ugbm90IHByZXNlbnQuCi0JCSAqIExvZyB3YXJuaW5ncyBmb3IgZXh0cmEgYXR0cmlidXRlcyBvciBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU3RyaW5nW10gcmVxdWlyZWQsIFN0cmluZ1tdIG9wdGlvbmFsKSB7Ci0JCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3JlcXVpcmVkLmxlbmd0aCArIG9wdGlvbmFsLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkgKz0gMSkgewotCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY2Fub25pY2FsaXplKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkudHJpbSgpKTsKLQkJCQlpbnQgajsKLQkJCQlpZiAoKGogPSBpbmRleE9mKHJlcXVpcmVkLCBuYW1lKSkgPj0gMCkgewotCQkJCQlyZXN1bHRbal0gPSB2YWx1ZTsKLQkJCQl9IGVsc2UgaWYgKChqID0gaW5kZXhPZihvcHRpb25hbCwgbmFtZSkpID49IDApIHsKLQkJCQkJcmVzdWx0W3JlcXVpcmVkLmxlbmd0aCArIGpdID0gdmFsdWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdW5leHBlY3RlZEF0dHJpYnV0ZShlbGVtZW50SGFuZGxlZCwgbmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWQubGVuZ3RoOyBpICs9IDEpIHsKLQkJCQljaGVja1JlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnRIYW5kbGVkLCByZXF1aXJlZFtpXSwgcmVzdWx0W2ldKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqCUhhbmRsZXIgZm9yIGFuIFhNTCBkb2N1bWVudC4KLQkgKgotCSAqCVVzaW5nIHRoZSBpbmVsZWdhbnQgbmFtZSAnRG9jSGFuZGxlcicgdG8gY2xlYXJseSBkaXN0aW5ndWlzaAotCSAqCXRoaXMgY2xhc3MgZnJvbSB0aGUgZGVwcmVjYXRlZCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERvY0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCVJvb3RIYW5kbGVyIHJvb3RIYW5kbGVyOwotCi0JCXB1YmxpYyBEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCXN1cGVyKG51bGwsIHJvb3ROYW1lKTsKLQkJCXRoaXMucm9vdEhhbmRsZXIgPSByb290SGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudEhhbmRsZWQpKSB7Ci0JCQkJcm9vdEhhbmRsZXIuaW5pdGlhbGl6ZSh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIocm9vdEhhbmRsZXIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLm5vU3ViRWxlbWVudHMobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIAlBYnN0cmFjdCBoYW5kbGVyIGZvciB0aGUgcm9vdCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBSb290SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHVibGljIFJvb3RIYW5kbGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRG9jSGFuZGxlciBkb2N1bWVudCwgU3RyaW5nIHJvb3ROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXRoaXMucGFyZW50SGFuZGxlciA9IGRvY3VtZW50OwotCQkJdGhpcy5lbGVtZW50SGFuZGxlZCA9IHJvb3ROYW1lOwotCQkJaGFuZGxlUm9vdEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVSb290QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogCUhhbmRsZXIgZm9yIGFuIG9yZGVyZWQgcHJvcGVydGllcyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBQcm9wZXJ0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzSGFuZGxlcihDb250ZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFBST1BFUlRJRVNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQlwcm9wZXJ0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBPcmRlcmVkUHJvcGVydGllcyhuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBPcmRlcmVkUHJvcGVydGllcygpKTsKLQkJfQotCi0JCXB1YmxpYyBPcmRlcmVkUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFBST1BFUlRZX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IFByb3BlcnR5SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBhIHByb3BlcnR5IGluIGFuIG9yZGVyZWQgcHJvcGVydGllcyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBQcm9wZXJ0eUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXB1YmxpYyBQcm9wZXJ0eUhhbmRsZXIoQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBQUk9QRVJUWV9FTEVNRU5UKTsKLQkJCVN0cmluZ1tdIHByb3BlcnR5ID0gcGFyc2VQcm9wZXJ0eShhdHRyaWJ1dGVzKTsKLQkJCWlmIChpc1ZhbGlkUHJvcGVydHkocHJvcGVydHkpKSB7Ci0JCQkJcHJvcGVydGllcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eVswXSwgcHJvcGVydHlbMV0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBwYXJzZVByb3BlcnR5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJcmV0dXJuIHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIFBST1BFUlRZX05BTUVfQVRUUklCVVRFLCBQUk9QRVJUWV9WQUxVRV9BVFRSSUJVVEUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eShTdHJpbmdbXSBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIChwcm9wZXJ0eS5sZW5ndGggPT0gMiAmJiBwcm9wZXJ0eVswXSAhPSBudWxsICYmIHByb3BlcnR5WzFdICE9IG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCUhhbmRsZXIgZm9yIGFuIGVsZW1lbnQgd2l0aCBvbmx5IGNkYXRhIGFuZCBubyBzdWItZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFRleHRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlwcml2YXRlIFN0cmluZyB0ZXh0ID0gbnVsbDsKLQotCQlwcml2YXRlIExpc3QgdGV4dHMgPSBudWxsOwotCi0JCS8vIENvbnN0cnVjdG9yIGZvciBhIHN1YmNsYXNzIHRoYXQgcHJvY2Vzc2VzIHRoZSBhdHRyaWJ1dGVzCi0JCXB1YmxpYyBUZXh0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgZWxlbWVudE5hbWUpOwotCQl9Ci0KLQkJLy8gQ29uc3RydWN0b3IgZm9yIGEgc3ViY2xhc3Mgd2l0aCBubyBhdHRyaWJ1dGVzCi0JCXB1YmxpYyBUZXh0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50LCBTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50LCBlbGVtZW50TmFtZSk7Ci0JCQlwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbm9BdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJcHVibGljIFRleHRIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnQsIFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0IHRleHRzKSB7Ci0JCQlzdXBlcihwYXJlbnQsIGVsZW1lbnROYW1lKTsKLQkJCXBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMsIG5vQXR0cmlidXRlcyk7Ci0JCQl0aGlzLnRleHRzID0gdGV4dHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gKHRleHQgIT0gbnVsbCA/IHRleHQgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGFyYWN0ZXJzKFN0cmluZyBkYXRhKSB7Ci0JCQl0aGlzLnRleHQgPSBkYXRhOwotCQkJaWYgKHRleHRzICE9IG51bGwpIHsKLQkJCQl0ZXh0cy5hZGQoZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogCUhhbmRsZXIgZm9yIGlnbm9yaW5nIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIElnbm9yaW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHVibGljIElnbm9yaW5nSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy5lbGVtZW50SGFuZGxlZCA9ICJJZ25vcmluZ0FsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlub1N1YkVsZW1lbnRzKG5hbWUsIGF0dHJpYnV0ZXMpOwotCQl9Ci0KLQl9Ci0KLQkvLyBIZWxwZXJzIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGUgYSBDbGFzcyBhbmQvb3IgYSBWZXJzaW9uLgotCi0JcHVibGljIFN0cmluZyBleHRyYWN0UElDbGFzcyhTdHJpbmcgZGF0YSkgewotCQlyZXR1cm4gZXh0cmFjdFBJQXR0cmlidXRlKGRhdGEsIFBJX0NMQVNTX0FUVFJJQlVURSk7Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZXh0cmFjdFBJVmVyc2lvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotCQlyZXR1cm4gY2hlY2tWZXJzaW9uKHRhcmdldCwgUElfVkVSU0lPTl9BVFRSSUJVVEUsIGV4dHJhY3RQSUF0dHJpYnV0ZShkYXRhLCBQSV9WRVJTSU9OX0FUVFJJQlVURSkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RQSUF0dHJpYnV0ZShTdHJpbmcgZGF0YSwgU3RyaW5nIGtleSkgewotCQlTdHJpbmdUb2tlbml6ZXIgcGlUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRhdGEsICIgXCdcIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbcGlUb2tlbml6ZXIuY291bnRUb2tlbnMoKV07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCB2YWx1ZUluZGV4ID0gLTE7Ci0JCXdoaWxlIChwaVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQl0b2tlbnNbaW5kZXhdID0gcGlUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rZW5zW2luZGV4XS5lcXVhbHMoa2V5ICsgJz0nKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQl2YWx1ZUluZGV4ID0gaW5kZXggKyAxOwotCQkJfQotCQkJaW5kZXgrKzsKLQkJfQotCQlyZXR1cm4gKHZhbHVlSW5kZXggPj0gMCA/IHRva2Vuc1t2YWx1ZUluZGV4XSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCWFkZEVycm9yKElTdGF0dXMuV0FSTklORywgZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotCQlhZGRFcnJvcihJU3RhdHVzLkVSUk9SLCBleC5nZXRNZXNzYWdlKCksIGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yUHJlZml4KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yU3VmZml4KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBhbiBlcnJvciBvciB3YXJuaW5nIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkRXJyb3IoaW50IHNldmVyaXR5LCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWludCBsaW5lID0gMDsKLQkJaW50IGNvbHVtbiA9IDA7Ci0JCVN0cmluZyBrZXkgPSBtc2c7Ci0JCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge307Ci0JCVN0cmluZyByb290ID0gKGdldFJvb3RPYmplY3QoKSA9PSBudWxsID8gIiIgLy8kTk9OLU5MUy0xJAotCQkJCTogIiAoIiArIGdldFJvb3RPYmplY3QoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAodGhpcy5sb2NhdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5sb2NhdG9yLmdldFN5c3RlbUlkKCk7Ci0JCQlsaW5lID0gdGhpcy5sb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCWNvbHVtbiA9IHRoaXMubG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCWlmIChsaW5lID4gMCkgewotCQkJCWFyZ3MgPSBuZXcgT2JqZWN0W10ge21zZywgcm9vdCwgbmFtZSwgbmV3IEludGVnZXIobGluZSksIG5ldyBJbnRlZ2VyKGNvbHVtbil9OwotCQkJCWlmIChjb2x1bW4gPiAwKSB7Ci0JCQkJCWtleSA9IChuYW1lICE9IG51bGwgPyBNZXNzYWdlcy5YTUxQYXJzZXJfRXJyb3JfQXRfTmFtZV9MaW5lX0NvbHVtbiAvLwotCQkJCQkJCTogTWVzc2FnZXMuWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmVfQ29sdW1uKTsKLQkJCQl9IGVsc2UgewotCQkJCQlrZXkgPSAobmFtZSAhPSBudWxsID8gTWVzc2FnZXMuWE1MUGFyc2VyX0Vycm9yX0F0X05hbWVfTGluZSAvLwotCQkJCQkJCTogTWVzc2FnZXMuWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyTXNnID0gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQkJU3RyaW5nIHByZWZpeCA9IGdldEVycm9yUHJlZml4KCk7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRFcnJvclN1ZmZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwpIHsKLQkJCWVyck1zZyA9IHByZWZpeCArIGVyck1zZzsKLQkJfQotCQlpZiAoc3VmZml4ICE9IG51bGwpIHsKLQkJCWVyck1zZyA9IGVyck1zZyArIHN1ZmZpeDsKLQkJfQotCQlJU3RhdHVzIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBBY3RpdmF0b3IuSUQsIGVyck1zZywgZXhjZXB0aW9uKTsKLQkJaWYgKHRoaXMuc3RhdHVzID09IG51bGwpIHsKLQkJCXRoaXMuc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKGJ1bmRsZUlkLCBJU3RhdHVzLk9LLCBuZXcgSVN0YXR1c1tdIHtjdXJyU3RhdHVzfSwgZ2V0RXJyb3JNZXNzYWdlKCksIG51bGwpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zdGF0dXMuYWRkKGN1cnJTdGF0dXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGVsZW1lbnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkvLyBUT0RPOiBzdXBwb3J0IGxvZ2dpbmcKLQkJLy8JCWlmICghZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0xvZ2dhYmxlKCkpIHsKLQkJLy8JCQlyZXR1cm47Ci0JCS8vCQl9Ci0JCS8vCQlpbnQgaW5kZW50U2l6ZSA9ICh0aGlzLnN0YXRlU3RhY2sgIT0gbnVsbCA/IHRoaXMuc3RhdGVTdGFjay5zaXplKCkgLSAxIDogMSk7Ci0JCS8vCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCS8vCQkJaW5kZW50U2l6ZSAtPSAxOwotCQkvLwkJfQotCQkvLwkJY2hhcltdIGluZGVudCA9IG5ldyBjaGFyWzIgKiBpbmRlbnRTaXplXTsKLQkJLy8JCUFycmF5cy5maWxsKGluZGVudCwgJyAnKTsKLQkJLy8JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8JCXNiLmFwcGVuZChpbmRlbnQpOwotCQkvLwkJc2IuYXBwZW5kKCc8Jyk7Ci0JCS8vCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCS8vCQkJc2IuYXBwZW5kKGVsZW1lbnQpOwotCQkvLwkJCXRvU3RyaW5nKHNiLCBhdHRyaWJ1dGVzKTsKLQkJLy8JCX0gZWxzZSB7Ci0JCS8vCQkJc2IuYXBwZW5kKCcvJykuYXBwZW5kKGVsZW1lbnQpOwotCQkvLwkJfQotCQkvLwkJc2IuYXBwZW5kKCc+Jyk7Ci0JCS8vCQlnZXRMb2dnZXIoKS5kZWJ1ZyhzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRvU3RyaW5nKHJlc3VsdCwgYXR0cmlidXRlcyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1ZmZlciBzYiwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSArPSAxKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOwotCQkJU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKS50cmltKCk7Ci0JCQlzYi5hcHBlbmQoJyAnKS5hcHBlbmQobmFtZSk7Ci0JCQlzYi5hcHBlbmQoJz0nKS5hcHBlbmQoJyInKTsKLQkJCXNiLmFwcGVuZCh2YWx1ZSk7Ci0JCQlzYi5hcHBlbmQoJyInKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoZWNrUmVxdWlyZWRBdHRyaWJ1dGUoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWFkZEVycm9yKElTdGF0dXMuV0FSTklORywgTkxTLmJpbmQoTWVzc2FnZXMuWE1MUGFyc2VyX01pc3NpbmdfUmVxdWlyZWRfQXR0cmlidXRlLCBlbGVtZW50LCBuYW1lKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvLyBDaGVjayB0aGUgZm9ybWF0IG9mIGEgcmVxdWlyZWQgYm9vbGVhbiBhdHRyaWJ1dGUKLQlwdWJsaWMgQm9vbGVhbiBjaGVja0Jvb2xlYW4oU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWludmFsaWRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQl9Ci0KLQkvLyBDaGVjayB0aGUgZm9ybWF0IG9mIGFuIG9wdGlvbmFsIGJvb2xlYW4gYXR0cmlidXRlCi0JcHVibGljIEJvb2xlYW4gY2hlY2tCb29sZWFuKFN0cmluZyBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCUJvb2xlYW4gcmVzdWx0ID0gKGRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja0NhbmNlbCgpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgdmVyc2lvbiBzdHJpbmcgdG8gYSBWZXJzaW9uIG9iamVjdC4gUmV0dXJucyB0aGUgdmVyc2lvbiBvYmplY3QsCi0JICogb3Ige0BsaW5rIFZlcnNpb24jZW1wdHlWZXJzaW9ufSBpZiB0aGUgdmFsdWUgd2FzIG5vdCBhIHZhbGlkIHZlcnNpb24uCi0JICovCi0JcHVibGljIFZlcnNpb24gY2hlY2tWZXJzaW9uKFN0cmluZyBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgVmVyc2lvbih2YWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWludmFsaWRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JfQotCi0JcHVibGljIFZlcnNpb25SYW5nZSBjaGVja1ZlcnNpb25SYW5nZShTdHJpbmcgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWludmFsaWRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5leHBlY3RlZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChUcmFjaW5nLkRFQlVHX1BBUlNFX1BST0JMRU1TKQotCQkJVHJhY2luZy5kZWJ1ZygiVW5leHBlY3RlZCBhdHRyaWJ1dGUgZm9yIGVsZW1lbnQgIiArIGVsZW1lbnQgKyAiOiAiICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZhbGlkQXR0cmlidXRlVmFsdWUoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQlhZGRFcnJvcihJU3RhdHVzLldBUk5JTkcsIE5MUy5iaW5kKE1lc3NhZ2VzLlhNTFBhcnNlcl9JbGxlZ2FsX1ZhbHVlX0Zvcl9BdHRyaWJ1dGUsIG5ldyBPYmplY3RbXSB7YXR0cmlidXRlLCBlbGVtZW50LCB2YWx1ZX0pLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmV4cGVjdGVkRWxlbWVudChBYnN0cmFjdEhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIGVsZW1lbnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoVHJhY2luZy5ERUJVR19QQVJTRV9QUk9CTEVNUykKLQkJCVRyYWNpbmcuZGVidWcoIlVuZXhwZWN0ZWQgZWxlbWVudCBpbiBlbGVtZW50ICIgKyBoYW5kbGVyLmdldE5hbWUoKSArICI6IDwiICsgZWxlbWVudCArIHRvU3RyaW5nKGF0dHJpYnV0ZXMpICsgJz4nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgZHVwbGljYXRlRWxlbWVudChBYnN0cmFjdEhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIGVsZW1lbnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlhZGRFcnJvcihJU3RhdHVzLldBUk5JTkcsIE5MUy5iaW5kKE1lc3NhZ2VzLlhNTFBhcnNlcl9EdXBsaWNhdGVfRWxlbWVudCwgbmV3IE9iamVjdFtdIHtoYW5kbGVyLmdldE5hbWUoKSwgZWxlbWVudCwgdG9TdHJpbmcoYXR0cmlidXRlcyl9KSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5leHBlY3RlZENoYXJhY3RlckRhdGEoQWJzdHJhY3RIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBjZGF0YSkgewotCQlpZiAoVHJhY2luZy5ERUJVR19QQVJTRV9QUk9CTEVNUykKLQkJCVRyYWNpbmcuZGVidWcoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGRhdGEgaW4gZWxlbWVudCAiICsgaGFuZGxlci5nZXROYW1lKCkgKyAiOiAiICsgY2RhdGEudHJpbSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2Ygb2JqZWN0IGluIGFycmF5LCBvciAtMS4KLQkgKiBVc2UgQXJyYXlzLmJpbmFyeVNlYXJjaCBpZiBhcnJheSBpcyBiaWcgYW5kIHNvcnRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBpbmRleE9mKFN0cmluZ1tdIGFycmF5LCBTdHJpbmcgdmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkgewotCQkJaWYgKHZhbHVlID09IG51bGwgPyBhcnJheVtpXSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvLwlwdWJsaWMgY2xhc3MgQmFkU3RhdGVFcnJvciBleHRlbmRzIEFzc2VydGlvbkVycm9yIHsKLQkvLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IC8vIG5vdCBzZXJpYWxpemVkCi0JLy8KLQkvLwkJcHVibGljIEJhZFN0YXRlRXJyb3IoKSB7Ci0JLy8JCQlzdXBlcigidW5leHBlY3RlZCBzdGF0ZSIgKyAvLyROT04tTkxTLTEkCi0JLy8JCQkJCShYTUxQYXJzZXIudGhpcy5zdGF0ZVN0YWNrICE9IG51bGwgPyAiOiAiICsgWE1MUGFyc2VyLnRoaXMuc3RhdGVTdGFjayAvLyROT04tTkxTLTEkCi0JLy8JCQkJCTogIiIpKTsgLy8kTk9OLU5MUy0xJAotCS8vCQl9Ci0JLy8KLQkvLwkJcHVibGljIEJhZFN0YXRlRXJyb3IoU3RyaW5nIGVsZW1lbnQpIHsKLQkvLwkJCXN1cGVyKCJ1bmV4cGVjdGVkIHN0YXRlIGZvciAiICsgZWxlbWVudCArIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQkJKFhNTFBhcnNlci50aGlzLnN0YXRlU3RhY2sgIT0gbnVsbCA/ICI6ICIgKyBYTUxQYXJzZXIudGhpcy5zdGF0ZVN0YWNrIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQkJOiAiIikpOyAvLyROT04tTkxTLTEkCi0JLy8JCX0KLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFdyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvWE1MV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2MyMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvWE1MV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxXcml0ZXIgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gewotCi0JCXByaXZhdGUgU3RyaW5nIHRhcmdldDsKLQkJcHJpdmF0ZSBTdHJpbmdbXSBkYXRhOwotCi0JCS8vIFRoZSBzdGFuZGFyZCBVVEYtOCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9VVEY4ID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+IjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nW10gYXR0cnMsIFN0cmluZ1tdIHZhbHVlcykgewotCQkJLy8gTGVuZ3RocyBvZiBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMgbXVzdCBiZSB0aGUgc2FtZQotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCQl0aGlzLmRhdGEgPSBuZXcgU3RyaW5nW2F0dHJzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGF0YVtpXSA9IGF0dHJpYnV0ZUltYWdlKGF0dHJzW2ldLCB2YWx1ZXNbaV0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbWFrZUNsYXNzVmVyc2lvbkluc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIENsYXNzIGNsYXp6LCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJCXJldHVybiBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgbmV3IFN0cmluZ1tdIHtQSV9DTEFTU19BVFRSSUJVVEUsIFBJX1ZFUlNJT05fQVRUUklCVVRFfSwgbmV3IFN0cmluZ1tdIHtjbGF6ei5nZXROYW1lKCksIHZlcnNpb24udG9TdHJpbmcoKX0pOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjw/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCh0aGlzLnRhcmdldCkuYXBwZW5kKCcgJyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQodGhpcy5kYXRhW2ldKTsKLQkJCQlpZiAoaSA8IGRhdGEubGVuZ3RoIC0gMSkgewotCQkJCQlzYi5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGFjayBlbGVtZW50czsgLy8gWE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY2xvc2VkCi0JcHJpdmF0ZSBib29sZWFuIG9wZW47IC8vIENhbiBhdHRyaWJ1dGVzIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQ/Ci0JcHJpdmF0ZSBTdHJpbmcgaW5kZW50OyAvLyB1c2VkIGZvciBlYWNoIGxldmVsIG9mIGluZGVudGF0aW9uCi0KLQlwcml2YXRlIFByaW50V3JpdGVyIHB3OwotCi0JcHVibGljIFhNTFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0cHV0LCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSBwaUVsZW1lbnRzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMucHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsICJVVEY4IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXByaW50bG4oUHJvY2Vzc2luZ0luc3RydWN0aW9uLlhNTF9VVEY4KTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBTdGFjaygpOwotCQl0aGlzLm9wZW4gPSBmYWxzZTsKLQkJdGhpcy5pbmRlbnQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWlmIChwaUVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGlFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXByaW50bG4ocGlFbGVtZW50c1tpXS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHN0YXJ0IGEgbmV3IGVsZW1lbnQKLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5vcGVuKSB7Ci0JCQlwcmludGxuKCc+Jyk7Ci0JCX0KLQkJaW5kZW50KCk7Ci0JCXByaW50KCc8Jyk7Ci0JCXByaW50KG5hbWUpOwotCQl0aGlzLmVsZW1lbnRzLnB1c2gobmFtZSk7Ci0JCXRoaXMub3BlbiA9IHRydWU7Ci0JfQotCi0JLy8gZW5kIHRoZSBtb3N0IHJlY2VudCBlbGVtZW50IHdpdGggdGhpcyBuYW1lCi0JcHVibGljIHZvaWQgZW5kKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnRzLmVtcHR5KCkpIHsKLQkJCXRocm93IG5ldyBFbmRXaXRob3V0U3RhcnRFcnJvcigpOwotCQl9Ci0JCWludCBpbmRleCA9IHRoaXMuZWxlbWVudHMuc2VhcmNoKG5hbWUpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXRocm93IG5ldyBFbmRXaXRob3V0U3RhcnRFcnJvcihuYW1lKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpICs9IDEpIHsKLQkJCWVuZCgpOwotCQl9Ci0JfQotCi0JLy8gZW5kIHRoZSBjdXJyZW50IGVsZW1lbnQKLQlwdWJsaWMgdm9pZCBlbmQoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnRzLmVtcHR5KCkpIHsKLQkJCXRocm93IG5ldyBFbmRXaXRob3V0U3RhcnRFcnJvcigpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgdGhpcy5lbGVtZW50cy5wb3AoKTsKLQkJaWYgKHRoaXMub3BlbikgewotCQkJcHJpbnRsbigiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcHJpbnRsbkluZGVudGVkKCI8LyIgKyBuYW1lICsgJz4nLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLm9wZW4gPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHR4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eHQubGVuZ3RoKCk7ICsraSkgewotCQkJU3RyaW5nIHJlcGxhY2U7Ci0JCQljaGFyIGMgPSB0eHQuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlyZXBsYWNlID0gIiZsdDsiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nIDoKLQkJCQkJcmVwbGFjZSA9ICImZ3Q7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJCXJlcGxhY2UgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcJycgOgotCQkJCQlyZXBsYWNlID0gIiZhcG9zOyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJicgOgotCQkJCQlyZXBsYWNlID0gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHR4dC5sZW5ndGgoKSArIDE2KTsKLQkJCQlidWZmZXIuYXBwZW5kKHR4dC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChyZXBsYWNlKTsKLQkJfQotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0eHQ7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8vIHdyaXRlIGEgYm9vbGVhbiBhdHRyaWJ1dGUgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAodmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7Ci0JCQlhdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWF0dHJpYnV0ZShuYW1lLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJYXR0cmlidXRlKG5hbWUsIEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVPcHRpb25hbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJYXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghdGhpcy5vcGVuKSB7Ci0JCQl0aHJvdyBuZXcgQXR0cmlidXRlQWZ0ZXJOZXN0ZWRDb250ZW50RXJyb3IoKTsKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAvLyBvcHRpb25hbCBhdHRyaWJ1dGUgd2l0aCBubyB2YWx1ZQotCQl9Ci0JCXByaW50KCcgJyk7Ci0JCXByaW50KG5hbWUpOwotCQlwcmludCgiPSciKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludChlc2NhcGUodmFsdWUudG9TdHJpbmcoKSkpOwotCQlwcmludCgnXCcnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjZGF0YShTdHJpbmcgZGF0YSkgewotCQljZGF0YShkYXRhLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjZGF0YShTdHJpbmcgZGF0YSwgYm9vbGVhbiBlc2NhcGUpIHsKLQkJaWYgKHRoaXMub3BlbikgewotCQkJcHJpbnRsbignPicpOwotCQkJdGhpcy5vcGVuID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJcHJpbnRsbkluZGVudGVkKGRhdGEsIGVzY2FwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJd2hpbGUgKCF0aGlzLmVsZW1lbnRzLmVtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZW5kKCk7Ci0JCQl9IGNhdGNoIChFbmRXaXRob3V0U3RhcnRFcnJvciBlKSB7Ci0JCQkJLy8gY2FuJ3QgaGFwcGVuCi0JCQl9Ci0JCX0KLQkJdGhpcy5wdy5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydGllcyhNYXAgcHJvcGVydGllcykgewotCQl3cml0ZVByb3BlcnRpZXMoUFJPUEVSVElFU19FTEVNRU5ULCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnRpZXMoU3RyaW5nIHByb3BlcnRpZXNFbGVtZW50LCBNYXAgcHJvcGVydGllcykgewotCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuc2l6ZSgpID4gMCkgewotCQkJc3RhcnQocHJvcGVydGllc0VsZW1lbnQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQl3cml0ZVByb3BlcnR5KG5hbWUsIChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5hbWUpKTsKLQkJCX0KLQkJCWVuZChwcm9wZXJ0aWVzRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3RhcnQoUFJPUEVSVFlfRUxFTUVOVCk7Ci0JCWF0dHJpYnV0ZShQUk9QRVJUWV9OQU1FX0FUVFJJQlVURSwgbmFtZSk7Ci0JCWF0dHJpYnV0ZShQUk9QRVJUWV9WQUxVRV9BVFRSSUJVVEUsIHZhbHVlKTsKLQkJZW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYXR0cmlidXRlSW1hZ2UoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyBvcHRpb25hbCBhdHRyaWJ1dGUgd2l0aCBubyB2YWx1ZQotCQl9Ci0JCXJldHVybiBuYW1lICsgIj0nIiArIGVzY2FwZSh2YWx1ZSkgKyAnXCcnOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50bG4oY2hhciBjKSB7Ci0JCXRoaXMucHcucHJpbnRsbihjKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRsbihTdHJpbmcgcykgewotCQl0aGlzLnB3LnByaW50bG4ocyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50bG4oKSB7Ci0JCXRoaXMucHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludChjaGFyIGMpIHsKLQkJdGhpcy5wdy5wcmludChjKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKLQkJdGhpcy5wdy5wcmludChzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRsbkluZGVudGVkKFN0cmluZyBzLCBib29sZWFuIGVzY2FwZSkgewotCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwcmludGxuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbmRlbnQoKTsKLQkJCXByaW50bG4oZXNjYXBlID8gZXNjYXBlKHMpIDogcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5kZW50KCkgewotCQlmb3IgKGludCBpID0gdGhpcy5lbGVtZW50cy5zaXplKCk7IGkgPiAwOyBpIC09IDEpIHsKLQkJCXByaW50KHRoaXMuaW5kZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlQWZ0ZXJOZXN0ZWRDb250ZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyAvLyBub3Qgc2VyaWFsaXplZAotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW5kV2l0aG91dFN0YXJ0RXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyAvLyBub3Qgc2VyaWFsaXplZAotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBFbmRXaXRob3V0U3RhcnRFcnJvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW5kV2l0aG91dFN0YXJ0RXJyb3IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjhjMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBBbGwgdGhlc2UgZXJyb3JzIGFyZSBib3VuZCB0byA1IGFyZ3M6IDAtbXNnLCAxLXJvb3QsIDItbmFtZSwgMy1saW5lLCA0LWNvbHVtbgotWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmU9RXJyb3IgYXQgbGluZSB7M317MX06IHswfQotWE1MUGFyc2VyX0Vycm9yX0F0X0xpbmVfQ29sdW1uPUVycm9yIGF0IGxpbmUgezN9LCBjb2x1bW4gezR9ezF9OiB7MH0KLVhNTFBhcnNlcl9FcnJvcl9BdF9OYW1lX0xpbmU9RXJyb3IgaW4gezJ9IGF0IGxpbmUgezN9OiB7MH0KLVhNTFBhcnNlcl9FcnJvcl9BdF9OYW1lX0xpbmVfQ29sdW1uPUVycm9yIGluIHsyfSBhdCBsaW5lIHszfSwgY29sdW1uIHs0fTogezB9Ci0KLVhNTFBhcnNlcl9Ob19TQVhfUGFyc2VyPVVuYWJsZSB0byBhY3F1aXJlIGEgU0FYIHBhcnNlciBzZXJ2aWNlLgotWE1MUGFyc2VyX01pc3NpbmdfUmVxdWlyZWRfQXR0cmlidXRlPU1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIGluICJ7MH0iOiB7MX0KLVhNTFBhcnNlcl9VbmV4cGVjdGVkX0F0dHJpYnV0ZT1VbmV4cGVjdGVkIGF0dHJpYnV0ZSBmb3IgZWxlbWVudCAiezB9IjogezF9PSJ7Mn0iCi1YTUxQYXJzZXJfSWxsZWdhbF9WYWx1ZV9Gb3JfQXR0cmlidXRlPUlsbGVnYWwgdmFsdWUgZm9yIGF0dHJpYnV0ZSAiezB9IiBvZiBlbGVtZW50ICJ7MX0iOiB7Mn0KLVhNTFBhcnNlcl9VbmV4cGVjdGVkX0VsZW1lbnQ9VW5leHBlY3RlZCBlbGVtZW50IGluIGVsZW1lbnQgInswfSI6IDx7MX17Mn0+Ci1YTUxQYXJzZXJfRHVwbGljYXRlX0VsZW1lbnQ9RHVwbGljYXRlIHNpbmdsZXRvbiBlbGVtZW50IGluIGVsZW1lbnQgInswfSI6IDx7MX17Mn0+Ci1YTUxQYXJzZXJfVW5leHBlY3RlZF9DaGFyYWN0ZXJfRGF0YT1VbmV4cGVjdGVkIGNoYXJhY3RlciBkYXRhIGluIGVsZW1lbnQgInswfSI6IHsxfQotWE1MUGFyc2VyX0VsZW1lbnRfTm90X0FsbG93ZWQ9RWxlbWVudCAiezB9IiBpcyBub3QgYWxsb3dlZCB3aXRoaW4gZWxlbWVudCAiezF9IgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjE0YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBBIGNoZWNrZWQgZXhjZXB0aW9uIGluZGljYXRpbmcgYSByZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm92aXNpb25pbmcuCi0gKiBUaGUgc3RhdHVzIHByb3ZpZGVzIGEgZnVydGhlciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS4KLSAqIDxwPgotICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFByb3Zpc2lvbkV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy9HZW5lcmFsIGFuZCBjb3JlIHN0YXR1cyBjb2RlcyBbMC0xMDAwXQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYW4gdW5jYXRlZ29yaXplZCBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDE7Ci0KLQkvL1JlcG9zaXRvcnkgc3RhdHVzIGNvZGVzIFsxMDAwLTE5OTldCi0JLy9HZW5lcmFsIHJlcG9zaXRvcnkgY29kZXMgWzEwMDAtMTA5OV0KLQkvKiogCi0JICogU3RhdHVzIGNvZGUgY29uc3RhbnQgKHZhbHVlIDEwMDApIGluZGljYXRpbmcgYSByZXBvc2l0b3J5Ci0JICogdW5leHBlY3RlZGx5IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfTk9UX0ZPVU5EID0gMTAwMDsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwMSkgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiB1bmV4cGVjdGVkbHkgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRVhJU1RTID0gMTAwMTsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwMikgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiBjb3VsZCBub3QgYmUgcmVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRkFJTEVEX1JFQUQgPSAxMDAyOwotCi0JLyoqIAotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxMDAzKSBpbmRpY2F0aW5nIGEgZmFpbHVyZSBvY2N1cnJlZAotCSAqIHdoaWxlIHdyaXRpbmcgdG8gYSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRkFJTEVEX1dSSVRFID0gMTAwMzsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwNCkgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiBjb3VsZCBub3QgYmUgd3JpdHRlbiBiZWNhdXNlIGl0IGlzIGEgcmVhZC1vbmx5IHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9SRUFEX09OTFkgPSAxMDA0OwotCi0JLyoqIAotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxMDA1KSBpbmRpY2F0aW5nIGFuIGF0dGVtcHQgd2FzCi0JICogbWFkZSB0byBjcmVhdGUgb3IgYWNjZXNzIGEgcmVwb3NpdG9yeSBvZiB1bmtub3duIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9VTktOT1dOX1RZUEUgPSAxMDA1OwotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwNikgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWVkCi0JICogcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3QgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9JTlZBTElEX0xPQ0FUSU9OID0gMTAwNjsKLQotCS8vTWV0YWRhdGEgcmVwb3NpdG9yeSBjb2RlcyBbMTEwMC0xMTk5XQotCi0JLy9BcnRpZmFjdCByZXBvc2l0b3J5IGNvZGVzIFsxMjAwLTEyOTldCi0KLQkvKiogCi0JICogU3RhdHVzIGNvZGUgY29uc3RhbnQgKHZhbHVlIDEyMDApIGluZGljYXRpbmcgYW4gYXJ0aWZhY3QgdW5leHBlY3RlZGx5Ci0JICogZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJUSUZBQ1RfTk9UX0ZPVU5EID0gMTIwMDsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTIwMSkgaW5kaWNhdGluZyBhbiBhcnRpZmFjdCB1bmV4cGVjdGVkbHkKLQkgKiBhbHJlYWR5IGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlRJRkFDVF9FWElTVFMgPSAxMjAxOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdC4gIFRoZSBtZXNzYWdlCi0JICogb2YgdGhlIGdpdmVuIHN0YXR1cyBpcyB1c2VkIGFzIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFByb3Zpc2lvbkV4Y2VwdGlvbihJU3RhdHVzIHN0YXR1cykgewotCQlzdXBlcihzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGEgc2V2ZXJpdHkgb2YgCi0JICoge0BsaW5rIElTdGF0dXMjRVJST1J9LgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIGh1bWFuLXJlYWRhYmxlIHByb2JsZW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBQcm92aXNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBjYXVzZSwgYW5kCi0JICogYSBzZXZlcml0eSBvZiB7QGxpbmsgSVN0YXR1cyNFUlJPUn0uCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgaHVtYW4tcmVhZGFibGUgcHJvYmxlbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlIFRoZSB1bmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUHJvdmlzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIGNhdXNlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL0lQcm92aXNpb25pbmdFdmVudEJ1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9ldmVudGJ1cy9JUHJvdmlzaW9uaW5nRXZlbnRCdXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmNmNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL0lQcm92aXNpb25pbmdFdmVudEJ1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3IuRXZlbnREaXNwYXRjaGVyOwotCi0vKioKLSAqIFRoZSBidXMgZm9yIGV2ZW50cyByZWxhdGVkIHRvIHByb3Zpc2lvbmluZy4gVGhpcyBzZXJ2aWNlIGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyCi0gKiBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgcHJvdmlzaW9uaW5nIGV2ZW50cywgb3IgdG8gYnJvYWRjYXN0IGV2ZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgewotCS8qKgotCSAqIFRoZSBuYW1lIHVzZWQgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgYnVzIHNlcnZpY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZExpc3RlbmVyKFByb3Zpc2lvbmluZ0xpc3RlbmVyIHRvQWRkKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUxpc3RlbmVyKFByb3Zpc2lvbmluZ0xpc3RlbmVyIHRvUmVtb3ZlKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2hFdmVudChFdmVudE9iamVjdCBldmVudCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9ldmVudGJ1cy9Qcm92aXNpb25pbmdMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9ldmVudGJ1cy9Qcm92aXNpb25pbmdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc2NDE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvZXZlbnRidXMvUHJvdmlzaW9uaW5nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLlByb3Zpc2lvbmluZ0V2ZW50QnVzOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCBpcyBub3RpZmllZCBhYm91dCBldmVudHMgcmVsYXRlZCB0byBwcm92aXNpb25pbmcuCi0gKiBAc2VlIFByb3Zpc2lvbmluZ0V2ZW50QnVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvdmlzaW9uaW5nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkvL1RPRE86IHJlbmFtZSB0aGlzIGludGVyZmFjZSB0byBtYXRjaCBlY2xpcHNlIGNvbnZlbnRpb25zIChJUHJvdmlzaW9uaW5nTGlzdGVuZXIpCi0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgYWJvdXQgYSBwcm92aXNpb25pbmcgZXZlbnQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9ldmVudGJ1cy9TeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL1N5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMmM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL1N5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lciBleHRlbmRzIFByb3Zpc2lvbmluZ0xpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9sb2NhdGlvbi9BZ2VudExvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2xvY2F0aW9uL0FnZW50TG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwZGY3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2xvY2F0aW9uL0FnZW50TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWdlbnRMb2NhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgVVJMIGdldEFydGlmYWN0UmVwb3NpdG9yeVVSTCgpOwotCi0JcHVibGljIFVSTCBnZXRNZXRhZGF0YVJlcG9zaXRvcnlVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlCi0JICogbWF5IHdyaXRlIGl0cyBhZ2VudC1yZWxhdGVkIGRhdGEuCi0JICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBidW5kbGUgc3RvcmluZyB0aGUgZGF0YQotCSAqIEByZXR1cm4gVGhlIGRhdGEgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgVVJMIGdldERhdGFBcmVhKFN0cmluZyBuYW1lc3BhY2UpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0dWFsIHtAbGluayBVUkx9IG9mIHRoaXMgbG9jYXRpb24uICBJZiB0aGUgbG9jYXRpb24ncyB2YWx1ZSBoYXMgYmVlbiBzZXQsIAotCSAqIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQuICBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCBhbmQgdGhlIGxvY2F0aW9uIGFsbG93cyBkZWZhdWx0cywgCi0JICogdGhlIHZhbHVlIGlzIHNldCB0byB0aGUgZGVmYXVsdCBhbmQgcmV0dXJuZWQuICBJbiBhbGwgb3RoZXIgY2FzZXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVUkwgZm9yIHRoaXMgbG9jYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9JUmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L0lSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDI0N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L0lSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIHByb3ZpZGVkIGJ5IAotICogdmFyaW91cyBraW5kcyBvZiByZXBvc2l0b3JpZXMuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVwb3NpdG9yeSBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKiAKLQkgKiBUaGUga2V5IGZvciBhIGJvb2xlYW4gcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXBvc2l0b3J5Ci0JICogaXMgYSBzeXN0ZW0gcmVwb3NpdG9yeS4gIFN5c3RlbSByZXBvc2l0b3JpZXMgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKLQkgKiB0aGF0IGFyZSBub3Qgc3ViamVjdCB0byBnZW5lcmFsIGFjY2VzcywgaGlkZGVuIGZyb20gdGhlIHR5cGljYWwgdXNlciwgZXRjLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1lTVEVNID0gInAyLnN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIGEgYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBpcwotCSAqIHN0b3JlZCBpbiBjb21wcmVzc2VkIGZvcm0uICBBIGNvbXByZXNzZWQgcmVwb3NpdG9yeSB3aWxsIGhhdmUgbG93ZXIKLQkgKiBiYW5kd2lkdGggY29zdCB0byByZWFkIHdoZW4gcmVtb3RlLCBidXQgaGlnaGVyIHByb2Nlc3NpbmcgY29zdCB0bwotCSAqIHVuY29tcHJlc3Mgd2hlbiByZWFkaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09NUFJFU1NFRCA9ICJwMi5jb21wcmVzc2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3IgYSBzdHJpbmcgcHJvcGVydHkgcHJvdmlkaW5nIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBwcm92aWRpbmcgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIGEgc3RyaW5nIHByb3BlcnR5IHByb3ZpZGluZyBhIFVSTCB0aGF0IGNhbiByZXR1cm4gbWlycm9ycyBvZiB0aGlzCi0JICogcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX01JUlJPUlNfVVJMID0gInAyLm1pcnJvcnNVUkwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSB0aW1lIHdoZW4gdGhlIHJlcG9zaXRvcnkgd2FzIGxhc3QgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9USU1FU1RBTVAgPSAicDIudGltZXN0YW1wIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSByZXBvc2l0b3J5IHR5cGUgY29uc3RhbnQgKHZhbHVlIDApIHJlcHJlc2VudGluZyBhIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NRVRBREFUQSA9IDA7Ci0KLQkvKioKLQkgKiBBIHJlcG9zaXRvcnkgdHlwZSBjb25zdGFudCAodmFsdWUgMSkgcmVwcmVzZW50aW5nIGFuIGFydGlmYWN0IHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUlRJRkFDVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogVE9ETzogU2hvdWxkIHdlIHVzZSBVUkwgb3IgVVJJPyBVUkwgcmVxdWlyZXMgYSBwcm90b2NvbCBoYW5kbGVyCi0JICogdG8gYmUgaW5zdGFsbGVkIGluIEphdmEuICBDYW4gdGhlIFVSTCBoYXZlIGFueSBwcm90b2NvbD8KLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIGZvciB0aGUgcmVwb3NpdG9yeSB0eXBlLgotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXBvc2l0b3J5IGNhbiBiZSBtb2RpZmllZC4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgcmVwb3NpdG9yeSBjYW4gYmUgbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIHRoZSBvbGQgcHJvcGVydHkKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXksIGlmIGFueS4gIFNldHRpbmcgYSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsCi0JICogcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGtleSBmcm9tIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBrZXkKLQkgKiBAcmV0dXJuIFRoZSBvbGQgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubyBvbGQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L1JlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L1JlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI1YTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5Q3JlYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeTsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTY0ODM4MjEyMTk2MzMxNzEwMEw7Ci0KLQlwdWJsaWMgUmVwb3NpdG9yeUNyZWF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L1JlcG9zaXRvcnlFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L1JlcG9zaXRvcnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY5NjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotLyoqCi0gKiBBbiBldmVudCBpbmRpY2F0aW5nIGEgcmVwb3NpdG9yeSB3YXMgYWRkZWQsIHJlbW92ZWQsIGNoYW5nZWQsCi0gKiBvciBkaXNjb3ZlcmVkLgotICogCi0gKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMwODI0MDI5MjA2MTcyODE3NjVMOwotCi0JLyoqCi0JICogQSBjaGFuZ2Uga2luZCBjb25zdGFudCAodmFsdWUgMCksIGluZGljYXRpbmcgYSByZXBvc2l0b3J5IHdhcyBhZGRlZCB0byB0aGUgCi0JICogbGlzdCBvZiByZXBvc2l0b3JpZXMga25vd24gdG8gYSByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURERUQgPSAwOwotCi0JLyoqCi0JICogQSBjaGFuZ2Uga2luZCBjb25zdGFudCAodmFsdWUgMSksIGluZGljYXRpbmcgYSByZXBvc2l0b3J5IHdhcyByZW1vdmVkIGZyb20gCi0JICogdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGtub3duIHRvIGEgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAxOwotCi0JLyoqCi0JICogQSBjaGFuZ2Uga2luZCBjb25zdGFudCAodmFsdWUgMiksIGluZGljYXRpbmcgYSByZXBvc2l0b3J5IGtub3duIHRvIGEgCi0JICogcmVwb3NpdG9yeSBtYW5hZ2VyIHdhcyBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKLQotCS8qKgotCSAqIEEgY2hhbmdlIGtpbmQgY29uc3RhbnQgKHZhbHVlIDQpLCBpbmRpY2F0aW5nIGEgbmV3IHJlcG9zaXRvcnkgd2FzIGRpc2NvdmVyZWQuCi0JICogVGhpcyBldmVudCBpcyBhIHdheSB0byBub3RpZnkgcmVwb3NpdG9yeSBtYW5hZ2VycyBpbiBhIGdlbmVyaWMgd2F5IGFib3V0Ci0JICogYSBuZXdseSBkaXNjb3ZlcmVkIHJlcG9zaXRvcnkuIFRoZSByZXBvc2l0b3J5IG1hbmFnZXIgd2lsbCB0eXBpY2FsbHkgcmVjZWl2ZQotCSAqIHRoaXMgZXZlbnQsIGFkZCB0aGUgcmVwb3NpdG9yeSB0byBpdHMgbGlzdCBvZiBrbm93biByZXBvc2l0b3JpZXMsIGFuZCBpc3N1ZQotCSAqIGEgc3Vic2VxdWVudCB7QGxpbmsgI0FEREVEfSBldmVudC4gT3RoZXIgY2xpZW50cyBzaG91bGQgbm90IHR5cGljYWxseQotCSAqIGxpc3RlbiBmb3IgdGhpcyBraW5kIG9mIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSRUQgPSA0OwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQga2luZCwgdHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVwb3NpdG9yeSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRoYXQgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcmVwb3NpdG9yeVR5cGUgdGhlIHR5cGUgb2YgcmVwb3NpdG9yeSB0aGF0IHdhcyBjaGFuZ2VkCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY2hhbmdlIHRoYXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIFJlcG9zaXRvcnlFdmVudChVUkwgbG9jYXRpb24sIGludCByZXBvc2l0b3J5VHlwZSwgaW50IGtpbmQpIHsKLQkJc3VwZXIobG9jYXRpb24pOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCQl0aGlzLnR5cGUgPSByZXBvc2l0b3J5VHlwZTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgY2hhbmdlIHRoYXQgb2NjdXJyZWQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGNoYW5nZSB0aGF0IG9jY3VycmVkLgotCSAqIEBzZWUgI0FEREVECi0JICogQHNlZSAjUkVNT1ZFRAotCSAqIEBzZWUgI0NIQU5HRUQKLQkgKiBAc2VlICNESVNDT1ZFUkVECi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFJlcG9zaXRvcnlMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChVUkwpIGdldFNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4gQ2xpZW50cwotCSAqIHNob3VsZCBub3QgYXNzdW1lIHRoYXQgdGhlIHNldCBvZiBwb3NzaWJsZSByZXBvc2l0b3J5IHR5cGVzIGlzIGNsb3NlZDsKLQkgKiBjbGllbnRzIHNob3VsZCBpZ25vcmUgZXZlbnRzIGZyb20gcmVwb3NpdG9yeSB0eXBlcyB0aGV5IGRvbid0IGtub3cgYWJvdXQuCi0JICogCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiByZXBvc2l0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgotCSAqICAoe0BsaW5rIElSZXBvc2l0b3J5I1RZUEVfTUVUQURBVEF9IG9yIHtAbGluayBJUmVwb3NpdG9yeSNUWVBFX0FSVElGQUNUfSkuCi0JICovCi0JcHVibGljIGludCBnZXRSZXBvc2l0b3J5VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9Db2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdhZmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgY29sbGVjdG9yIGlzIGEgZ2VuZXJpYyB2aXNpdG9yIHRoYXQgY29sbGVjdHMgb2JqZWN0cyBwYXNzZWQgdG8gaXQsCi0gKiBhbmQgY2FuIHRoZW4gZXhwcmVzcyB0aGUgcmVzdWx0IG9mIHRoZSB2aXNpdCBpbiB2YXJpb3VzIGZvcm1zLiBUaGUgY29sbGVjdG9yCi0gKiBjYW4gYWxzbyBzaG9ydC1jaXJjdWl0IGEgdHJhdmVyc2FsIGJ5IHJldHVybmluZyA8Y29kZT5mYWxzZTwvY29kZT4gZnJvbQotICogaXRzIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyBkZWZhdWx0IGNvbGxlY3RvciBqdXN0IGFjY2VwdHMgYWxsIG9iamVjdHMgcGFzc2VkIHRvIGl0LiAgQ2xpZW50cyBtYXkgc3ViY2xhc3MKLSAqIHRvIHBlcmZvcm0gZGlmZmVyZW50IHByb2Nlc3Npbmcgb24gdGhlIG9iamVjdHMgcGFzc2VkIHRvIGl0LgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdG9yIHsKLQlwcml2YXRlIEFycmF5TGlzdCBjb2xsZWN0ZWQgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb2xsZWN0b3IuCi0JICovCi0JcHVibGljIENvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBY2NlcHRzIGFuIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWRkcyB0aGUgb2JqZWN0cyB0byBhIGxpc3QuIENsaWVudHMgbWF5Ci0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGZpbHRlcmluZywgYWRkIGRpZmZlcmVudCBvYmplY3RzIAotCSAqIHRvIHRoZSBsaXN0LCBzaG9ydC1jaXJjdWl0IHRoZSB0cmF2ZXJzYWwsIG9yIHByb2Nlc3MgdGhlIG9iamVjdHMgZGlyZWN0bHkgd2l0aG91dCAKLQkgKiBjb2xsZWN0aW5nIHRoZW0uCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbGxlY3Qgb3IgdmlzaXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0cmF2ZXJzYWwgc2hvdWxkIGNvbnRpbnVlLAotCSAqIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGUgdHJhdmVyc2FsIHNob3VsZCBzdG9wLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCWdldExpc3QoKS5hZGQob2JqZWN0KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gY29sbGVjdCByZXN1bHRzLgotCSAqIEByZXR1cm4gdGhlIGxpc3QgYmVpbmcgdXNlZCB0byBjb2xsZWN0IHJlc3VsdHMuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TGlzdCgpIHsKLQkJaWYgKGNvbGxlY3RlZCA9PSBudWxsKQotCQkJY29sbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY29sbGVjdGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbGxlY3RvciBpcyBlbXB0eS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29sbGVjdG9yIGhhcyBhY2NlcHRlZCBhbnkgcmVzdWx0cywKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gY29sbGVjdGVkID09IG51bGwgfHwgY29sbGVjdGVkLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0ZWQgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG9mIHRoZSBjb2xsZWN0ZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBjb2xsZWN0ZWQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSA6IGNvbGxlY3RlZC5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2xsZWN0ZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBjb2xsZWN0ZWQgPT0gbnVsbCA/IDAgOiBjb2xsZWN0ZWQuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3RlZCBvYmplY3RzIGFzIGFuIGFycmF5Ci0JICogCi0JICogQHBhcmFtIGNsYXp6IFRoZSB0eXBlIG9mIGFycmF5IHRvIHJldHVybgotCSAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHJlc3VsdHMKLQkgKiBAdGhyb3dzIEFycmF5U3RvcmVFeGNlcHRpb24gdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzCi0JICogICAgICAgICBub3QgYSBzdXBlcnR5cGUgb2YgdGhlIHJ1bnRpbWUgdHlwZSBvZiBldmVyeSBjb2xsZWN0ZWQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoQ2xhc3MgY2xhenopIHsKLQkJaW50IHNpemUgPSBjb2xsZWN0ZWQgPT0gbnVsbCA/IDAgOiBjb2xsZWN0ZWQuc2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGNsYXp6LCBzaXplKTsKLQkJaWYgKHNpemUgIT0gMCkKLQkJCWNvbGxlY3RlZC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gdG9Db2xsZWN0aW9uKCkgewotCQlyZXR1cm4gY29sbGVjdGVkID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChjb2xsZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbXBvdW5kUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbXBvdW5kUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNzcwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9Db21wb3VuZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeTsKLQotLyoqCi0gKiBBIHF1ZXJ5IHRoYXQgY29tYmluZXMgYSBncm91cCBvZiBvdGhlciBxdWVyaWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG91bmRRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKLQlwcml2YXRlIGJvb2xlYW4gYW5kOwotCXByaXZhdGUgUXVlcnlbXSBxdWVyaWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvdW5kIHF1ZXJ5IHRoYXQgY29tYmluZXMgdGhlIGdpdmVuIHF1ZXJpZXMuIFRoZSBxdWVyaWVzCi0JICogd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhlIGNvbXBvdW5kIHF1ZXJ5IGluIHRoZSBnaXZlbiBvcmRlci4gVGhpcyBtZXRob2QKLQkgKiBtaWdodCBub3QgcGVyZm9ybSBhbGwgcXVlcmllcyBpZiBpdCBjYW4gZGV0ZXJtaW5lIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBvdW5kCi0JICogZXhwcmVzc2lvbiB3aXRob3V0IGRvaW5nIHNvLgotCSAqIAotCSAqIEBwYXJhbSBxdWVyaWVzIFRoZSBxdWVyaWVzIHRvIHBlcmZvcm0KLQkgKiBAcGFyYW0gYW5kIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcXVlcnkgcmVwcmVzZW50cyBhIGxvZ2ljYWwgJ2FuZCcsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIHF1ZXJ5IHJlcHJlc2VudHMgYSBsb2dpY2FsICdvcicuCi0JICovCi0JcHVibGljIENvbXBvdW5kUXVlcnkoUXVlcnlbXSBxdWVyaWVzLCBib29sZWFuIGFuZCkgewotCQl0aGlzLnF1ZXJpZXMgPSBxdWVyaWVzOwotCQl0aGlzLmFuZCA9IGFuZDsKLQl9Ci0KLQlwdWJsaWMgUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gcXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21wb3VuZCBxdWVyeSBjb21iaW5lcyBpdHMgcXVlcmllcyB3aXRoIGEgbG9naWNhbAotCSAqICdhbmQnIG9yICdvcicuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHF1ZXJ5IHJlcHJlc2VudHMgYSBsb2dpY2FsICdhbmQnLCBhbmQKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBxdWVyeSByZXByZXNlbnRzIGEgbG9naWNhbCAnb3InLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW5kKCkgewotCQlyZXR1cm4gYW5kOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkyLlF1ZXJ5I2lzTWF0Y2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHZhbGlkID0gcXVlcmllc1tpXS5pc01hdGNoKGNhbmRpZGF0ZSk7Ci0JCQkvLyBpZiB3ZSBhcmUgT1InaW5nIHRoZW4gdGhlIGZpcnN0IHRpbWUgd2UgZmluZCBhIHJlcXVpcmVtZW50IHRoYXQgaXMgbWV0LCByZXR1cm4gc3VjY2VzcwotCQkJaWYgKHZhbGlkICYmICFhbmQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZiB3ZSBhcmUgQU5EJ2luZyB0aGVuIHRoZSBmaXJzdCB0aW1lIHdlIGZpbmQgYSByZXF1aXJlbWVudCB0aGF0IGlzIE5PVCBtZXQsIHJldHVybiBmYWlsdXJlCi0JCQlpZiAoIXZhbGlkICYmIGFuZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gaWYgd2UgZ2V0IHBhc3QgdGhlIHJlcXVpcmVtZW50cyBjaGVjayBhbmQgd2UgYXJlIEFORCdpbmcgdGhlbiByZXR1cm4gdHJ1ZSAKLQkJLy8gc2luY2UgYWxsIHJlcXVpcmVtZW50cyBtdXN0IGhhdmUgYmVlbiBtZXQuICBJZiB3ZSBhcmUgT1InaW5nIHRoZW4gcmV0dXJuIGZhbHNlIAotCQkvLyBzaW5jZSBub25lIG9mIHRoZSByZXF1aXJlbWVudHMgd2VyZSBtZXQuCi0JCXJldHVybiBhbmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvSVF1ZXJ5YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvSVF1ZXJ5YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I3NmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0lRdWVyeWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQW4gSVF1ZXJ5YWJsZSBjb250YWlucyBvYmplY3RzLCBhbmQgaXMgYWJsZSB0byBwZXJmb3JtIHF1ZXJpZXMgb24gdGhvc2Ugb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVF1ZXJ5YWJsZSB7Ci0JLyoqCi0JICogUGVyZm9ybXMgYSBxdWVyeSwgcGFzc2luZyBhbnkgb2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhlCi0JICogcXVlcnkgdG8gdGhlIHByb3ZpZGVkIGNvbGxlY3Rvci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBsb25nLXJ1bm5pbmc7IHByb2dyZXNzIGFuZCBjYW5jZWxsYXRpb24gYXJlIHByb3ZpZGVkCi0JICogYnkgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IuIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHBlcmZvcm0KLQkgKiBAcGFyYW0gY29sbGVjdG9yIENvbGxlY3RzIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIFRoZSBjb2xsZWN0b3IgYXJndW1lbnQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L1F1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDY2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdXBlcmNsYXNzIG9mIGFsbCBxdWVyaWVzIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhbiB7QGxpbmsgSVF1ZXJ5YWJsZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gU3ViY2xhc3NlcyBzaG91bGQgc3BlY2lmeSB0aGUgdHlwZQotICogb2Ygb2JqZWN0IHRoZXkgc3VwcG9ydCBxdWVyeWluZyBvbi4gU3ViY2xhc3NlcyBhcmUgYWxzbyBlbmNvdXJhZ2VkIHRvIGNsZWFybHkKLSAqIHNwZWNpZnkgdGhlaXIgbWF0Y2ggYWxnb3JpdGhtLCBhbmQgZXhwb3NlIHRoZSBwYXJhbWV0ZXJzIGludm9sdmVkIGluIHRoZSBtYXRjaAotICogY29tcHV0YXRpb24sIHRvIGFsbG93IHtAbGluayBJUXVlcnlhYmxlfSBpbXBsZW1lbnRhdGlvbnMgdG8gb3B0aW1pemUgdGhlaXIKLSAqIGV4ZWN1dGlvbiBvZiB0aGUgcXVlcnkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdWVyeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeS4KLQkgKi8KLQlwdWJsaWMgUXVlcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3Qgc2F0aXNmaWVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgcXVlcnkuCi0JICogCi0JICogQHBhcmFtIGNhbmRpZGF0ZSBUaGUgb2JqZWN0IHRvIHBlcmZvcm0gdGhlIHF1ZXJ5IGFnYWluc3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1bml0IHNhdGlzZmllcyB0aGUgcGFyYW1ldGVycwotCSAqIG9mIHRoaXMgcXVlcnksIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKTsKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoaXMgcXVlcnkgb24gdGhlIGdpdmVuIGl0ZXJhdG9yLCBwYXNzaW5nIGFsbCBvYmplY3RzIGluIHRoZSBpdGVyYXRvciAKLQkgKiB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYSBvZiB0aGlzIHF1ZXJ5IHRvIHRoZSBnaXZlbiByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3RvciBwZXJmb3JtKEl0ZXJhdG9yIGl0ZXJhdG9yLCBDb2xsZWN0b3IgcmVzdWx0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjYW5kaWRhdGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXNNYXRjaChjYW5kaWRhdGUpKQotCQkJCXJlc3VsdC5hY2NlcHQoY2FuZGlkYXRlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9jb3JlL3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvY29yZS9yZXBvc2l0b3J5L0Fic3RyYWN0UmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjJmNjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9jb3JlL3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLQotLyoqCi0qIEFic3RyYWN0UmVwb3NpdG9yeSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIHByb3ZpZGVkIGJ5IHZhcmlvdXMga2luZHMKLSogb2YgcmVwb3NpdG9yaWVzLgotKiA8cD4KLSogQ2xpZW50cyBtYXkgZXh0ZW5kIHRoaXMgY2xhc3MuCi0qIDwvcD4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXBvc2l0b3J5IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJUmVwb3NpdG9yeSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFVSTCBsb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIE1hcCBwcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0UmVwb3NpdG9yeShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBVUkwgbG9jYXRpb24sIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHByb3ZpZGVyKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09IG51bGwgPyAiIiA6IGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHJvdmlkZXIgPSBwcm92aWRlciA9PSBudWxsID8gIiIgOiBwcm92aWRlcjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGlzIHJlcG9zaXRvcnkgaXMgbW9kaWZpYWJsZSwgdGhyb3dpbmcgYSBydW50aW1lIGV4Y2VwdGlvbiBpZgotCSAqIGl0IGlzIG5vdC4gVGhpcyBpcyBzdWl0YWJsZSBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUKLQkgKiB0byB3cml0ZSB0byBhIHJlcG9zaXRvcnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TW9kaWZpYWJsZSgpIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhpcyByZXBvc2l0b3J5LgotCSAqIFRPRE86IFNob3VsZCB3ZSB1c2UgVVJMIG9yIFVSST8gVVJMIHJlcXVpcmVzIGEgcHJvdG9jb2wgaGFuZGxlcgotCSAqIHRvIGJlIGluc3RhbGxlZCBpbiBKYXZhLiAgQ2FuIHRoZSBVUkwgaGF2ZSBhbnkgcHJvdG9jb2w/Ci0JICogQHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlYWQtb25seSBjb2xsZWN0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIE9yZGVyZWRQcm9wZXJ0aWVzLnVubW9kaWZpYWJsZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgcHJvdmlkZXIgb2YgdGhpcyByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFByb3ZpZGVyKCkgewotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIGZvciB0aGUgcmVwb3NpdG9yeSB0eXBlLgotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5uYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJYXNzZXJ0TW9kaWZpYWJsZSgpOwotCQlyZXR1cm4gKFN0cmluZykgKHZhbHVlID09IG51bGwgPyBwcm9wZXJ0aWVzLnJlbW92ZShrZXkpIDogcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXIpIHsKLQkJdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkZGNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyY19hbnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjAlRm91bmRhdGlvbi0xLjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDVkMWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1hbnRfdGFza3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBEaXJlY3RvciBBbnQgVGFza3MubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgRGlyZWN0b3IgQW50IFRhc2tzLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlOTk3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBEaXJlY3RvciBBbnQgVGFza3MubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjNkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIERpcmVjdG9yIEFudCBUYXNrcy5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUyM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjMyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI1RodSBOb3YgMDggMTE6MTU6MDggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODk5NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29uc29sZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUucGhhc2VzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcmsKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5hcHA7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTUwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1zb3VyY2UuYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXI9c3JjX2FudC8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXI9LixhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphcgotZXh0cmEuYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIgPSBwbGF0Zm9ybTovcGx1Z2luL29yZy5hcGFjaGUuYW50Ci1qYXJzLmV4dHJhLmNsYXNzcGF0aCA9IHBsYXRmb3JtOi9wbHVnaW4vb3JnLmFwYWNoZS5hbnQvbGliL2FudC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvY29uZmlnLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhZjU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIEVjbGlwc2UgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGUKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBtZXJnZWQgaW50byB0aGUgCi0jIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHN5c3RlbSBzdGFydHVwLiAgVGhlIHZhbHVlcyBjb250cm9sIHRoZSB3YXkgdGhlIAotIyBydW50aW1lIGlzIHN0cnVjdHVyZWQgYW5kIHJ1bnMuCi0KLSMgTm90ZTogIE9ubHkgcGxhdGZvcm06L2Jhc2UvIGFuZCBmaWxlOiBVUkxzIGFyZSBzdXBwb3J0ZWQuICBJbiBnZW5lcmFsIHRoZSAKLSMgVVJMcyBnaXZlbiBtYXkgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIChlLmcuLCAuLi4vbG9jYXRpb25fMS4yLjMpLiAgCi0jIElmIGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGJpbmRzCi0jIHRvIHRoZSBsb2NhdGlvbiB3aGljaCBtYXRjaGVzIGV4YWN0bHkgb3IgdG8gdGhlIHZlcnNpb25lZCBsb2NhdGlvbiB3aXRoIHRoZQotIyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuICBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGdpdmVuIHRoZW4gb25seSBleGFjdCBtYXRjaGVzCi0jIGFyZSBjb25zaWRlcmVkLgotCi0jIFRoZSBVUkwgZm9yIHRoZSBydW50aW1lIGVudHJ5IHBvaW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSMgcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpIAotI29zZ2kuZnJhbWV3b3JrPXBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaQotCi0jIFRoZSBjbGFzc3BhdGggZm9yIHRoZSBmcmFtZXdvcmsgZm91bmQgYXQgdGhlIG9zZ2kuZnJhbWV3b3JrIGxvY2F0aW9uLiAgVGhpcyAKLSMgY29tbWEtc2VwYXJhdGVkIGxpc3QgY29udGFpbnMgZWl0aGVyIFVSTHMgb3Igc2ltcGxlIGVsZW1lbnQgbmFtZXMuICBTaW1wbGUKLSMgbmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIGluc3RhbGwgZGlyZWN0b3J5LiAgCi0jIFR5cGljYWxseSB0aGlzIHZhbHVlIG5lZWQgbm90IGJlIHNldCBhcyBpdCBpcyBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrIGl0c2VsZi4KLSMgVmVyc2lvbiBtYXRjaCBzZWFyY2hpbmcgaXMgbm90IGRvbmUgZm9yIFVSTHMgbGlzdGVkIGhlcmUuCi0jb3NnaS5mcmFtZXdvcmtDbGFzc1BhdGggPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgdG8gc2VhcmNoIGZvciB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlIChzcGxhc2guYm1wKS4KLSMgRm9yIGVhY2ggbGlzdCBlbGVtZW50IGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBubC88bG9jYWxlPiBpcyBzZWFyY2hlZC4KLSMgVGhlIHN5c3RlbSBiaW5kcyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgZmlsZS4gIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0jb3NnaS5zcGxhc2hQYXRoPQotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZXQgYXQgc3lzdGVtIHN0YXJ0dXAgaXQgaXMgdXNlZCAKLSMgaW4gZmF2b3VyIG9mIHRoZSBvc2dpLnNwbGFzaFBhdGggc2VhcmNoaW5nIG91dGxpbmVkIGFib3ZlLiAgSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLgotI29zZ2kuc3BsYXNoTG9jYXRpb24gPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkCi0jIG9uY2UgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gIEVhY2ggZW50cnkgaWYgb2YgdGhlIGZvcm0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAIFs8c3RhcnRsZXZlbD5dIFsiOnN0YXJ0Il1dCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLgotIyBJZiB0aGUgInN0YXJ0IiB0YWcgaXMgYWRkZWQgdGhlbiB0aGUgYnVuZGxlIHdpbGwgYmUgbWFya2VkIGFzIHN0YXJ0ZWQgYWZ0ZXIgYmVpbmcgaW5zdGFsbGVkLgotIyBTaW1wbGUgYnVuZGxlIGxvY2F0aW9ucyBhcmUgaW50ZXJlcHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBwYXJlbnQgZGlyZWN0b3J5LgotIyBUaGUgc3RhcnRsZXZlbCBpbmRpY2F0ZXMgdGhlIE9TR2kgc3RhcnQgbGV2ZWwgYXQgd2hpY2ggdGhlIGJ1bmRsZSBzaG91bGQgcnVuLgotb3NnaS5idW5kbGVzPVwKLQlvcmcuZWNsaXBzZS5jb3JlLmpvYnMsXAotCW9yZy5lY2xpcHNlLmVjZixcCi0Jb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixcCi0Jb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5LFwKLQlvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIub3BlcmF0aW9ucyxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3JAc3RhcnQsXAotCW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMsXAotCW9yZy5zYXQ0ai5jb3JlLFwKLQlvcmcuc2F0NGoucGIKLQotb3JnLmVjbGlwc2UudXBkYXRlLnJlY29uY2lsZT1mYWxzZQotCi0jIFRoZSBwcm9kdWN0IHRvIHJ1bi4gIEEgZ2l2ZW4gRWNsaXBzZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG1hbnkgcHJvZHVjdHMuCi0jIFRoZSBwcm9kdWN0IGlkZW50aWZpZWQgd2lsbCBzdXBwbHkgdGhlIGJyYW5kaW5nICh3aW5kb3cgaWNvbnMsIHRpdGxlIGJhciB0ZXh0KSBldGMgCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIAotI2VjbGlwc2UucHJvZHVjdD0KLQotIyBUaGUgYXBwbGljYXRpb24gdG8gcnVuLiAgVGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIGlzIHRoZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uCi0jIHRoZSBydW50aW1lIHdpbGwgZmluZCwgaW5zdGFudGlhdGUgYW5kIGV4ZWN1dGUgb25jZSB0aGUgc3lzdGVtIGlzIHVwLiAgTm90ZSB0aGF0IHR5cGljYWxseSAKLSMgdGhlIGlkZW50aWZpZWQgZWNsaXBzZS5wcm9kdWN0IGRlZmluZXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdG8gcnVuLgotI2VjbGlwc2UuYXBwbGljYXRpb249Ci0KLSMgVGhlIGJ1aWxkIGlkZW50aWZpZXIKLWVjbGlwc2UuYnVpbGRJZD1AYnVpbGRACi0KLSMgRW5kIG9mIGZpbGUgbWFya2VyIC0gbXVzdCBiZSBoZXJlCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9kaXJlY3RvciBhcHAubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9kaXJlY3RvciBhcHAubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM1ODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvZGlyZWN0b3IgYXBwLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL2RpcmVjdG9yIGFwcCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5hcHBsaWNhdGlvbiYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6QzovZXF1aW5veC5wMi9zZXJ2ZXJzLyYjMTM7JiMxMDstYXJ0aWZhY3RSZXBvc2l0b3J5IGZpbGU6QzovZXF1aW5veC5wMi9zZXJ2ZXJzLyYjMTM7JiMxMDstaW5zdGFsbElVIHNkayYjMTM7JiMxMDstZGVzdGluYXRpb24gYzovZXF1aW5veC5wMi9lY2xpcHNlQXBwJiMxMzsmIzEwOy1mbGF2b3IgdG9vbGluZyYjMTM7JiMxMDstcHJvZmlsZSBmb28iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItRGVjbGlwc2UucDIuZGF0YS5hcmVhPWM6L2VxdWlub3gucDIvYWdlbnREYXRhIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSozLjIuMjAwLnYyMDA3MDcxN0BkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjMuMTAwLnYyMDA4MDIyNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5uZXQqMS4wLjEwMC5JMjAwODAyMjZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaSozLjQuMC52MjAwODAzMDRAOixvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoKjMuMi4xMDAudjIwMDcwNTAyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuc2F0NGoucGIqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyKjEuNi4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjQuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5zYXQ0ai5jb3JlKjIuMC4wLnYyMDA4MDMwN0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjEuMy4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvZGlyZWN0b3IucHJvZHVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvZGlyZWN0b3IucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhNmU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2RpcmVjdG9yLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVxdWlub3ggUHJvdmlzaW9uaW5nIERpcmVjdG9yIiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAucHJvZHVjdCIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLmFwcGxpY2F0aW9uIiB1c2VGZWF0dXJlcz0idHJ1ZSI+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJjdXN0b20iIHBhdGg9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9jb25maWcuaW5pIi8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzTWFjPi1Yc3RhcnRPbkZpcnN0VGhyZWFkIC1Eb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5zbWFsbEZvbnRzPC92bUFyZ3NNYWM+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPGxhdW5jaGVyIG5hbWU9ImVjbGlwc2UiPgotICAgICAgPHNvbGFyaXMvPgotICAgICAgPHdpbiB1c2VJY289ImZhbHNlIj4KLSAgICAgICAgIDxibXAvPgotICAgICAgPC93aW4+Ci0gICA8L2xhdW5jaGVyPgotCi0gICA8dm0+Ci0gICA8L3ZtPgotCi0gICA8cGx1Z2lucz4KLSAgIDwvcGx1Z2lucz4KLQotICAgPGZlYXR1cmVzPgotICAgICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuZmVhdHVyZSIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5yY3AiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8L2ZlYXR1cmVzPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5M2FmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBEaXJlY3RvciBBcHBsaWNhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2MGMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uIGlkPSJhcHBsaWNhdGlvbiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPiAKLSAgICAgIDxhcHBsaWNhdGlvbj4gCi0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLmFwcC5BcHBsaWNhdGlvbiIvPiAKLSAgICAgIDwvYXBwbGljYXRpb24+IAotICAgPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIGlkPSJwcm9kdWN0IgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgIDxwcm9kdWN0Ci0gICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLmFwcGxpY2F0aW9uIgotICAgICAgICAgIG5hbWU9IkVxdWlub3ggUHJvdmlzaW9uaW5nIERpcmVjdG9yIj4KLSAgICA8L3Byb2R1Y3Q+Ci0gPC9leHRlbnNpb24+IAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VGFza3MiPgotCQk8YW50VGFzawotCQkJbGlicmFyeT0iYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIiCi0JCQluYW1lPSJwMi5kaXJlY3RvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5hbnQuRGlyZWN0b3JUYXNrIj4KLQkJPC9hbnRUYXNrPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzIj4KLQkJPGV4dHJhQ2xhc3NwYXRoRW50cnkgbGlicmFyeT0iYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGYxZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLCBhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphciI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vYW50X3Rhc2tzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8zLjEuMCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImFudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyIj4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyLmJpbiIgZmFpbG9uZXJyb3I9InRydWUiIHZlcmJvc2U9InRydWUiIGRlYnVnPSJvbiI+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxkaXJzZXQgZGlyPSIke2Jhc2VkaXJ9Ly4uIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvYmluIi8+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLm9zZ2kvYmluIi8+Ci0JCQkJPC9kaXJzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UuaG9tZX0iPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJwbHVnaW5zL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwKi5qYXIiLz4KLQkJCQkJPGluY2x1ZGUgbmFtZT0icGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpKi5qYXIiLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJCTxzcmMgcGF0aD0ic3JjX2FudC8iLz4KLQkJPC9qYXZhYz4KLQkJPCEtLSBjb3B5IG5lY2Vzc2FyeSByZXNvdXJjZXMgLS0+Ci0JCTxjb3B5IHRvZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iPgotCQkJPGZpbGVzZXQgZGlyPSJzcmNfYW50LyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgotCQk8L2NvcHk+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2RpcmVjdG9yLWFudC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9kaXJlY3Rvci1hbnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDQwM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5hcHA7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGJ1bmRsZUNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlidW5kbGVDb250ZXh0ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ZDNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLmFwcDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGUuUHJvdmlzaW9uaW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlcy5TaXppbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCXByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uOwotCXByaXZhdGUgVVJMIGFydGlmYWN0UmVwb3NpdG9yeUxvY2F0aW9uOwotCXByaXZhdGUgVVJMIG1ldGFkYXRhUmVwb3NpdG9yeUxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIHJvb3Q7Ci0JcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZVByb3BlcnRpZXM7IC8vIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgcGFpcnMgInRhZz12YWx1ZSIKLQlwcml2YXRlIGJvb2xlYW4gaW5zdGFsbDsKLQlwcml2YXRlIFN0cmluZyBidW5kbGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBubDsKLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyBhcmNoOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgYm9vbGVhbiByb2FtaW5nUHJvZmlsZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydGllcyB2YWx1ZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAob3MgIT0gbnVsbCkKLQkJCXZhbHVlcy5wdXQoIm9zZ2kub3MiLCBvcyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5sICE9IG51bGwpCi0JCQl2YWx1ZXMucHV0KCJvc2dpLm5sIiwgbmwpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3cyAhPSBudWxsKQotCQkJdmFsdWVzLnB1dCgib3NnaS53cyIsIHdzKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYXJjaCAhPSBudWxsKQotCQkJdmFsdWVzLnB1dCgib3NnaS5hcmNoIiwgYXJjaCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhbHVlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRvU3RyaW5nKHZhbHVlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1yb2FtaW5nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJvYW1pbmdQcm9maWxlID0gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCi0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdAotCQkJLy8gYXJndW1lbnQgb3IKLQkJCS8vIGlmIHRoZSBuZXh0IG9uZQotCQkJLy8gaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSBhbiBhcmcKLQkJCS8vIHdpdGgKLQkJCS8vIGEgcGFybSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1wcm9maWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9maWxlSWQgPSBhcmc7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItcHJvZmlsZVByb3BlcnRpZXMiKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItcHJvcHMiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHJvZmlsZVByb3BlcnRpZXMgPSBhcmc7Ci0KLQkJCS8vIHdlIGNyZWF0ZSBhIHBhdGggb2JqZWN0IGhlcmUgdG8gaGFuZGxlIC4uLyBlbnRyaWVzIGluIHRoZSBtaWRkbGUgb2YgcGF0aHMKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZGVzdGluYXRpb24iKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZGVzdCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlkZXN0aW5hdGlvbiA9IG5ldyBQYXRoKGFyZykudG9PU1N0cmluZygpOwotCi0JCQkvLyB3ZSBjcmVhdGUgYSBwYXRoIG9iamVjdCBoZXJlIHRvIGhhbmRsZSAuLi8gZW50cmllcyBpbiB0aGUgbWlkZGxlIG9mIHBhdGhzCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWJ1bmRsZXBvb2wiKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItYnAiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYnVuZGxlUG9vbCA9IG5ldyBQYXRoKGFyZykudG9PU1N0cmluZygpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLW1ldGFkYXRhUmVwb3NpdG9yeSIpIHx8IGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1tciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltZXRhZGF0YVJlcG9zaXRvcnlMb2NhdGlvbiA9IG5ldyBVUkwoYXJnKTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnkiKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItYXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZmxhdm9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlmbGF2b3IgPSBhcmc7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItaW5zdGFsbElVIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJvb3QgPSBhcmc7Ci0JCQkJaW5zdGFsbCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItdmVyc2lvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2ZXJzaW9uID0gbmV3IFZlcnNpb24oYXJnKTsKLQkJCX0KLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi11bmluc3RhbGxJVSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyb290ID0gYXJnOwotCQkJCWluc3RhbGwgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1wMi5vcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcyA9IGFyZzsKLQkJCX0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItcDIud3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd3MgPSBhcmc7Ci0JCQl9Ci0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXAyLm5sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5sID0gYXJnOwotCQkJfQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1wMi5hcmNoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWFyY2ggPSBhcmc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFpcnMJYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0YWc9dmFsdWUgcGFpcnMKLQkgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgY29sbGVjdGlvbiBpbnRvIHdoaWNoIHRoZSBwYWlycyBhcmUgcHV0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHB1dFByb3BlcnRpZXMoU3RyaW5nIHBhaXJzLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFpcnMsICIsIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBuZXh0ID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWludCBpID0gbmV4dC5pbmRleE9mKCc9Jyk7Ci0JCQlpZiAoaSA+IDAgJiYgaSA8IG5leHQubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJU3RyaW5nIHRhZyA9IG5leHQuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBuZXh0LnN1YnN0cmluZyhpICsgMSwgbmV4dC5sZW5ndGgoKSkudHJpbSgpOwotCQkJCWlmICh0YWcubGVuZ3RoKCkgPiAwICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQlwcm9wZXJ0aWVzLnB1dCh0YWcsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJ1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9uZyB0aW1lID0gLVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhhcmdzKTsKLQotCQlpZiAocHJvZmlsZUlkID09IG51bGwpCi0JCQlwcm9maWxlSWQgPSBJUHJvZmlsZVJlZ2lzdHJ5LlNFTEY7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGRlc3RpbmF0aW9uKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfRkxBVk9SLCBmbGF2b3IpOwotCQkJaWYgKGJ1bmRsZVBvb2wgIT0gbnVsbCkKLQkJCQlpZiAoYnVuZGxlUG9vbC5lcXVhbHMoTWVzc2FnZXMuZGVzdGluYXRpb25fY29tbWFuZGxpbmUpKQotCQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFLCBkZXN0aW5hdGlvbik7Ci0JCQkJZWxzZQotCQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFLCBidW5kbGVQb29sKTsKLQkJCWlmIChyb2FtaW5nUHJvZmlsZSkKLQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX1JPQU1JTkcsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQotCQkJU3RyaW5nIGVudiA9IGdldEVudmlyb25tZW50UHJvcGVydHkoKTsKLQkJCWlmIChlbnYgIT0gbnVsbCkKLQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUywgZW52KTsKLQkJCWlmIChwcm9maWxlUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkJcHV0UHJvcGVydGllcyhwcm9maWxlUHJvcGVydGllcywgcHJvcHMpOwotCQkJfQotCQkJcHJvZmlsZSA9IFByb3Zpc2lvbmluZ0hlbHBlci5hZGRQcm9maWxlKHByb2ZpbGVJZCwgcHJvcHMpOwotCQkJU3RyaW5nIGN1cnJlbnRGbGF2b3IgPSBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfRkxBVk9SKTsKLQkJCWlmIChjdXJyZW50Rmxhdm9yICE9IG51bGwgJiYgIWN1cnJlbnRGbGF2b3IuZW5kc1dpdGgoZmxhdm9yKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5JbmNvbnNpc3RlbnRfZmxhdm9yKTsKLQkJfQotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkaXJlY3RvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuTWlzc2luZ19kaXJlY3Rvcik7Ci0KLQkJSVBsYW5uZXIgcGxhbm5lciA9IChJUGxhbm5lcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGFubmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5NaXNzaW5nX3BsYW5uZXIpOwotCi0JCUlFbmdpbmUgZW5naW5lID0gKElFbmdpbmUpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJRW5naW5lLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChlbmdpbmUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLk1pc3NpbmdfRW5naW5lKTsKLQotCQlQcm92aXNpb25pbmdIZWxwZXIuYWRkQXJ0aWZhY3RSZXBvc2l0b3J5KGFydGlmYWN0UmVwb3NpdG9yeUxvY2F0aW9uKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG9zaXRvcnkgPSBQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KG1ldGFkYXRhUmVwb3NpdG9yeUxvY2F0aW9uKTsKLQkJVmVyc2lvblJhbmdlIHJhbmdlID0gdmVyc2lvbiA9PSBudWxsID8gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgOiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpOwotCQlJSW5zdGFsbGFibGVVbml0W10gcm9vdHMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBtZXRhZGF0YVJlcG9zaXRvcnkucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KHJvb3QsIHJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCQlQcm92aXNpb25pbmdQbGFuIHJlc3VsdCA9IG51bGw7Ci0JCUlTdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gbnVsbDsKLQkJUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJaWYgKHJvb3RzLmxlbmd0aCA+IDApIHsKLQkJCWlmIChpbnN0YWxsKSB7Ci0JCQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHJvb3RzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKHJvb3RzKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBjb250ZXh0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmICghcmVzdWx0LmdldFN0YXR1cygpLmlzT0soKSkKLQkJCQlvcGVyYXRpb25TdGF0dXMgPSByZXN1bHQuZ2V0U3RhdHVzKCk7Ci0JCQllbHNlIHsKLQkJCQlTaXppbmcgc2l6ZUNvbXB1dGVyID0gbmV3IFNpemluZygxMDAsICJDb21wdXRlIHNpemVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQaGFzZVNldCBzZXQgPSBuZXcgUGhhc2VTZXQobmV3IFBoYXNlW10ge3NpemVDb21wdXRlcn0pIHsvKmVtcHR5ICovfTsKLQkJCQlvcGVyYXRpb25TdGF0dXMgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBzZXQsIHJlc3VsdC5nZXRPcGVyYW5kcygpLCBjb250ZXh0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuRGlza19zaXplICsgc2l6ZUNvbXB1dGVyLmdldERpc2tTaXplKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5Eb3dubG9hZF9zaXplICsgc2l6ZUNvbXB1dGVyLmdldERsU2l6ZSgpKTsKLQkJCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQkJCWlmIChpbnN0YWxsKQotCQkJCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMocm9vdHMpOwotCQkJCWVsc2UKLQkJCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKHJvb3RzKTsKLQkJCQlvcGVyYXRpb25TdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvcGVyYXRpb25TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5NaXNzaW5nX0lVLCByb290KSk7Ci0JCX0KLQotCQl0aW1lICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAob3BlcmF0aW9uU3RhdHVzLmlzT0soKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKGluc3RhbGwgPyBNZXNzYWdlcy5JbnN0YWxsYXRpb25fY29tcGxldGUgOiBNZXNzYWdlcy5Vbmluc3RhbGxhdGlvbl9jb21wbGV0ZSwgbmV3IExvbmcodGltZSkpKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnN0YWxsID8gTWVzc2FnZXMuSW5zdGFsbGF0aW9uX2ZhaWxlZCA6IE1lc3NhZ2VzLlVuaW5zdGFsbGF0aW9uX2ZhaWxlZCArIG9wZXJhdGlvblN0YXR1cyk7Ci0JCQlMb2dIZWxwZXIubG9nKG9wZXJhdGlvblN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RhcnQob3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBydW4oKFN0cmluZ1tdKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vbm90aGluZyB0byBkbwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFByb3BlcnRpZXMgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEVudW1lcmF0aW9uIGl0ZXIgPSBjb250ZXh0LmtleXMoKTsgaXRlci5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHRFbGVtZW50KCk7Ci0JCQlyZXN1bHQuYXBwZW5kKGtleSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCc9Jyk7Ci0JCQlyZXN1bHQuYXBwZW5kKGNvbnRleHQuZ2V0KGtleSkpOwotCQkJaWYgKGl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJcmVzdWx0LmFwcGVuZCgnLCcpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhYTE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5hcHAubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzdGluYXRpb25fY29tbWFuZGxpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlza19zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkX3NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5jb25zaXN0ZW50X2ZsYXZvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxhdGlvbl9jb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmluc3RhbGxhdGlvbl9jb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25fZmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuaW5zdGFsbGF0aW9uX2ZhaWxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfZGlyZWN0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19FbmdpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19JVTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3BsYW5uZXI7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vZW1wdHkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4OTlkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZGVzdGluYXRpb25fY29tbWFuZGxpbmU9PGRlc3RpbmF0aW9uPgotRGlza19zaXplPUVzdGltYXRlZCBzaXplIG9uIGRpc2sgCi1Eb3dubG9hZF9zaXplPUVzdGltYXRlZCBkb3dubG9hZCBzaXplIAotSW5jb25zaXN0ZW50X2ZsYXZvcj1JbnN0YWxsIGZsYXZvciBub3QgY29uc2lzdGVudCB3aXRoIHByb2ZpbGUgZmxhdm9yCi0KLUluc3RhbGxhdGlvbl9jb21wbGV0ZT1JbnN0YWxsYXRpb24gY29tcGxldGVkIGluIHswfSBtcy4KLVVuaW5zdGFsbGF0aW9uX2NvbXBsZXRlPVVuaW5zdGFsbGF0aW9uIGNvbXBsZXRlZCBpbiB7MH0gbXMuCi1JbnN0YWxsYXRpb25fZmFpbGVkPUluc3RhbGxhdGlvbiBmYWlsZWQuCi1Vbmluc3RhbGxhdGlvbl9mYWlsZWQ9VW5pbnN0YWxsYXRpb24gZmFpbGVkLgotCi1NaXNzaW5nX2RpcmVjdG9yPURpcmVjdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQKLU1pc3NpbmdfRW5naW5lPUVuZ2luZSBjb3VsZCBub3QgYmUgbG9hZGVkCi1NaXNzaW5nX0lVPVRoZSBpbnN0YWxsYWJsZSB1bml0IHswfSBoYXMgbm90IGJlZW4gZm91bmQuCi1NaXNzaW5nX3BsYW5uZXI9UGxhbm5lciBjb3VsZCBub3QgYmUgbG9hZGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9kaXJlY3Rvci9hcHAvYW50L0RpcmVjdG9yVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvcDIvZGlyZWN0b3IvYXBwL2FudC9EaXJlY3RvclRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0MzBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9kaXJlY3Rvci9hcHAvYW50L0RpcmVjdG9yVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLmFudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLmFwcC5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBBbiBBbnQgdGFzayB0byBjYWxsIHRoZSBwMiBEaXJlY3RvciBhcHBsaWNhdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3JUYXNrIGV4dGVuZHMgVGFzayB7Ci0KLQlib29sZWFuIHJvYW1pbmc7Ci0JU3RyaW5nIHByb2ZpbGUsIGZsYXZvciwgb3MsIHdzLCBubCwgYXJjaCwgaW5zdGFsbElVLCB1bmluc3RhbGxJVTsKLQlGaWxlIGRlc3RpbmF0aW9uLCBidW5kbGVQb29sOwotCVVSTCBtZXRhZGF0YVJlcG9zaXRvcnksIGFydGlmYWN0UmVwb3NpdG9yeTsKLQlWZXJzaW9uIHZlcnNpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBjb2xsZWN0IHRoZSBhcmd1bWVudHMgYW5kIGNhbGwgdGhlIGFwcGxpY2F0aW9uCi0JCQluZXcgQXBwbGljYXRpb24oKS5ydW4oZ2V0QXJndW1lbnRzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyB0aGUgZGlyZWN0b3IgdGFzay4iLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJvYW1pbmcpCi0JCQlyZXN1bHQuYWRkKCItcm9hbWluZyIpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItcHJvZmlsZSIpOwotCQkJcmVzdWx0LmFkZChwcm9maWxlKTsKLQkJfQotCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLWRlc3RpbmF0aW9uIik7Ci0JCQlyZXN1bHQuYWRkKGRlc3RpbmF0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAoYnVuZGxlUG9vbCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItYnVuZGxlUG9vbCIpOwotCQkJcmVzdWx0LmFkZChidW5kbGVQb29sLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGQoIi1tZXRhZGF0YVJlcG9zaXRvcnkiKTsKLQkJCXJlc3VsdC5hZGQobWV0YWRhdGFSZXBvc2l0b3J5LnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JCWlmIChhcnRpZmFjdFJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLWFydGlmYWN0UmVwb3NpdG9yeSIpOwotCQkJcmVzdWx0LmFkZChhcnRpZmFjdFJlcG9zaXRvcnkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0KLQkJaWYgKGZsYXZvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItZmxhdm9yIik7Ci0JCQlyZXN1bHQuYWRkKGZsYXZvcik7Ci0JCX0KLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXZlcnNpb24iKTsKLQkJCXJlc3VsdC5hZGQodmVyc2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlpZiAob3MgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLm9zIik7Ci0JCQlyZXN1bHQuYWRkKG9zKTsKLQkJfQotCQlpZiAod3MgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLndzIik7Ci0JCQlyZXN1bHQuYWRkKHdzKTsKLQkJfQotCQlpZiAoYXJjaCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItcDIuYXJjaCIpOwotCQkJcmVzdWx0LmFkZChhcmNoKTsKLQkJfQotCQlpZiAobmwgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLm5sIik7Ci0JCQlyZXN1bHQuYWRkKG5sKTsKLQkJfQotCQlpZiAoaW5zdGFsbElVICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGQoIi1pbnN0YWxsSVUiKTsKLQkJCXJlc3VsdC5hZGQoaW5zdGFsbElVKTsKLQkJfQotCQlpZiAodW5pbnN0YWxsSVUgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXVuaW5zdGFsbElVIik7Ci0JCQlyZXN1bHQuYWRkKHVuaW5zdGFsbElVKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyB2YWx1ZSkgewotCQlhcmNoID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJYXJ0aWZhY3RSZXBvc2l0b3J5ID0gbmV3IFVSTCh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHNldHRpbmcgdGhlIGFydGlmYWN0IHJlcG9zaXRvcnkuIiwgZSwgUHJvamVjdC5NU0dfRVJSKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZVBvb2woU3RyaW5nIHZhbHVlKSB7Ci0JCWJ1bmRsZVBvb2wgPSBuZXcgRmlsZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCWRlc3RpbmF0aW9uID0gbmV3IEZpbGUodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgdmFsdWUpIHsKLQkJZmxhdm9yID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbElVKFN0cmluZyB2YWx1ZSkgewotCQlpbnN0YWxsSVUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQltZXRhZGF0YVJlcG9zaXRvcnkgPSBuZXcgVVJMKHZhbHVlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igc2V0dGluZyB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeS4iLCBlLCBQcm9qZWN0Lk1TR19FUlIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmwoU3RyaW5nIHZhbHVlKSB7Ci0JCW5sID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3MoU3RyaW5nIHZhbHVlKSB7Ci0JCW9zID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZShTdHJpbmcgdmFsdWUpIHsKLQkJcHJvZmlsZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvYW1pbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCXJvYW1pbmcgPSBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuaW5zdGFsbElVKFN0cmluZyB2YWx1ZSkgewotCQl1bmluc3RhbGxJVSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXZlcnNpb24gPSBuZXcgVmVyc2lvbih2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3MoU3RyaW5nIHZhbHVlKSB7Ci0JCXdzID0gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjM3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1MjNjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ1MDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTc6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTNkZDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucm9sbGJhY2s7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLkRpcmVjdG9yQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuc2F0NGouY29yZTtidW5kbGUtdmVyc2lvbj0iMi4wLjAiLAotIG9yZy5zYXQ0ai5wYjtidW5kbGUtdmVyc2lvbj0iMi4wLjAiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNkOWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgRGlyZWN0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvQmFzaWNJVUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0Jhc2ljSVVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwYjMwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvQmFzaWNJVUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0lVRmlsdGVyIGV4dGVuZHMgSVVGaWx0ZXIgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIGFjY2VwdGVkOwotCi0JcHVibGljIEJhc2ljSVVGaWx0ZXIoSUluc3RhbGxhYmxlVW5pdFtdIGFjY2VwdGVkKSB7Ci0JCXRoaXMuYWNjZXB0ZWQgPSBhY2NlcHRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWNjZXB0ZWRbaV0uZXF1YWxzKGl1KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvRGlyZWN0b3JBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9EaXJlY3RvckFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2QyMGI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9EaXJlY3RvckFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3JBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0RJUkVDVE9SID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRleHQgPSBjdHg7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0hhc01hdGNoQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSGFzTWF0Y2hDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4OWQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSGFzTWF0Y2hDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci0KLS8qKgotICogQSBjb2xsZWN0b3IgdGhhdCBzaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guCi0gKi8KLXB1YmxpYyBjbGFzcyBIYXNNYXRjaENvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvciB7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iamVjdCkgewotCQloYXNNYXRjaCA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gIWhhc01hdGNoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0NWFiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSVVGaWx0ZXIgewotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChJSW5zdGFsbGFibGVVbml0IGl1KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9JVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVQcm9maWxlUHJvcGVydHlRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdjYWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9JVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotLyoqCi0gKiBBIHF1ZXJ5IHRoYXQgc2VhcmNoZXMgZm9yIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBpbnN0YW5jZXMgdGhhdCBoYXZlCi0gKiBhIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByb2ZpbGUsIHdob3NlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgSVVQcm9maWxlUHJvcGVydHlRdWVyeSBleHRlbmRzIElVUHJvcGVydHlRdWVyeSB7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIElVUHJvZmlsZVByb3BlcnR5UXVlcnkoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJc3VwZXIocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVQcm9wZXJ0eVF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVQcm9wZXJ0eVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjA3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVUHJvcGVydHlRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLQotLyoqCi0gKiBBIHF1ZXJ5IHRoYXQgc2VhcmNoZXMgZm9yIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBpbnN0YW5jZXMgdGhhdCBoYXZlCi0gKiBhIHByb3BlcnR5IHdob3NlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgSVVQcm9wZXJ0eVF1ZXJ5IGV4dGVuZHMgUXVlcnkgewotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIElVUHJvcGVydHlRdWVyeShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5Mi5RdWVyeSNpc01hdGNoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJSW5zdGFsbGFibGVVbml0IGNhbmRpZGF0ZSA9IChJSW5zdGFsbGFibGVVbml0KSBvYmplY3Q7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KGNhbmRpZGF0ZSwgcHJvcGVydHlOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKHByb3BlcnR5VmFsdWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpdS5nZXRQcm9wZXJ0eShuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVUcmFuc2Zvcm1hdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVVHJhbnNmb3JtYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NDFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVUcmFuc2Zvcm1hdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIElVVHJhbnNmb3JtYXRpb25IZWxwZXIgewotCXN0YXRpYyBwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9SZXF1aXJlbWVudHMoSXRlcmF0b3IgaXVzLCBib29sZWFuIG9wdGlvbmFsKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdXMuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGN1cnJlbnQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXVzLm5leHQoKTsKLQkJCXJlc3VsdC5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY3VycmVudC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGN1cnJlbnQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjdXJyZW50LmdldFZlcnNpb24oKSwgdHJ1ZSksIG51bGwsIG9wdGlvbmFsLCBmYWxzZSkpOwotCQl9Ci0JCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlc3VsdC50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9SZXF1aXJlbWVudHMoSUluc3RhbGxhYmxlVW5pdFtdIGl1cywgYm9vbGVhbiBvcHRpb25hbCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXN1bHQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W2l1cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50ID0gaXVzW2ldOwotCQkJcmVzdWx0W2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY3VycmVudC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGN1cnJlbnQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjdXJyZW50LmdldFZlcnNpb24oKSwgdHJ1ZSksIG51bGwsIG9wdGlvbmFsLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNkMzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGVzCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9JbnN0YWxsX1Byb2JsZW1zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVW5pbnN0YWxsX1Byb2JsZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdG9yX05vdGhpbmdfVG9fVW5pbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdG9yX0Nhbm5vdF9Vbmluc3RhbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfQWxyZWFkeV9JbnN0YWxsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9SZXZlcnRfUHJvYmxlbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVW5leHBlY3RlZF9JVTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9UYXNrX0luc3RhbGxpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVGFza19Vbmluc3RhbGxpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVGFza19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9UYXNrX1Jlc29sdmluZ19EZXBlbmRlbmNpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jaWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdG9yX1Vuc2F0aXNmaWVkX0RlcGVuZGVuY3k7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX0Vycm9yX3NhdmluZ19vcGJmaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfRm9ybWF0X2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfTWlzc2luZ19vcGJfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX1RpbWVvdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhbm5lcl9Qcm9ibGVtc19yZXNvbHZpbmdfcGxhbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX1RyaXZpYWxfZXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfVW5zYXRpc2ZpYWJsZV9wcm9ibGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL05ld0RlcGVuZGVuY3lFeHBhbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL05ld0RlcGVuZGVuY3lFeHBhbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzIwMDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9OZXdEZXBlbmRlbmN5RXhwYW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24uUmVzb2x1dGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24uVW5zYXRpc2ZpZWRDYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHNhdGlzZnkgYSBwYXJ0aWN1bGFyIElVLCB3ZSB0cnkgdG8gc2F0aXNmeSBhbGwgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIElVIGFuZCB0aHVzIHJlY3Vyc2l2ZWx5LgotICogVGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmUgaGVyZSBpcyBhIG1hcCBvZiBhbGwgdGhlIHJlcXVpcmVtZW50cyBlbmNvdW50ZXJlZC4gTW9yZSBwcmVjaXNlbHkgaXQgaXMgYSBtYXAgd2hvc2Uga2V5IGlzIGEgc2ltcGxpZmllZCByZXF1aXJlbWVudCBvYmplY3QgKG5zIGFuZCBuYW1lIG9ubHkpLCAKLSAqIGFuZCB3aG9zZSB2YWx1ZSBpcyBhIGRhdGEgc3RydWN0dXJlIGhvbGRpbmc6Ci0gKgkgIC0gdGhlIGludGVyc2VjdGlvbiBvZiBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGNvbnN0cmFpbnRzIGVuY291bnRlcmVkCi0gKiAgIC0gdGhlIGxpc3Qgb2YgSVVzIHNhdGlzZnlpbmcgdGhpcyBpbnRlcnNlY3Rpb24KLSAqIFRoZSBhbGdvcml0aG0gaXMgcmF0aGVyIHNpbXBsZToKLSAqICAgLSBnYXRoZXIgdGhlIHJlcXVpcmVtZW50cyBvZiBhIHNldCBvZiBidW5kbGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgbWFwIGNvbXB1dGluZyB0aGUgaW50ZXJzZWN0aW9uCi0gKiAgIC0gZmluZCB0aGUgSVVzIG1hdGNoaW5nIGVhY2ggb2YgdGhlc2UgcmVxdWlyZW1lbnQKLSAqICAgLSByZXBlYXQgdGhlIHR3byBwcmV2aW91cyBzdGVwcyB1bnRpbCB0aGUgbGFzdCBzdGVwIG5vIGxvbmdlciBmaW5kIG1hdGNoZXMgCi0gKiBUaGVuIHRoZSByZXNvbHZlciBpcyBpbnZva2VkIGFuZCBmb3IgZWFjaCB1bnNhdGlzZmllZCBJVSB0aGF0IGNvbWVzIG91dCBvZiB0aGUgcmVzb2x2ZXIgd2UgdmVyaWZ5IGlmIGl0IGJlbG9uZ3MgdG8gYW4gZW50cnkgaW4gdGhlIG1hcCB3aGVyZSBhdCBsZWFzdCBvbmUgb3RoZXIgSVUgaGFzIGJlZW4gcGlja2VkLgotICogSWYgc28gd2UgYXJlIGdvb2QsIG90aGVyd2lzZSB3ZSBoYXZlIGEgZmFpbHVyZS4KLSAqIEtub3duIHByb2JsZW1zOgotICogICAtIE1hbGljaW91cyBJVS4gQSBtYWxpY2lvdXMgSVUgY291bGQgYmUgYnJvdWdodCBpbnRvIHRoZSBzeXN0ZW0sIHRodXMgY2F1c2luZyBhIGRldGVjdGlvbiBvZiBpbXBvc3NpYmxlIHNvbHV0aW9uLiBJcyB0aGlzIHJlYWxseSB1bmF2b2lkYWJsZT8KLSAqICAgLSBUaGUgbW9yZSBnZW5lcmFsIHByb2JsZW0gaXMgdGhhdCB3ZSBkbyBub3QgYmFja3RyYWNrIGFuZCB0aGVyZWZvcmUgd2hlbiB3ZSBwaWNrIGFuIElVIGFuZCBpdCBtYXkgY2F1c2UgcHJvYmxlbXMgdGhhdCB3ZSB3aWxsIG5vdCBkaXNjb3ZlciBzb29uIGVub3VnaC4gTG9va2luZyBhaGVhZCBtYXkgaGVscCB1cwotICogaW4gYXZvaWRpbmcgdGhvc2UgY2FzZXMgYnV0IHN0aWxsIHdlIG1heSBoYXZlIHByb2JsZW1zLgotICogCi0gKiBUbyBiZSBpbXBsZW1lbnRlZDoKLSAqICAgLSBtZXJnZSBvZiByZXF1aXJlbWVudHMgd2l0aCBmaWx0ZXJzCi0gKiAgIC0gY2hlY2sgaWYgdGhlIElVIGlzIGFwcGxpY2FibGUgYWNjb3JkaW5nIHRvIGl0cyBwbGF0Zm9ybSBmaWx0ZXIgd2l0aCB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQKLSAqICAgLSByZXR1cm4gdW5zYXRpc2ZpZWQgY29uc3RyYWludHMKLSAqICAgLSBkbyB0aGUgcmVjb21tZW5kYXRpb24KLSAqIFRPRE8gSXQgbWF5IHdvcnRoIGV4cGVyaW1lbnRpbmcgd2l0aCB0d28gcGlja2VycyAob3IgY2hhaW5lZCkgLiBPbmUgd291bGQgcGljayBvbiB0aGUgYWxyZWFkeUluc3RhbGxlZCBpdXMgYW5kIG9uZSBvbiB0aGUgYXZhaWxhYmxlIG9uZXMuIFRoaXMgY291bGQgaGVscCB1cyBmYXZvciBhbHJlYWR5IGluc3RhbGxlZCBpdXMgb3ZlciB0aGUgb3RoZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RGVwZW5kZW5jeUV4cGFuZGVyIHsKLQotCXByaXZhdGUgY2xhc3MgTWF0Y2ggewotCQkvKioKLQkJICogVGhlIHtAbGluayBJSW5zdGFsbGFibGVVbml0fXMgc2F0aXNmeWluZyB0aGlzIHJlcXVpcmVtZW50LgotCQkgKi8KLQkJU2V0IGNhbmRpZGF0ZXM7Ci0JCS8qKgotCQkgKiBUaGUgZW52aXJvbm1lbnQgYWdhaW5zdCB3aGljaCBjYXBhYmlsaXR5IGZpbHRlcnMgYXJlIGV2YWx1YXRlZCBmb3IgdGhpcyBtYXRjaC4KLQkJICovCi0JCURpY3Rpb25hcnkgZW52OwotCQlSZXF1aXJlZENhcGFiaWxpdHkgcmVxOwotCi0JCXB1YmxpYyBNYXRjaChSZXF1aXJlZENhcGFiaWxpdHkgcmFuZ2UsIERpY3Rpb25hcnkgZW52aXJvbm1lbnQpIHsKLQkJCXRoaXMucmVxID0gcmFuZ2U7Ci0JCQl0aGlzLmVudiA9IGVudmlyb25tZW50OwotCQkJY2FuZGlkYXRlcyA9IG5ldyBIYXNoU2V0KDIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTWF0Y2hbIiArIHJlcSArICddJzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwcmVzZW50cyBhIHJlcXVpcmVtZW50IG5hbWUgaW4gdGhlIG1hcCBvZiByZXF1aXJlZCBjYXBhYmlsaXRpZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNYXRjaEtleSB7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgbmFtZXNwYWNlOwotCi0JCU1hdGNoS2V5KFJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQl0aGlzLm5hbWUgPSBjYXBhYmlsaXR5LmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBNYXRjaEtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJTWF0Y2hLZXkgdGhhdCA9IChNYXRjaEtleSkgb2JqZWN0OwotCQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlLmVxdWFscyh0aGF0Lm5hbWVzcGFjZSkgJiYgdGhpcy5uYW1lLmVxdWFscyh0aGF0Lm5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiAzMSAqIG5hbWVzcGFjZS5oYXNoQ29kZSgpICsgbmFtZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTWF0Y2hLZXkoIiArIG5hbWVzcGFjZSArICcvJyArIG5hbWUgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vIEluc3RhbGxhYmxlIHVuaXRzIHRoYXQgYXJlIG9wdGlvbmFsIGhhdmUgYSBkZXBlbmRlbmN5IG9uIHRoZW1zZWx2ZXMuCi0JcHJpdmF0ZSBjbGFzcyBPcHRpb25hbEluc3RhbGxhYmxlVW5pdCBpbXBsZW1lbnRzIElJbnN0YWxsYWJsZVVuaXQgewotCQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWxSZXFzOwotCQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgd3JhcHBlZDsKLQotCQlPcHRpb25hbEluc3RhbGxhYmxlVW5pdChJSW5zdGFsbGFibGVVbml0IGl1LCBib29sZWFuIGdlbmVyYXRlT3B0aW9uYWxSZXFzKSB7Ci0JCQl3cmFwcGVkID0gaXU7Ci0JCQlvcHRpb25hbFJlcXMgPSBnZW5lcmF0ZU9wdGlvbmFsUmVxczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0RmlsdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0SWQoKTsKLQkJfQotCi0JCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRWZXJzaW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFByb3BlcnR5KGtleSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmaW5hbCBPcHRpb25hbEluc3RhbGxhYmxlVW5pdCBvdGhlciA9IChPcHRpb25hbEluc3RhbGxhYmxlVW5pdCkgb2JqOwotCQkJaWYgKHdyYXBwZWQgPT0gbnVsbCkgewotCQkJCWlmIChvdGhlci53cmFwcGVkICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIXdyYXBwZWQuZXF1YWxzKG90aGVyLndyYXBwZWQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkgewotCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNhcHMgPSB3cmFwcGVkLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhcHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXN1bHQuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoY2Fwc1tpXS5nZXROYW1lc3BhY2UoKSwgY2Fwc1tpXS5nZXROYW1lKCksIG5ldyBWZXJzaW9uUmFuZ2UoY2Fwc1tpXS5nZXRWZXJzaW9uKCksIHRydWUsIGNhcHNbaV0uZ2V0VmVyc2lvbigpLCB0cnVlKSwgd3JhcHBlZC5nZXRGaWx0ZXIoKSwgb3B0aW9uYWxSZXFzLCBmYWxzZSkpOwotCQkJfQotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KHdyYXBwZWQuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkpOwotCQkJcmV0dXJuIChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh3cmFwcGVkID09IG51bGwpID8gMCA6IHdyYXBwZWQuaGFzaENvZGUoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB3cmFwcGVkLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RzKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0QXJ0aWZhY3RzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnREYXRhW10gZ2V0VG91Y2hwb2ludERhdGEoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRUb3VjaHBvaW50RGF0YSgpOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0VG91Y2hwb2ludFR5cGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5pc0ZyYWdtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZXRvbigpIHsKLQkJCXJldHVybiB3cmFwcGVkLmlzU2luZ2xldG9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgYXJnKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5jb21wYXJlVG8oYXJnKTsKLQkJfQotCi0JCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBnZXRGcmFnbWVudHMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCB1bnJlc29sdmVkKCkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgSVVwZGF0ZURlc2NyaXB0b3IgZ2V0VXBkYXRlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFVwZGF0ZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBMaWNlbnNlIGdldExpY2Vuc2UoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRMaWNlbnNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29weXJpZ2h0IGdldENvcHlyaWdodCgpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldENvcHlyaWdodCgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGludCBPcGVyYXRpb25Xb3JrID0gMTAwOwotCi0JcHJpdmF0ZSBmaW5hbCBTZXQgYWxyZWFkeUluc3RhbGxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsOwotCi0JLyoqCi0JICogQSBtYXAgb2YgYWxsIHRoZSByZXF1aXJlbWVudHMgZXZlciBlbmNvdW50ZXJlZCBpbiB0aGUgc3lzdGVtLiBUaGUga2V5IGlzCi0JICogYSBNYXRjaEtleSBhbmQgdGhlIHZhbHVlIGlzIGEgTGlzdCBvZiBNYXRjaCBvYmplY3RzLgotCSAqLwotCXByaXZhdGUgTWFwIG11c3QgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgUGlja2VyIHBpY2tlcjsKLQotCXByaXZhdGUgRGljdGlvbmFyeSBzZWxlY3Rpb25Db250ZXh0OwotCi0JcHJpdmF0ZSBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcmVjb21tZW5kYXRpb25zOwotCi0JcHJpdmF0ZSBSZXNvbHV0aW9uSGVscGVyIHJlc29sdmVyOwotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gcm9vdHM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gc29sdXRpb247Ci0KLQlwdWJsaWMgTmV3RGVwZW5kZW5jeUV4cGFuZGVyKElJbnN0YWxsYWJsZVVuaXRbXSByLCBJSW5zdGFsbGFibGVVbml0W10gYWxyZWFkeUluc3RhbGxlZCwgSUluc3RhbGxhYmxlVW5pdFtdIGF2YWlsYWJsZUlVcywgRGljdGlvbmFyeSBzZWxlY3Rpb25Db250ZXh0LCBib29sZWFuIGluY2x1ZGVPcHRpb25hbCkgewotCQl0aGlzLnJvb3RzID0gKHIgPT0gbnVsbCkgPyBuZXcgSUluc3RhbGxhYmxlVW5pdFswXSA6IHI7Ci0JCXRoaXMuaW5jbHVkZU9wdGlvbmFsID0gaW5jbHVkZU9wdGlvbmFsOwotCQlhbHJlYWR5SW5zdGFsbGVkID0gYWxyZWFkeUluc3RhbGxlZCA9PSBudWxsID8gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF0gOiBhbHJlYWR5SW5zdGFsbGVkOwotCQl0aGlzLmFscmVhZHlJbnN0YWxsZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYWxyZWFkeUluc3RhbGxlZCkpOwotCQl0aGlzLnNlbGVjdGlvbkNvbnRleHQgPSBzZWxlY3Rpb25Db250ZXh0OwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSByZXN1bHQgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtyb290cy5sZW5ndGggKyBhbHJlYWR5SW5zdGFsbGVkLmxlbmd0aCArIGF2YWlsYWJsZUlVcy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHJvb3RzLCAwLCByZXN1bHQsIDAsIHJvb3RzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWxyZWFkeUluc3RhbGxlZCwgMCwgcmVzdWx0LCByb290cy5sZW5ndGgsIGFscmVhZHlJbnN0YWxsZWQubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhdmFpbGFibGVJVXMsIDAsIHJlc3VsdCwgcm9vdHMubGVuZ3RoICsgYWxyZWFkeUluc3RhbGxlZC5sZW5ndGgsIGF2YWlsYWJsZUlVcy5sZW5ndGgpOwotCQlwaWNrZXIgPSBuZXcgUGlja2VyKHJlc3VsdCwgbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihuZXcgSGFzaFNldCgpKSk7Ci0JCUNvbGxlY3Rpb24gZmlsdGVyRm9yUm9vdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHIgIT0gbnVsbCAmJiByLmxlbmd0aCA+IDApIHsKLQkJCWZpbHRlckZvclJvb3QuYWRkKG5ldyBCYXNpY0lVRmlsdGVyKHIpKTsKLQkJCWZpbHRlckZvclJvb3QuYWRkKG5ldyBSZXF1aXJlbWVudEJhc2VkRmlsdGVyKHJbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkpOwotCQl9Ci0JCXBpY2tlci5wcmVmZXIoZmlsdGVyRm9yUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb2JsZW0gc3RhdHVzIGZvciB0aGUgZ2l2ZW4gdW5zYXRpc2ZpZWQgZGVwZW5kZW5jeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVW5zYXRpc2ZpZWQoUmVxdWlyZWRDYXBhYmlsaXR5IHJlcSwgQ29sbGVjdGlvbiB0b0FkZCwgTXVsdGlTdGF0dXMgcHJvYmxlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRvQWRkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IHVuaXQuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVxdWlyZWRbaV0uZXF1YWxzKHJlcSkpIHsKLQkJCQkJVW5zYXRpc2ZpZWRDYXBhYmlsaXR5IHVuc2F0aXNmaWVkID0gbmV3IFVuc2F0aXNmaWVkQ2FwYWJpbGl0eShyZXEsIHVuaXQpOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jeSwgdW5zYXRpc2ZpZWQpOwotCQkJCQlwcm9ibGVtcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgbXNnKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsZ28oU3ViTW9uaXRvciBwLCBNdWx0aVN0YXR1cyBwcm9ibGVtcykgewotCQkvL0ZpcnN0IHdlIGNyZWF0ZSBkZXBlbmRlbmNpZXMgb24gdGhlIHJvb3QgdGhlbXNlbHZlcy4gVGhlIGZpcnN0IGl0ZXJhdGlvbiB3aWxsIG1vc3RseSBjb25zaXN0IGluIHJlZGlzY292ZXJpbmcgdGhlIHJvb3RzLgotCQlDb2xsZWN0aW9uIHRvQWRkID0gYXNPcHRpb25hbElVcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgZmFsc2UpOwotCQl0b0FkZC5hZGRBbGwoYWxyZWFkeUluc3RhbGxlZCk7Ci0JCWRvIHsKLQkJCS8vcmVzZXQgd29yayBhdCBlYWNoIGl0ZXJhdGlvbiwgdGhlbiB1c2UgdXAgYSB0aGlyZC4gVGhpcyByZXN1bHRzIGluIGFuIGluZmluaXRlIHNlcmllcyB3aGVyZSByZW1haW5pbmcgdGlja3MgZ2V0cyBzdGVhZGlseSBzbWFsbGVyCi0JCQlwLnNldFdvcmtSZW1haW5pbmcoMTAwKTsKLQkJCWV4dHJhY3RWaXNpYmlsaXR5RGF0YSh0b0FkZCk7Ci0JCQlleHRyYWN0UmVxdWlyZW1lbnRzKHRvQWRkKTsKLQkJCXRvQWRkID0gY29sbGVjdE1hdGNoZXModG9BZGQsIHByb2JsZW1zKTsKLQkJCXAud29ya2VkKDMzKTsKLQkJfSB3aGlsZSAodG9BZGQuc2l6ZSgpICE9IDApOwotCi0JCS8vZG9uJ3QgYm90aGVyIGludm9raW5nIHRoZSByZXNvbHZlciBpZiB3ZSBhbHJlYWR5IGhhdmUgcHJvYmxlbXMKLQkJLy8JCWlmICghcHJvYmxlbXMuaXNPSygpKQotCQkvLwkJCXJldHVybjsKLQkJaW52b2tlUmVzb2x2ZXIocHJvYmxlbXMpOwotCQkvLwkJaWYgKHByb2JsZW1zLmlzT0soKSkKLQkJZXh0cmFjdFNvbHV0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RWaXNpYmlsaXR5RGF0YShDb2xsZWN0aW9uIGl1cykgewotCQlDb2xsZWN0aW9uIGZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoaXUuZ2V0UHJvcGVydHkoImxpbmVVcCIpKSkgewotCQkJCWZpbHRlcnMuYWRkKG5ldyBSZXF1aXJlbWVudEJhc2VkRmlsdGVyKGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkpKTsKLQkJCX0KLQkJfQotCQlwaWNrZXIucHJlZmVyKGZpbHRlcnMpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBhc09wdGlvbmFsSVVzKENvbGxlY3Rpb24gYXNMaXN0LCBib29sZWFuIGdlbmVyYXRlT3B0aW9uYWxSZXFzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhc0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJcmVzdWx0LmFkZChuZXcgT3B0aW9uYWxJbnN0YWxsYWJsZVVuaXQoKChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCkpLCBnZW5lcmF0ZU9wdGlvbmFsUmVxcykpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3RGbGF2b3JQcm92aWRlcnMoQ29sbGVjdGlvbiB0b1NlYXJjaEZvcikgewotCQlTdHJpbmcgZmxhdm9yID0gKFN0cmluZykgc2VsZWN0aW9uQ29udGV4dC5nZXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQlpZiAoZmxhdm9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEhhc2hTZXQoKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdW10gcGlja2VkID0gcGlja2VyLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgZmxhdm9yLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIHRydWUgLyogZnJhZ21lbnRzT25seSAqLyk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXM7Ci0JCWlmIChwaWNrZWRbMF0ubGVuZ3RoID4gMCkKLQkJCWl1cyA9IHBpY2tlZFswXTsKLQkJZWxzZQotCQkJaXVzID0gcGlja2VkWzFdOwotCQlTZXQgcmVzdWx0cyA9IG5ldyBIYXNoU2V0KGl1cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCB0bXAgPSBtYXRjaCh0b1NlYXJjaEZvciwgaXVzW2ldKTsKLQkJCWlmICh0bXAgIT0gbnVsbCkKLQkJCQlyZXN1bHRzLmFkZChuZXcgT3B0aW9uYWxJbnN0YWxsYWJsZVVuaXQodG1wLCBmYWxzZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb2xsZWN0SW5zdGFsbGFibGVVbml0RnJhZ21lbnRzKENvbGxlY3Rpb24gaXVzKSB7Ci0JCVNldCBwaWNrZWQgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY3VycmVudCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0W11bXSBjYW5kaWRhdGVzID0gcGlja2VyLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJmcmFnbWVudCIsIGN1cnJlbnQuZ2V0SWQoKSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlKX0sIGZhbHNlIC8qIG5vdCBmcmFnbWVudHNPbmx5ICovKTsgLy8kTk9OLU5MUy0xJAotCQkJSUluc3RhbGxhYmxlVW5pdFtdIG1hdGNoZXMgPSBjYW5kaWRhdGVzWzBdLmxlbmd0aCA+IDAgPyBjYW5kaWRhdGVzWzBdIDogY2FuZGlkYXRlc1sxXTsKLQkJCWlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsgLy9UT0RPIEhlcmUgd2UgbmVlZCB0byBjaGVjayB0aGUgZmlsdGVyIG9mIHRoZSBmb3VuZCBpdQotCQkJCWlmIChtYXRjaGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCXBpY2tlZC5hZGQobWF0Y2hlc1swXSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvL3ZlcmlmeSB0aGF0IGVhY2ggSVUgcmVxdWlyZXMgdGhlIGN1cnJlbnQgaXUKLQkJCQlQcm92aWRlZENhcGFiaWxpdHkgY2FwRm9yQ3VycmVudCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGN1cnJlbnQuZ2V0SWQoKSwgY3VycmVudC5nZXRWZXJzaW9uKCkpOwotCQkJCU1hcCB0b0FkZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBtYXRjaGVzW2ldLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCQkJCWJvb2xlYW4gaXNSZWFsbHlBRnJhZ21lbnQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXFzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpc1JlYWxseUFGcmFnbWVudCA9IGNhcEZvckN1cnJlbnQuaXNTYXRpc2ZpZWRCeShyZXFzW2pdKTsKLQkJCQkJfQotCQkJCQlpZiAoIWlzUmVhbGx5QUZyYWdtZW50KQotCQkJCQkJY29udGludWU7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgbWF0Y2ggPSAoSUluc3RhbGxhYmxlVW5pdCkgdG9BZGQuZ2V0KG1hdGNoZXNbaV0uZ2V0SWQoKSk7Ci0JCQkJCWlmIChtYXRjaCA9PSBudWxsIHx8IG1hdGNoLmdldFZlcnNpb24oKS5jb21wYXJlVG8obWF0Y2hlc1tpXS5nZXRWZXJzaW9uKCkpIDwgMCkKLQkJCQkJCXRvQWRkLnB1dChtYXRjaGVzW2ldLmdldElkKCksIG1hdGNoZXNbaV0pOwotCQkJCX0KLQkJCQlwaWNrZWQuYWRkQWxsKHRvQWRkLnZhbHVlcygpKTsKLQkJCQkvL2luIHRoZSByZW1pbmRlciwgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSBpcyBnb29kLCB0aGVuIHBpY2sgdGhlIGhpZ2hlc3Qgb25lLgotCQkJfQotCQl9Ci0JCXJldHVybiBwaWNrZWQ7Ci0JfQotCi0JLy8gRm9yIGVhY2ggcmVxdWlyZW1lbnQsIGZpbmQgdGhlIHBvdGVudGlhbCBJVXMKLQlwcml2YXRlIENvbGxlY3Rpb24gY29sbGVjdE1hdGNoZXMoQ29sbGVjdGlvbiB0b0FkZCwgTXVsdGlTdGF0dXMgcHJvYmxlbXMpIHsKLQkJQ29sbGVjdGlvbiB0aGluZ3NBZGRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtdXN0LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUxpc3QgYWxsID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgbWF0Y2hlcyA9IGFsbC5pdGVyYXRvcigpOyBtYXRjaGVzLmhhc05leHQoKTspIHsKLQkJCQlNYXRjaCBjdXJyZW50ID0gKE1hdGNoKSBtYXRjaGVzLm5leHQoKTsKLQkJCQlDb2xsZWN0aW9uW10gcGlja2VkID0gcGlja2VyLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgY3VycmVudC5yZXEpOwotCQkJCUNvbGxlY3Rpb24gZm91bmQgPSBwaWNrZWRbMF0uc2l6ZSgpID4gMCA/IHBpY2tlZFswXSA6IHBpY2tlZFsxXTsKLQkJCQlpZiAoY3VycmVudC5jYW5kaWRhdGVzLmFkZEFsbChmb3VuZCkpIHsKLQkJCQkJdGhpbmdzQWRkZWQuYWRkQWxsKGZvdW5kKTsKLQkJCQkJdGhpbmdzQWRkZWQuYWRkQWxsKGNvbGxlY3RPcHRpb25hbEluc3RhbGxhYmxlVW5pdHMoZm91bmQpKTsKLQkJCQl9Ci0JCQkJaWYgKGN1cnJlbnQuY2FuZGlkYXRlcy5zaXplKCkgPT0gMCAmJiByZXF1aXJlbWVudEVuYWJsZWQoY3VycmVudC5yZXEpKQotCQkJCQlhZGRVbnNhdGlzZmllZChjdXJyZW50LnJlcSwgdG9BZGQsIHByb2JsZW1zKTsKLQkJCX0KLQkJCWlmIChhbGwuc2l6ZSgpID4gMikgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGRlYWwgd2l0aCB0aHJlZSBvciBtb3JlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBJVSAiICsgKChNYXRjaCkgYWxsLmdldCgwKSkucmVxICsgIi4gU2VlIGJ1ZyAyMDAzODAiKTsKLQkJCX0KLQkJCWlmIChhbGwuc2l6ZSgpID4gMSkgewotCQkJCS8vVE9ETyBUaGlzIGFsZ29yaXRobSBuZWVkcyB0byBiZSBnZW5lcmFsaXplZCB0byBjb25zaWRlciBhbGwgdGhlIHBvdGVudGlhbCBjYW5kaWRhdGVzLgotCQkJCVNldCBzZXQxID0gKChNYXRjaCkgYWxsLmdldCgwKSkuY2FuZGlkYXRlczsKLQkJCQlTZXQgc2V0MiA9ICgoTWF0Y2gpIGFsbC5nZXQoMSkpLmNhbmRpZGF0ZXM7Ci0JCQkJYm9vbGVhbiBwb3RlbnRpYWxTb2x1dGlvbiA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3JTZXQxID0gc2V0MS5pdGVyYXRvcigpOyBpdGVyYXRvclNldDEuaGFzTmV4dCgpICYmICFwb3RlbnRpYWxTb2x1dGlvbjspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdGVtU2V0MSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvclNldDEubmV4dCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yU2V0MiA9IHNldDIuaXRlcmF0b3IoKTsgaXRlcmF0b3JTZXQyLmhhc05leHQoKSAmJiAhcG90ZW50aWFsU29sdXRpb247KSB7Ci0JCQkJCQlJSW5zdGFsbGFibGVVbml0IGl0ZW1TZXQyID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yU2V0Mi5uZXh0KCk7Ci0JCQkJCQlpZiAoaXRlbVNldDEuZ2V0SWQoKS5lcXVhbHMoaXRlbVNldDIuZ2V0SWQoKSkgJiYgKChpdGVtU2V0MS5pc1NpbmdsZXRvbigpID09IHRydWUgJiYgaXRlbVNldDEuaXNTaW5nbGV0b24oKSA9PSBpdGVtU2V0Mi5pc1NpbmdsZXRvbigpKSB8fCBpdGVtU2V0MS5pc1NpbmdsZXRvbigpICE9IGl0ZW1TZXQyLmlzU2luZ2xldG9uKCkpKSB7Ci0JCQkJCQkJY29udGludWU7IC8vVGhpcyBjb21iaW5hdGlvbiB3b3VsZCBub3Qgd29yay4gS2VlcCBvbiBzZWFyY2hpbmcKLQkJCQkJCX0KLQkJCQkJCXBvdGVudGlhbFNvbHV0aW9uID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocG90ZW50aWFsU29sdXRpb24gPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJDYW4ndCBmaW5kIGEgc29sdXRpb24gd2hlcmUgYm90aDogIiArIGFsbC5nZXQoMCkgKyAiIGFuZCAiICsgYWxsLmdldCgxKSArICIgd291bGQgYmUgc2F0aXNmaWVkLiI7Ci0JCQkJCXByb2JsZW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBtc2cpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gdGhpbmdzQWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3RPcHRpb25hbEluc3RhbGxhYmxlVW5pdHMoQ29sbGVjdGlvbiBvcHRpb25hbEZvcikgewotCQlpZiAoIWluY2x1ZGVPcHRpb25hbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGNvbGxlY3RGbGF2b3JQcm92aWRlcnMob3B0aW9uYWxGb3IpOwotCQlyZXN1bHQuYWRkQWxsKGNvbGxlY3RJbnN0YWxsYWJsZVVuaXRGcmFnbWVudHMob3B0aW9uYWxGb3IpKTsKLQkJLy8JCWlmIChyZXN1bHQuc2l6ZSgpICE9IDApIHsvL0ZpbmQgdGhlIG9wdGlvbmFsIHBpZWNlcyBvZiB0aGUgb3B0aW9uYWwgcGllY2VzLiBUT0RPIEkgdGhpbmsgdGhlcmUgY2FuIGJlIGNhc2VzIHdoZXJlIHdlIHdvdWxkIGN5Y2xlIGluZmluaXRlbHkKLQkJLy8JCQlyZXN1bHQuYWRkQWxsKGNvbGxlY3RPcHRpb25hbEluc3RhbGxhYmxlVW5pdHMocmVzdWx0KSk7Ci0JCS8vCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRWxpbWluYXRlIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoZSBzZXQgb2YgdW5zYXRpc2ZpZWQgY2FwYWJpbGl0aWVzIHJldHVybmVkCi0JICogYnkgdGhlIHJlc29sdmVyLiAgVGhpcyBpbmNsdWRlcyBvcHRpb25hbCBkZXBlbmRlbmNpZXMsIGFuZCBkZXBlbmRlbmNpZXMgZm9yCi0JICogd2hpY2ggd2UgaGF2ZSBhbiBhdmFpbGFibGUgaW5zdGFsbGFibGUgdW5pdC4KLQkgKi8KLQlwcml2YXRlIFVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIGNvbGxlY3RVbnNhdGlzZmllZERlcGVuZGVuY2llcyhVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnJlc29sdmVkKSB7Ci0JCUFycmF5TGlzdCByZWFsbHlVbnNhdGlzZmllZCA9IG5ldyBBcnJheUxpc3QodW5yZXNvbHZlZC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVucmVzb2x2ZWQubGVuZ3RoOyBpKyspIHsKLQkJCUxpc3QgYWxsID0gKExpc3QpIG11c3QuZ2V0KG5ldyBNYXRjaEtleSh1bnJlc29sdmVkW2ldLmdldFJlcXVpcmVkQ2FwYWJpbGl0eSgpKSk7Ci0JCQlpZiAoYWxsICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJTWF0Y2ggbSA9IChNYXRjaCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAocmVxdWlyZW1lbnRFbmFibGVkKG0ucmVxKSAmJiAhb25lUmVzb2x2ZWQobS5jYW5kaWRhdGVzKSkKLQkJCQkJCXJlYWxseVVuc2F0aXNmaWVkLmFkZCh1bnJlc29sdmVkW2ldKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW11c3QuZ2V0KG5ldyBNYXRjaEtleSh1bnJlc29sdmVkW2ldLmdldFJlcXVpcmVkQ2FwYWJpbGl0eSgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVbnNhdGlzZmllZENhcGFiaWxpdHlbXSkgcmVhbGx5VW5zYXRpc2ZpZWQudG9BcnJheShuZXcgVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W3JlYWxseVVuc2F0aXNmaWVkLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVMaXN0KE1hdGNoIG0pIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXN1bHQuYWRkKG0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4cGFuZChTdWJNb25pdG9yIHApIHsKLQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCAxLCBNZXNzYWdlcy5EaXJlY3Rvcl9VbnNhdGlzZmllZF9EZXBlbmRlbmNpZXMsIG51bGwpOwotCQl0cnkgewotCQkJYWxnbyhTdWJNb25pdG9yLmNvbnZlcnQocCwgIlJlc29sdmluZyIsIDEwKSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCAxLCBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQkJaWYgKHJlc3VsdC5pc09LKCkpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gYSBtYXAgZnJvbSBhIHJlcXVpcmVtZW50IHRvIHRoZSBzZXQgb2YgaW5zdGFsbGFibGUgdW5pdHMKLQkvLyAJCSAgZGVwZW5kaW5nIG9uIHRoYXQgcmVxdWlyZW1lbnQKLQlwcml2YXRlIHZvaWQgZXh0cmFjdFJlcXVpcmVtZW50cyhDb2xsZWN0aW9uIGl1cykgewotCQkvL21hcCBvZiBNYXRjaEtleS0+TWF0Y2gKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGN1cnJlbnRVbml0ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHRvQWRkID0gY3VycmVudFVuaXQuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJCW91dGVyOiBmb3IgKGludCBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUmVxdWlyZWRDYXBhYmlsaXR5IGN1cnJlbnQgPSB0b0FkZFtpXTsKLQkJCQlpZiAoaXNBcHBsaWNhYmxlKGN1cnJlbnQpICYmICFpc01ldGEoY3VycmVudCkgJiYgIWN1cnJlbnQuaXNPcHRpb25hbCgpKSB7Ci0JCQkJCU1hdGNoS2V5IGtleSA9IG5ldyBNYXRjaEtleShjdXJyZW50KTsKLQkJCQkJTGlzdCBtYXRjaCA9IChMaXN0KSBtdXN0LmdldChrZXkpOwotCQkJCQlpZiAobWF0Y2ggPT0gbnVsbCkgewotCQkJCQkJLy9XZSd2ZSBuZXZlciBzZWVuIGEgcmVxdWlyZW1lbnQgbGlrZSB0aGlzLiBNYWtlIGEgbmV3IG1hdGNoCi0JCQkJCQltdXN0LnB1dChrZXksIGNyZWF0ZUxpc3QobmV3IE1hdGNoKGN1cnJlbnQsIHNlbGVjdGlvbkNvbnRleHQpKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvL2xvb2sgZm9yIGFuIGV4aXN0aW5nIG1hdGNoIHdob3NlIHZlcnNpb24gcmFuZ2UgaXMgb3ZlcmxhcHBpbmcgdGhlIG5ldyBvbmUKLQkJCQkJCWZvciAoSXRlcmF0b3IgbWF0Y2hlcyA9IG1hdGNoLml0ZXJhdG9yKCk7IG1hdGNoZXMuaGFzTmV4dCgpOykgewotCQkJCQkJCU1hdGNoIGN1cnJlbnRNYXRjaCA9IChNYXRjaCkgbWF0Y2hlcy5uZXh0KCk7Ci0JCQkJCQkJVmVyc2lvblJhbmdlIG5ld1JhbmdlID0gaW50ZXJzZWN0KGN1cnJlbnRNYXRjaC5yZXEuZ2V0UmFuZ2UoKSwgY3VycmVudC5nZXRSYW5nZSgpKTsKLQkJCQkJCQlpZiAobmV3UmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJCQkvL21lcmdlIHZlcnNpb24gcmFuZ2UgYW5kIGVudmlyb25tZW50IHdpdGggZXhpc3RpbmcgbWF0Y2gKLQkJCQkJCQkJY3VycmVudE1hdGNoLnJlcSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoY3VycmVudC5nZXROYW1lc3BhY2UoKSwgY3VycmVudC5nZXROYW1lKCksIG5ld1JhbmdlLCBjdXJyZW50LmdldEZpbHRlcigpLCBjdXJyZW50TWF0Y2gucmVxLmlzT3B0aW9uYWwoKSAmJiBjdXJyZW50LmlzT3B0aW9uYWwoKSwgZmFsc2UpOwotCQkJCQkJCQljdXJyZW50TWF0Y2guZW52ID0gbWVyZ2VFbnZpcm9ubWVudHMoY3VycmVudE1hdGNoLmVudiwgY3VycmVudCk7Ci0JCQkJCQkJCWNvbnRpbnVlIG91dGVyOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vdGhlIG5ldyBtYXRjaCBpcyBkaXNqb2ludCBmcm9tIGV4aXN0aW5nIG9uZXMsIHNvIGFkZCBhIG5ldyBtYXRjaCB0byB0aGUgbGlzdAotCQkJCQkJbWF0Y2guYWRkKG5ldyBNYXRjaChjdXJyZW50LCBzZWxlY3Rpb25Db250ZXh0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXh0cmFjdFNvbHV0aW9uKCkgewotCQlzb2x1dGlvbiA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24ocmVzb2x2ZXIuZ2V0QWxsUmVzb2x2ZWQoKSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsSW5zdGFsbGFibGVVbml0cygpIHsKLQkJaWYgKHNvbHV0aW9uID09IG51bGwpCi0JCQlzb2x1dGlvbiA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCXJldHVybiBzb2x1dGlvbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdJbnN0YWxsYWJsZVVuaXRzKCkgewotCQlIYXNoU2V0IG5ld0lVcyA9IG5ldyBIYXNoU2V0KGdldEFsbEluc3RhbGxhYmxlVW5pdHMoKSk7Ci0JCW5ld0lVcy5yZW1vdmVBbGwoYWxyZWFkeUluc3RhbGxlZCk7Ci0JCXJldHVybiBuZXdJVXM7Ci0JfQotCi0JcHVibGljIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciBnZXRSZWNvbW1lbmRhdGlvbnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBWZXJzaW9uUmFuZ2UgaW50ZXJzZWN0KFZlcnNpb25SYW5nZSByMSwgVmVyc2lvblJhbmdlIHIyKSB7Ci0JCVZlcnNpb24gcmVzdWx0TWluID0gbnVsbDsKLQkJYm9vbGVhbiByZXN1bHRNaW5JbmNsdWRlZCA9IGZhbHNlOwotCQlWZXJzaW9uIHJlc3VsdE1heCA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzdWx0TWF4SW5jbHVkZWQgPSBmYWxzZTsKLQotCQlpbnQgbWluQ29tcGFyZSA9IHIxLmdldE1pbmltdW0oKS5jb21wYXJlVG8ocjIuZ2V0TWluaW11bSgpKTsKLQkJaWYgKG1pbkNvbXBhcmUgPCAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMi5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIyLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0gZWxzZSBpZiAobWluQ29tcGFyZSA+IDApIHsKLQkJCXJlc3VsdE1pbiA9IHIxLmdldE1pbmltdW0oKTsKLQkJCXJlc3VsdE1pbkluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1pbmltdW0oKTsKLQkJfSBlbHNlIHsvL21pbkNvbXBhcmUgPT0gMAotCQkJcmVzdWx0TWluID0gcjEuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWluaW11bSgpICYmIHIyLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0KLQotCQlpbnQgbWF4Q29tcGFyZSA9IHIxLmdldE1heGltdW0oKS5jb21wYXJlVG8ocjIuZ2V0TWF4aW11bSgpKTsKLQkJaWYgKG1heENvbXBhcmUgPiAwKSB7Ci0JCQlyZXN1bHRNYXggPSByMi5nZXRNYXhpbXVtKCk7Ci0JCQlyZXN1bHRNYXhJbmNsdWRlZCA9IHIyLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0gZWxzZSBpZiAobWF4Q29tcGFyZSA8IDApIHsKLQkJCXJlc3VsdE1heCA9IHIxLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1heGltdW0oKTsKLQkJfSBlbHNlIHsvL21heENvbXBhcmUgPT0gMAotCQkJcmVzdWx0TWF4ID0gcjEuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWF4aW11bSgpICYmIHIyLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0KLQotCQlpbnQgcmVzdWx0UmFuZ2VDb21wYXJpc29uID0gcmVzdWx0TWluLmNvbXBhcmVUbyhyZXN1bHRNYXgpOwotCQlpZiAocmVzdWx0UmFuZ2VDb21wYXJpc29uIDwgMCkKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQllbHNlIGlmIChyZXN1bHRSYW5nZUNvbXBhcmlzb24gPT0gMCAmJiByZXN1bHRNaW5JbmNsdWRlZCA9PSByZXN1bHRNYXhJbmNsdWRlZCkgewotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UocmVzdWx0TWluLCByZXN1bHRNaW5JbmNsdWRlZCwgcmVzdWx0TWF4LCByZXN1bHRNYXhJbmNsdWRlZCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludm9rZVJlc29sdmVyKE11bHRpU3RhdHVzIHByb2JsZW1zKSB7Ci0JCXJlc29sdmVyID0gbmV3IFJlc29sdXRpb25IZWxwZXIoc2VsZWN0aW9uQ29udGV4dCwgcmVjb21tZW5kYXRpb25zKTsKLQkJU2V0IHRvSW5zdGFsbCA9IG5ldyBIYXNoU2V0KG11c3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG11c3QudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTGlzdCBhbGxNYXRjaGVzID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgbWF0Y2hlcyA9IGFsbE1hdGNoZXMuaXRlcmF0b3IoKTsgbWF0Y2hlcy5oYXNOZXh0KCk7KSB7Ci0JCQkJTWF0Y2ggY3VycmVudCA9IChNYXRjaCkgbWF0Y2hlcy5uZXh0KCk7Ci0JCQkJdG9JbnN0YWxsLmFkZEFsbChjdXJyZW50LmNhbmRpZGF0ZXMpOwotCQkJfQotCQl9Ci0JCXRvSW5zdGFsbC5yZW1vdmVBbGwoYWxyZWFkeUluc3RhbGxlZCk7Ci0JCVVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIHVuc2F0aXNmaWVkID0gY29sbGVjdFVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKHJlc29sdmVyLmluc3RhbGwodG9JbnN0YWxsLCBhbHJlYWR5SW5zdGFsbGVkKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5zYXRpc2ZpZWQubGVuZ3RoOyBpKyspIHsKLQkJCXByb2JsZW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5EaXJlY3Rvcl9VbnNhdGlzZmllZF9EZXBlbmRlbmN5LCB1bnNhdGlzZmllZFtpXSkpKTsKLQkJfQotCX0KLQotCS8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUKLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJU3RyaW5nIGZpbHRlciA9IHJlcS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5jcmVhdGVGaWx0ZXIoZmlsdGVyKS5tYXRjaChzZWxlY3Rpb25Db250ZXh0KTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIGluZm9ybWF0aW9uIHRvIGRpc2NvdmVyIGFkZGl0aW9uYWwgdGhpbmdzIHRvIGluc3RhbGwgaXMgbWl4ZWQgd2l0aCBpbmZvcm1hdGlvbiAKLQkgKiBhYm91dCBpbnRlci1jb21wb25lbnQgZGVwZW5kZW5jaWVzLCB3ZSBlbmQgdXAgaGF2aW5nIGRlcGVuZGVuY2llcyB0aGF0IGNhdXNlCi0JICogdGhlIHdob2xlIHdvcmxkIHRvIGJlIHNlbGVjdGVkLiBXZSBhcmUgaGVyZSBmaWx0ZXJpbmcgdGhlbSBvdXQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTWV0YShSZXF1aXJlZENhcGFiaWxpdHkgcmVxdWlyZWRDYXBhYmlsaXR5KSB7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSByZXF1aXJlZENhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCk7Ci0JCS8vVE9ETyBTaG91bGQgbm90IHJlZmVyZW5jZSBPU0dpIHRvdWNocG9pbnQgY29uY2VwdHMgaGVyZQotCQlyZXR1cm4gbmFtZXNwYWNlLmVxdWFscygib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUiKSB8fCBuYW1lc3BhY2UuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgbWF0Y2goQ29sbGVjdGlvbiBjbG9zZSwgSUluc3RhbGxhYmxlVW5pdCBwaWNrZWQpIHsKLQkJQ29sbGVjdG9yIHJlc3VsdCA9IG5ldyBIYXNNYXRjaENvbGxlY3RvcigpOwotCQluZXcgQ2FwYWJpbGl0eVF1ZXJ5KHBpY2tlZC5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKS5wZXJmb3JtKGNsb3NlLml0ZXJhdG9yKCksIHJlc3VsdCk7Ci0JCWlmICghcmVzdWx0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBwaWNrZWQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRGljdGlvbmFyeSBtZXJnZUVudmlyb25tZW50cyhEaWN0aW9uYXJ5IGNvbnRleHQsIFJlcXVpcmVkQ2FwYWJpbGl0eSBuZXdDYXBhYmlsaXR5KSB7Ci0JCVN0cmluZ1tdIG5ld1NlbGVjdG9ycyA9IG5ld0NhcGFiaWxpdHkuZ2V0U2VsZWN0b3JzKCk7Ci0JCWlmIChuZXdTZWxlY3RvcnMgPT0gbnVsbCB8fCBuZXdTZWxlY3RvcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gY29udGV4dDsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCWNvbnRleHQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCVN0cmluZyB0cnVlU3RyaW5nID0gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250ZXh0LnB1dChuZXdTZWxlY3RvcnNbaV0sIHRydWVTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvbmVSZXNvbHZlZChDb2xsZWN0aW9uIGl1cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWlmIChyZXNvbHZlci5pc1Jlc29sdmVkKChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVxdWlyZW1lbnRFbmFibGVkKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJaWYgKHJlcS5pc09wdGlvbmFsKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0FwcGxpY2FibGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvT3BlcmF0aW9uR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvT3BlcmF0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYThhNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL09wZXJhdGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSW5zdGFsbGFibGVVbml0T3BlcmFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkdlbmVyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUluc3RhbGxhYmxlVW5pdCBOVUxMX0lVID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlc29sdmVkSW5zdGFsbGFibGVVbml0KE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQobmV3IEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCkpLCBuZXcgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50WzBdKTsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gZ2VuZXJhdGVPcGVyYXRpb24oQ29sbGVjdGlvbiBmcm9tXywgQ29sbGVjdGlvbiB0b18pIHsKLQkJTGlzdCBmcm9tID0gbmV3IEFycmF5TGlzdChmcm9tXyk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZnJvbSk7Ci0KLQkJTGlzdCB0byA9IG5ldyBBcnJheUxpc3QodG9fKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0byk7Ci0KLQkJQXJyYXlMaXN0IG9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdlbmVyYXRlVXBkYXRlcyhmcm9tLCB0bywgb3BlcmF0aW9ucyk7Ci0JCWdlbmVyYXRlSW5zdGFsbFVuaW5zdGFsbChmcm9tLCB0bywgb3BlcmF0aW9ucyk7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcHMgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdKSBvcGVyYXRpb25zLnRvQXJyYXkobmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbb3BlcmF0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIG9wczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVJbnN0YWxsVW5pbnN0YWxsKExpc3QgZnJvbSwgTGlzdCB0bywgQXJyYXlMaXN0IG9wZXJhdGlvbnMpIHsKLQkJaW50IHRvSWR4ID0gMDsKLQkJaW50IGZyb21JZHggPSAwOwotCQl3aGlsZSAoZnJvbUlkeCAhPSBmcm9tLnNpemUoKSAmJiB0b0lkeCAhPSB0by5zaXplKCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgZnJvbUlVID0gKElJbnN0YWxsYWJsZVVuaXQpIGZyb20uZ2V0KGZyb21JZHgpOwotCQkJSUluc3RhbGxhYmxlVW5pdCB0b0lVID0gKElJbnN0YWxsYWJsZVVuaXQpIHRvLmdldCh0b0lkeCk7Ci0JCQlpbnQgY29tcGFyaXNvbiA9IHRvSVUuY29tcGFyZVRvKGZyb21JVSk7Ci0JCQlpZiAoY29tcGFyaXNvbiA8IDApIHsKLQkJCQlvcGVyYXRpb25zLmFkZChjcmVhdGVJbnN0YWxsT3BlcmF0aW9uKHRvSVUpKTsKLQkJCQl0b0lkeCsrOwotCQkJfSBlbHNlIGlmIChjb21wYXJpc29uID09IDApIHsKLQkJCQl0b0lkeCsrOwotCQkJCWZyb21JZHgrKzsKLQkJCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhbWUgIiArIGZyb21JVSk7Ci0JCQl9IGVsc2UgewotCQkJCW9wZXJhdGlvbnMuYWRkKGNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbihmcm9tSVUpKTsKLQkJCQlmcm9tSWR4Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZyb21JZHggIT0gZnJvbS5zaXplKCkpIHsKLQkJCWZvciAoaW50IGkgPSBmcm9tSWR4OyBpIDwgZnJvbS5zaXplKCk7IGkrKykgewotCQkJCW9wZXJhdGlvbnMuYWRkKGNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbigoSUluc3RhbGxhYmxlVW5pdCkgZnJvbS5nZXQoaSkpKTsKLQkJCX0KLQkJfQotCQlpZiAodG9JZHggIT0gdG8uc2l6ZSgpKSB7Ci0JCQlmb3IgKGludCBpID0gdG9JZHg7IGkgPCB0by5zaXplKCk7IGkrKykgewotCQkJCW9wZXJhdGlvbnMuYWRkKGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oKElJbnN0YWxsYWJsZVVuaXQpIHRvLmdldChpKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVXBkYXRlcyhMaXN0IGZyb20sIExpc3QgdG8sIEFycmF5TGlzdCBvcGVyYXRpb25zKSB7Ci0JCVNldCBwcm9jZXNzZWQgPSBuZXcgSGFzaFNldCgpOwotCQlTZXQgcmVtb3ZlZEZyb21UbyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IHRvSWR4ID0gMDsgdG9JZHggPCB0by5zaXplKCk7IHRvSWR4KyspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXVUbyA9IChJSW5zdGFsbGFibGVVbml0KSB0by5nZXQodG9JZHgpOwotCQkJaWYgKGl1VG8uZ2V0SWQoKS5lcXVhbHMobmV4dChmcm9tLCB0b0lkeCkuZ2V0SWQoKSkpIHsKLQkJCQl0b0lkeCA9IHNraXAodG8sIGl1VG8sIHRvSWR4KSAtIDE7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IHVwZGF0ZSAiICsgaXVUbyArICIgYmVjYXVzZSBhbm90aGVyIGl1IHdpdGggc2FtZSBpZCBpcyBpbiB0aGUgdGFyZ2V0IHN0YXRlIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaXVUby5nZXRVcGRhdGVEZXNjcmlwdG9yKCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vd2hlbiB0aGUgdWkgd2UgdXBkYXRlIGZyb20gaXMgaW4gdGhlIG5ldyBzdGF0ZSwgc2tpcCAoZm9yIGV4YW1wbGUgRlJPTSBpcyBBLCBDLCBCICYgVE8gaXMgQyAodXBkYXRlIG9mIAotCQkJSW5zdGFsbGFibGVVbml0UXVlcnkgdXBkYXRlUXVlcnkgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoaXVUby5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0SWQoKSwgaXVUby5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0UmFuZ2UoKSk7Ci0JCQlJdGVyYXRvciB1cGRhdGVzID0gdXBkYXRlUXVlcnkucGVyZm9ybShmcm9tLml0ZXJhdG9yKCksIG5ldyBDb2xsZWN0b3IoKSkuaXRlcmF0b3IoKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdCBpdUZyb207Ci0JCQlpZiAoIXVwZGF0ZXMuaGFzTmV4dCgpKSB7IC8vTm90aGluZyB0byB1cGRhdGUgZnJvbS4KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWl1RnJvbSA9IChJSW5zdGFsbGFibGVVbml0KSB1cGRhdGVzLm5leHQoKTsKLQkJCWlmICh1cGRhdGVzLmhhc05leHQoKSkgeyAvL1RoZXJlIGFyZSBtdWx0aXBsZSBJVXMgdG8gdXBkYXRlIGZyb20KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgdXBkYXRlICAiICsgaXVUbyArICIgYmVjYXVzZSB0aGVyZSBhcmUgbXVsdGlwbGUgSVVzIHRvIHVwZGF0ZSBmcm9tICgiICsgdG9TdHJpbmcoaXVzRnJvbSkgKyAnKScpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGl1VG8uZXF1YWxzKGl1RnJvbSkpIHsKLQkJCQlmcm9tLnJlbW92ZShpdUZyb20pOwotCQkJCXJlbW92ZWRGcm9tVG8uYWRkKGl1VG8pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJb3BlcmF0aW9ucy5hZGQoY3JlYXRlVXBkYXRlT3BlcmF0aW9uKGl1RnJvbSwgaXVUbykpOwotCQkJZnJvbS5yZW1vdmUoaXVGcm9tKTsKLQkJCXByb2Nlc3NlZC5hZGQoaXVUbyk7Ci0JCX0KLQkJdG8ucmVtb3ZlQWxsKHByb2Nlc3NlZCk7Ci0JCXRvLnJlbW92ZUFsbChyZW1vdmVkRnJvbVRvKTsKLQl9Ci0KLQlwcml2YXRlIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuIG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGl1LCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgY3JlYXRlSW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCBpdSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGNyZWF0ZVVwZGF0ZU9wZXJhdGlvbihJSW5zdGFsbGFibGVVbml0IGZyb20sIElJbnN0YWxsYWJsZVVuaXQgdG8pIHsKLQkJcmV0dXJuIG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGZyb20sIHRvKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgbmV4dChMaXN0IGwsIGludCBpKSB7Ci0JCWkrKzsKLQkJaWYgKGkgPj0gbC5zaXplKCkpCi0JCQlyZXR1cm4gTlVMTF9JVTsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBsLmdldChpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBza2lwKExpc3QgYywgSUluc3RhbGxhYmxlVW5pdCBpZCwgaW50IGlkeCkgewotCQlpbnQgaSA9IGlkeDsKLQkJZm9yICg7IGkgPCBjLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoIWlkLmdldElkKCkuZXF1YWxzKCgoSUluc3RhbGxhYmxlVW5pdCkgYy5nZXQoaWR4KSkuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1BhdGNoaW5nSVUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9QYXRjaGluZ0lVLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjhmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1BhdGNoaW5nSVUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlJlcXVpcmVkQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotCi1wdWJsaWMgY2xhc3MgUGF0Y2hpbmdJVSBleHRlbmRzIFF1ZXJ5IHsKLQotCXB1YmxpYyBQYXRjaGluZ0lVKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpIHsKLQkJaWYgKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBjYW5kaWRhdGU7Ci0JCWlmIChpdS5nZXRQcm9wZXJ0eSgicGF0Y2giKS5lcXVhbHMoInRydWUiKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gaGFzQXBwbGljYWJsZVBhdGNoKGl1KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQXBwbGljYWJsZVBhdGNoKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJLy9pdS5nZXRQYXRjaGVzCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9QaWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9QaWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNzE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUGlja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotLy9UaGUgcGlja2VycyBnb2FsIGlzIHRvIGZpbmQgYW4gaW5zdGFsbGFibGUgdW5pdCB0aGF0IHNhdGlzZmllcyBhIHNlYXJjaCBjcml0ZXJpYSAKLS8vVE9ETyB3ZSBtYXkgbmVlZCBhZGRpdGlvbmFsIHZhcmlhdGlvbnMgb2YgdGhlc2UgbWV0aG9kIHdoZXJlIHZlcnNpb24gY2FuIGJlIG51bGwsIG9yIHdoZXJlIHRoZSBzZWFyY2ggcmV0dXJucyBhbGwgdGhlIG1hdGNoLCBub3QganVzdCB0aGUgZmlyc3Qgb25lCi0vL1RPRE8gZG8gd2Ugd2FudCBhIGZhY2lsaXR5IHRvIGxpbWl0IHRoZSBzZWFyY2hpbmcgc3BhY2UsIG9yIGRvIHdlIGFzc3VtZSB0aGF0IHRoZSB1bml0c1RvUGlja0Zyb20gaGFzIGFscmVhZHkgYmVlbiBzY29wZWQgCi1wdWJsaWMgY2xhc3MgUGlja2VyIHsKLQkvL1RPRE8gd2UnbGwgbGlrZWx5IG5lZWQgYmV0dGVyIGluZGV4aW5nIGNhcGFiaWxpdGllcwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIHByZWZlcnJlZFNldDsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBjb21wbGV0ZVNldDsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBzZWNvbmRDaG9pY2VTZXQ7Ci0JcHJpdmF0ZSBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcmVjb21tZW5kYXRpb25zOwotCi0JcHJpdmF0ZSBMaXN0IGZpbHRlcnM7Ci0KLQlwdWJsaWMgUGlja2VyKElJbnN0YWxsYWJsZVVuaXRbXSB1bml0c1RvUGlja0Zyb20sIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciByZWNvbW1lbmRhdGlvbnMpIHsKLQkJaWYgKHVuaXRzVG9QaWNrRnJvbSAhPSBudWxsKQotCQkJY29tcGxldGVTZXQgPSB1bml0c1RvUGlja0Zyb207Ci0JCWVsc2UKLQkJCWNvbXBsZXRlU2V0ID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0JCXRoaXMuc2Vjb25kQ2hvaWNlU2V0ID0gY29tcGxldGVTZXQ7Ci0JCXRoaXMucmVjb21tZW5kYXRpb25zID0gcmVjb21tZW5kYXRpb25zOwotCQl0aGlzLmZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uW10gZmluZEluc3RhbGxhYmxlVW5pdChTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSwgUmVxdWlyZWRDYXBhYmlsaXR5IHNlYXJjaGVkQ2FwYWJpbGl0eSkgewotCQlJSW5zdGFsbGFibGVVbml0W11bXSB0bXAgPSBmaW5kSW5zdGFsbGFibGVVbml0KGlkLCByYW5nZSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtzZWFyY2hlZENhcGFiaWxpdHl9LCBmYWxzZSk7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbltdIHtBcnJheXMuYXNMaXN0KHRtcFswXSksIEFycmF5cy5hc0xpc3QodG1wWzFdKX07Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlZmVyKENvbGxlY3Rpb24gZmlsdGVyc1RvQWRkKSB7Ci0JCWlmICghZmlsdGVycy5hZGRBbGwoZmlsdGVyc1RvQWRkKSkKLQkJCXJldHVybjsKLQkJaWYgKGZpbHRlcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0JCVNldCBwcmVmZXJyZWRJVXMgPSBuZXcgSGFzaFNldChjb21wbGV0ZVNldC5sZW5ndGgpOwotCQlTZXQgc2Vjb25kQ2hvaWNlID0gbmV3IEhhc2hTZXQoY29tcGxldGVTZXQubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wbGV0ZVNldC5sZW5ndGg7IGkrKykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZpbHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWlmICgoKElVRmlsdGVyKSBpdGVyYXRvci5uZXh0KCkpLmFjY2VwdChjb21wbGV0ZVNldFtpXSkpIHsKLQkJCQkJcHJlZmVycmVkSVVzLmFkZChjb21wbGV0ZVNldFtpXSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlY29uZENob2ljZS5hZGQoY29tcGxldGVTZXRbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcmVmZXJyZWRTZXQgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBwcmVmZXJyZWRJVXMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtwcmVmZXJyZWRJVXMuc2l6ZSgpXSk7Ci0JCXNlY29uZENob2ljZVNldCA9IChJSW5zdGFsbGFibGVVbml0W10pIHNlY29uZENob2ljZS50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W3NlY29uZENob2ljZS5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdW10gZmluZEluc3RhbGxhYmxlVW5pdChTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSwgUmVxdWlyZWRDYXBhYmlsaXR5W10gc2VhcmNoZWRDYXBhYmlsaXR5LCBib29sZWFuIGZyYWdtZW50c09ubHkpIHsKLQkJcmV0dXJuIG5ldyBJSW5zdGFsbGFibGVVbml0W11bXSB7ZmluZEluc3RhbGxhYmxlVW5pdChwcmVmZXJyZWRTZXQsIGlkLCByYW5nZSwgc2VhcmNoZWRDYXBhYmlsaXR5LCBmcmFnbWVudHNPbmx5KSwgZmluZEluc3RhbGxhYmxlVW5pdChzZWNvbmRDaG9pY2VTZXQsIGlkLCByYW5nZSwgc2VhcmNoZWRDYXBhYmlsaXR5LCBmcmFnbWVudHNPbmx5KX07Ci0JfQotCi0JLy9UT0RPIHdoYXQgc2hvdWxkIGJlIHRoZSByZXR1cm4gdmFsdWUgd2hlbiBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIG51bGwuIElzIGl0IGV2ZW4gYSB2YWxpZCBjYWxsPwotCS8vVE9ETyBBIGxvdCBvZiBpbXByb3ZlbWVudCBjb3VsZCBiZSBkb25lIG9uIHRoaXMgYWxnb3JpdGhtLCBmb3IgZXhhbXBsZQotCS8vIC0gcmVtb3ZlIGZyb20gdGhlIHNldCBvZiBzZWFyY2hlZENhcGFiaWxpdHkgdGhlIG9uZSB0aGF0IGFyZSBmb3VuZAotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIGZpbmRJbnN0YWxsYWJsZVVuaXQoSUluc3RhbGxhYmxlVW5pdFtdIHBvb2wsIFN0cmluZyBpZCwgVmVyc2lvblJhbmdlIHJhbmdlLCBSZXF1aXJlZENhcGFiaWxpdHlbXSBzZWFyY2hlZENhcGFiaWxpdHksIGJvb2xlYW4gZnJhZ21lbnRzT25seSkgewotCQlpZiAocG9vbCA9PSBudWxsIHx8IHBvb2wubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0JCVNldCBjYW5kaWRhdGVzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvL0ZpbHRlciBvbiBwbHVnaW4gaWQgYW5kIHJhbmdlCi0JCWlmIChpZCAhPSBudWxsICYmIHJhbmdlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9vbC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwb29sW2ldLmdldElkKCkuZXF1YWxzKGlkKSAmJiByYW5nZS5pc0luY2x1ZGVkKHBvb2xbaV0uZ2V0VmVyc2lvbigpKSkKLQkJCQkJY2FuZGlkYXRlcy5hZGQocG9vbFtpXSk7Ci0JCQl9Ci0JCQlwb29sID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgY2FuZGlkYXRlcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2NhbmRpZGF0ZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQkvL0ZpbHRlciBvbiBjYXBhYmlsaXRpZXMuCi0JCWlmIChzZWFyY2hlZENhcGFiaWxpdHkgIT0gbnVsbCkgewotCQkJc2VhcmNoZWRDYXBhYmlsaXR5ID0gcmV3cml0ZShzZWFyY2hlZENhcGFiaWxpdHkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSBwb29sW2ldOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc2VhcmNoZWRDYXBhYmlsaXR5Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJCQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzID0gY2FuZGlkYXRlLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCQkJCWlmIChjYXBhYmlsaXRpZXMubGVuZ3RoID09IDApCi0JCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNhcGFiaWxpdGllcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKChzZWFyY2hlZENhcGFiaWxpdHlba10uZ2V0TmFtZSgpLmVxdWFscyhjYXBhYmlsaXRpZXNbal0uZ2V0TmFtZSgpKSAmJiBzZWFyY2hlZENhcGFiaWxpdHlba10uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKGNhcGFiaWxpdGllc1tqXS5nZXROYW1lc3BhY2UoKSkgJiYgKHNlYXJjaGVkQ2FwYWJpbGl0eVtrXS5nZXRSYW5nZSgpID09IG51bGwgPyB0cnVlIDogc2VhcmNoZWRDYXBhYmlsaXR5W2tdLmdldFJhbmdlKCkuaXNJbmNsdWRlZChjYXBhYmlsaXRpZXNbal0uZ2V0VmVyc2lvbigpKSkpKSB7IC8vVE9ETyBOZWVkIHRvIGRlYWwgd2l0aCBvcHRpb24KLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbGlkICYmICghZnJhZ21lbnRzT25seSB8fCBjYW5kaWRhdGUuaXNGcmFnbWVudCgpKSkgewotCQkJCQkJY2FuZGlkYXRlcy5hZGQoY2FuZGlkYXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXBvb2wgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBjYW5kaWRhdGVzLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbY2FuZGlkYXRlcy5zaXplKCldKTsKLQkJfQotCi0JCXJldHVybiBwb29sOwotCX0KLQotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmV3cml0ZShSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZENhcGFiaWxpdGllcykgewotCQlpZiAocmVjb21tZW5kYXRpb25zID09IG51bGwpCi0JCQlyZXR1cm4gcmVxdWlyZWRDYXBhYmlsaXRpZXM7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlc3VsdCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZWRDYXBhYmlsaXRpZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZENhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gZ2V0UmVjb21tZW5kYXRpb24ocmVxdWlyZWRDYXBhYmlsaXRpZXNbaV0pOwotCQkJaWYgKHJlc3VsdFtpXSA9PSBudWxsKQotCQkJCXJlc3VsdFtpXSA9IHJlcXVpcmVkQ2FwYWJpbGl0aWVzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgZ2V0UmVjb21tZW5kYXRpb24oUmVxdWlyZWRDYXBhYmlsaXR5IG1hdGNoKSB7Ci0JCVJlY29tbWVuZGF0aW9uIGZvdW5kUmVjb21tZW5kYXRpb24gPSByZWNvbW1lbmRhdGlvbnMuZmluZFJlY29tbWVuZGF0aW9uKG1hdGNoKTsKLQkJcmV0dXJuIGZvdW5kUmVjb21tZW5kYXRpb24gIT0gbnVsbCA/IGZvdW5kUmVjb21tZW5kYXRpb24ubmV3VmFsdWUoKSA6IG1hdGNoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9Qcm9qZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9Qcm9qZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0YjM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUHJvamVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LklRdWVyeWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuSW52YWxpZFN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2F0NGoucGIuSVBCU29sdmVyOwotaW1wb3J0IG9yZy5zYXQ0ai5wYi5Tb2x2ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zYXQ0ai5wYi5yZWFkZXIuT1BCRWNsaXBzZVJlYWRlcjIwMDc7Ci1pbXBvcnQgb3JnLnNhdDRqLnJlYWRlci5QYXJzZUZvcm1hdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2F0NGouc3BlY3MuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBTQVQ0SiBhbmQgdGhlIHBsYW5uZXIuIEl0IHByb2R1Y2VzIGEKLSAqIGJvb2xlYW4gc2F0aXNmaWFiaWxpdHkgcHJvYmxlbSwgaW52b2tlcyB0aGUgc29sdmVyLCBhbmQgY29udmVydHMgdGhlIHNvbHZlciByZXN1bHQKLSAqIGJhY2sgaW50byBpbmZvcm1hdGlvbiB1bmRlcnN0YW5kYWJsZSBieSB0aGUgcGxhbm5lci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgSVF1ZXJ5YWJsZSBwaWNrZXI7Ci0KLQlwcml2YXRlIE1hcCB2YXJpYWJsZXM7IC8va2V5IElVLCB2YWx1ZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIGluIHRoZSBwcm9ibGVtCi0JcHJpdmF0ZSBNYXAgbm9vcFZhcmlhYmxlczsgLy9rZXkgSVUsIHZhbHVlIGNvcnJlc3BvbmRpbmcgbm8gb3B0aW9uYWxpdHkgdmFyaWFibGUgaW4gdGhlIHByb2JsZW0sIAotCXByaXZhdGUgTGlzdCBhYnN0cmFjdFZhcmlhYmxlczsKLQotCXByaXZhdGUgVHdvVGllck1hcCBzbGljZTsgLy9UaGUgSVVzIHRoYXQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUgcHJvYmxlbQotCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQ7Ci0KLQlwcml2YXRlIGludCB2YXJDb3VudCA9IDE7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb25zdHJhaW50czsKLQlwcml2YXRlIEFycmF5TGlzdCBkZXBlbmRlbmNpZXM7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgdGF1dG9sb2dpZXM7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgb2JqZWN0aXZlOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGV4cGxhbmF0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigiZXhwbGFpbjogIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENvbGxlY3Rpb24gc29sdXRpb247Ci0KLQlwcml2YXRlIEZpbGUgcHJvYmxlbUZpbGU7Ci0JcHJpdmF0ZSBNdWx0aVN0YXR1cyByZXN1bHQ7Ci0KLQlwdWJsaWMgUHJvamVjdG9yKElRdWVyeWFibGUgcSwgRGljdGlvbmFyeSBjb250ZXh0KSB7Ci0JCXBpY2tlciA9IHE7Ci0JCXZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW5vb3BWYXJpYWJsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlzbGljZSA9IG5ldyBUd29UaWVyTWFwKCk7Ci0JCWNvbnN0cmFpbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXV0b2xvZ2llcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzZWxlY3Rpb25Db250ZXh0ID0gY29udGV4dDsKLQkJYWJzdHJhY3RWYXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgSVN0YXR1cy5PSywgTWVzc2FnZXMuUGxhbm5lcl9Qcm9ibGVtc19yZXNvbHZpbmdfcGxhbiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5jb2RlKElJbnN0YWxsYWJsZVVuaXRbXSBpdXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJbG9uZyBzdGFydCA9IDA7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgcHJvamVjdGlvbjogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlJdGVyYXRvciBpdXNUb0VuY29kZSA9IHBpY2tlci5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdXNUb0VuY29kZS5oYXNOZXh0KCkpIHsKLQkJCQlwcm9jZXNzSVUoKElJbnN0YWxsYWJsZVVuaXQpIGl1c1RvRW5jb2RlLm5leHQoKSk7Ci0JCQl9Ci0JCQljcmVhdGVDb25zdHJhaW50c0ZvclNpbmdsZXRvbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspIHsKLQkJCQljcmVhdGVNdXN0SGF2ZXMoaXVzW2ldKTsKLQkJCX0KLQkJCWNyZWF0ZU9wdGltaXphdGlvbkZ1bmN0aW9uKCk7Ci0JCQlwZXJzaXN0KCk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb24gY29tcGxldGU6ICIgKyAoc3RvcCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCX0KLQotCS8vQ3JlYXRlIGFuIG9wdGltaXphdGlvbiBmdW5jdGlvbiBmYXZvcmluZyB0aGUgaGlnaGVzdCB2ZXJzaW9uIG9mIGVhY2ggSVUgIAotCXByaXZhdGUgdm9pZCBjcmVhdGVPcHRpbWl6YXRpb25GdW5jdGlvbigpIHsKLQkJb2JqZWN0aXZlID0gbmV3IFN0cmluZ0J1ZmZlcigibWluOiIpOyAvLyROT04tTkxTLTEkCi0JCVNldCBzID0gc2xpY2UuZW50cnlTZXQoKTsKLQotCQkvL0FkZCB0aGUgYWJzdHJhY3QgdmFyaWFibGVzCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhYnN0cmFjdFZhcmlhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlvYmplY3RpdmUuYXBwZW5kKCIgLTIgIikuYXBwZW5kKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUhhc2hNYXAgY29uZmxpY3RpbmdFbnRyaWVzID0gKEhhc2hNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoY29uZmxpY3RpbmdFbnRyaWVzLnNpemUoKSA8PSAxKSB7Ci0JCQkJb2JqZWN0aXZlLmFwcGVuZCgiIDEgIikuYXBwZW5kKGdldFZhcmlhYmxlKChJSW5zdGFsbGFibGVVbml0KSBjb25mbGljdGluZ0VudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCB0b1NvcnQgPSBuZXcgQXJyYXlMaXN0KGNvbmZsaWN0aW5nRW50cmllcy52YWx1ZXMoKSk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHRvU29ydCk7Ci0JCQlkb3VibGUgd2VpZ2h0ID0gTWF0aC5wb3coMTAsIHRvU29ydC5zaXplKCkgLSAxKTsKLQkJCWludCBjb3VudCA9IHRvU29ydC5zaXplKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IHRvU29ydC5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgewotCQkJCWNvdW50LS07Ci0JCQkJb2JqZWN0aXZlLmFwcGVuZCgnICcpLmFwcGVuZCgoaW50KSB3ZWlnaHQpLmFwcGVuZCgnICcpLmFwcGVuZChnZXRWYXJpYWJsZSgoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IyLm5leHQoKSkpOwotCQkJCXdlaWdodCA9IHdlaWdodCAvIDEwOwotCQkJfQotCQl9Ci0JCW9iamVjdGl2ZS5hcHBlbmQoIiA7Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTXVzdEhhdmVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJdGF1dG9sb2dpZXMuYWRkKCIgKzEgIiArIGdldFZhcmlhYmxlKGl1KSArICIgPSAxOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmVnYXRpb24oSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQl0YXV0b2xvZ2llcy5hZGQoIiArMSIgKyBnZXRWYXJpYWJsZShpdSkgKyAiID0gMDsiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvLyBDaGVjayB3aGV0aGVyIHRoZSByZXF1aXJlbWVudCBpcyBhcHBsaWNhYmxlCi0JcHJpdmF0ZSBib29sZWFuIGlzQXBwbGljYWJsZShSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCVN0cmluZyBmaWx0ZXIgPSByZXEuZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJcmV0dXJuIERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuY3JlYXRlRmlsdGVyKGZpbHRlcikubWF0Y2goc2VsZWN0aW9uQ29udGV4dCk7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLy9Xcml0ZSB0aGUgcHJvYmxlbSBnZW5lcmF0ZWQgaW50byBhIHRlbXBvcmFyeSBmaWxlCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3QoKSB7Ci0JCXRyeSB7Ci0JCQlwcm9ibGVtRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInAyRW5jb2RpbmciLCAiLm9wYiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJQnVmZmVyZWRXcml0ZXIgdyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwcm9ibGVtRmlsZSkpOwotCQkJaW50IGNsYXVzZUNvdW50ID0gdGF1dG9sb2dpZXMuc2l6ZSgpICsgZGVwZW5kZW5jaWVzLnNpemUoKSArIGNvbnN0cmFpbnRzLnNpemUoKTsKLQotCQkJdy53cml0ZSgiKiAjdmFyaWFibGU9ICIgKyB2YXJDb3VudCArICIgI2NvbnN0cmFpbnQ9ICIgKyBjbGF1c2VDb3VudCArICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdy5uZXdMaW5lKCk7Ci0JCQl3LndyaXRlKCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJCXcubmV3TGluZSgpOwotCi0JCQlpZiAoY2xhdXNlQ291bnQgPT0gMCkgewotCQkJCXcuY2xvc2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl3LndyaXRlKG9iamVjdGl2ZS50b1N0cmluZygpKTsKLQkJCXcubmV3TGluZSgpOwotCQkJdy5uZXdMaW5lKCk7Ci0KLQkJCXcud3JpdGUoZXhwbGFuYXRpb24gKyAiIDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJdy5uZXdMaW5lKCk7Ci0JCQl3Lm5ld0xpbmUoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdy53cml0ZSgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCXcubmV3TGluZSgpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnN0cmFpbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQl3LndyaXRlKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJdy5uZXdMaW5lKCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGF1dG9sb2dpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCXcud3JpdGUoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl3Lm5ld0xpbmUoKTsKLQkJCX0KLQkJCXcuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5QbGFubmVyX0Vycm9yX3NhdmluZ19vcGJmaWxlLCBwcm9ibGVtRmlsZSksIGUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0FwcGxpY2FibGUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlTdHJpbmcgZW5hYmxlbWVudEZpbHRlciA9IGl1LmdldEZpbHRlcigpOwotCQlpZiAoZW5hYmxlbWVudEZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5jcmVhdGVGaWx0ZXIoZW5hYmxlbWVudEZpbHRlcikubWF0Y2goc2VsZWN0aW9uQ29udGV4dCk7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc0lVKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJc2xpY2UucHV0KGl1LmdldElkKCksIGl1LmdldFZlcnNpb24oKSwgaXUpOwotCQlleHBsYW5hdGlvbi5hcHBlbmQoIiAiKS5hcHBlbmQoZ2V0VmFyaWFibGUoaXUpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWlzQXBwbGljYWJsZShpdSkpIHsKLQkJCWNyZWF0ZU5lZ2F0aW9uKGl1KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBpdS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCQlpZiAocmVxcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpc0FwcGxpY2FibGUocmVxc1tpXSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWV4cGFuZFJlcXVpcmVtZW50KGl1LCByZXFzW2ldKTsKLQkJfQotCQlhZGRPcHRpb25hbGl0eUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkT3B0aW9uYWxpdHlFeHByZXNzaW9uKCkgewotCQlpZiAob3B0aW9uYWxpdHlFeHByZXNzaW9uICE9IG51bGwgJiYgY291bnRPcHRpb25hbElVcyA+IDApCi0JCQlkZXBlbmRlbmNpZXMuYWRkKG9wdGlvbmFsaXR5RXhwcmVzc2lvbiArICIgPj0gMDsiKTsgLy8kTk9OLU5MUy0xJAotCQlvcHRpb25hbGl0eUV4cHJlc3Npb24gPSBudWxsOwotCQljb3VudE9wdGlvbmFsSVVzID0gMDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBvcHRpb25hbGl0eUV4cHJlc3Npb24gPSBudWxsOwotCXByaXZhdGUgaW50IGNvdW50T3B0aW9uYWxJVXMgPSAwOwotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZE9wdGlvbmFsUmVxdWlyZW1lbnQoSUluc3RhbGxhYmxlVW5pdCBpdSwgUmVxdWlyZWRDYXBhYmlsaXR5IHJlcSkgewotCQlTdHJpbmcgYWJzdHJhY3RWYXIgPSBnZXRBYnN0cmFjdFZhcmlhYmxlKCk7Ci0JCVN0cmluZyBleHByZXNzaW9uID0gIiAtMSAiICsgYWJzdHJhY3RWYXI7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdG9yIG1hdGNoZXMgPSBwaWNrZXIucXVlcnkobmV3IENhcGFiaWxpdHlRdWVyeShyZXEpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlpZiAob3B0aW9uYWxpdHlFeHByZXNzaW9uID09IG51bGwpCi0JCQlvcHRpb25hbGl0eUV4cHJlc3Npb24gPSAiIC0xICIgKyBnZXRWYXJpYWJsZShpdSkgKyAiIDEgIiArIGdldE5vT3B0aW9uYWxWYXJpYWJsZShpdSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQotCQlpbnQgY291bnRNYXRjaGVzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBtYXRjaCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWlzQXBwbGljYWJsZShtYXRjaCkpCi0JCQkJY29udGludWU7Ci0JCQljb3VudE1hdGNoZXMrKzsKLQkJCWV4cHJlc3Npb24gKz0gIiAxICIgKyBnZXRWYXJpYWJsZShtYXRjaCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb3VudE9wdGlvbmFsSVVzICs9IGNvdW50TWF0Y2hlczsKLQkJaWYgKGNvdW50TWF0Y2hlcyA+IDApIHsKLQkJCWRlcGVuZGVuY2llcy5hZGQoIiAtMSAiICsgZ2V0Tm9PcHRpb25hbFZhcmlhYmxlKGl1KSArICIgLTEgIiArIGFic3RyYWN0VmFyICsgIiA+PSAtMTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWRlcGVuZGVuY2llcy5hZGQoZXhwcmVzc2lvbiArICIgPj0gMDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3B0aW9uYWxpdHlFeHByZXNzaW9uICs9ICIgMSAiICsgYWJzdHJhY3RWYXI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gSVUgZm91bmQgdG8gc2F0aXNmeSBvcHRpb25hbCBkZXBlbmRlbmN5IG9mICIgKyBpdSArICIgcmVxICIgKyByZXEpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmROb3JtYWxSZXF1aXJlbWVudChJSW5zdGFsbGFibGVVbml0IGl1LCBSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCS8vR2VuZXJhdGUgdGhlIHJlZ3VsYXIgcmVxdWlyZW1lbnQKLQkJU3RyaW5nIGV4cHJlc3Npb24gPSAiLTEgIiArIGdldFZhcmlhYmxlKGl1KTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0b3IgbWF0Y2hlcyA9IHBpY2tlci5xdWVyeShuZXcgQ2FwYWJpbGl0eVF1ZXJ5KHJlcSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0KLQkJaW50IGNvdW50TWF0Y2hlcyA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgbWF0Y2ggPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFpc0FwcGxpY2FibGUobWF0Y2gpKQotCQkJCWNvbnRpbnVlOwotCQkJY291bnRNYXRjaGVzKys7Ci0JCQlleHByZXNzaW9uICs9ICIgKzEgIiArIGdldFZhcmlhYmxlKG1hdGNoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNvdW50TWF0Y2hlcyA+IDApIHsKLQkJCWRlcGVuZGVuY2llcy5hZGQoZXhwcmVzc2lvbiArICIgPj0gMDsiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeSwgaXUsIHJlcSkpKTsKLQkJCWNyZWF0ZU5lZ2F0aW9uKGl1KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRSZXF1aXJlbWVudChJSW5zdGFsbGFibGVVbml0IGl1LCBSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCWlmIChyZXEuaXNPcHRpb25hbCgpKQotCQkJZXhwYW5kT3B0aW9uYWxSZXF1aXJlbWVudChpdSwgcmVxKTsKLQkJZWxzZQotCQkJZXhwYW5kTm9ybWFsUmVxdWlyZW1lbnQoaXUsIHJlcSk7Ci0JfQotCi0JLy9DcmVhdGUgY29uc3RyYWludHMgdG8gZGVhbCB3aXRoIHNpbmdsZXRvbgotCS8vV2hlbiB0aGVyZSBpcyBhIG1peCBvZiBzaW5nbGV0b24gYW5kIG5vbiBzaW5nbGV0b24sIHNldmVyYWwgY29uc3RyYWludHMgYXJlIGdlbmVyYXRlZCAKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uc3RyYWludHNGb3JTaW5nbGV0b24oKSB7Ci0JCVNldCBzID0gc2xpY2UuZW50cnlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJSGFzaE1hcCBjb25mbGljdGluZ0VudHJpZXMgPSAoSGFzaE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChjb25mbGljdGluZ0VudHJpZXMuc2l6ZSgpIDwgMikKLQkJCQljb250aW51ZTsKLQotCQkJQ29sbGVjdGlvbiBjb25mbGljdGluZ1ZlcnNpb25zID0gY29uZmxpY3RpbmdFbnRyaWVzLnZhbHVlcygpOwotCQkJU3RyaW5nIHNpbmdsZXRvblJ1bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJQXJyYXlMaXN0IG5vblNpbmdsZXRvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBjb3VudFNpbmdsZXRvbiA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGNvbmZsaWN0SXRlcmF0b3IgPSBjb25mbGljdGluZ1ZlcnNpb25zLml0ZXJhdG9yKCk7IGNvbmZsaWN0SXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgY29uZmxpY3RFbHQgPSAoSUluc3RhbGxhYmxlVW5pdCkgY29uZmxpY3RJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGNvbmZsaWN0RWx0LmlzU2luZ2xldG9uKCkpIHsKLQkJCQkJc2luZ2xldG9uUnVsZSArPSAiIC0xICIgKyBnZXRWYXJpYWJsZShjb25mbGljdEVsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY291bnRTaW5nbGV0b24rKzsKLQkJCQl9IGVsc2UgewotCQkJCQlub25TaW5nbGV0b24uYWRkKGNvbmZsaWN0RWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY291bnRTaW5nbGV0b24gPT0gMCkKLQkJCQljb250aW51ZTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSBub25TaW5nbGV0b24uaXRlcmF0b3IoKTsgaXRlcmF0b3IyLmhhc05leHQoKTspIHsKLQkJCQljb25zdHJhaW50cy5hZGQoc2luZ2xldG9uUnVsZSArICIgLTEgIiArIGdldFZhcmlhYmxlKChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvcjIubmV4dCgpKSArICIgPj0gLTE7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJc2luZ2xldG9uUnVsZSArPSAiID49IC0xOyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbnN0cmFpbnRzLmFkZChzaW5nbGV0b25SdWxlKTsKLQkJfQotCX0KLQotCS8vUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIAotCXByaXZhdGUgU3RyaW5nIGdldFZhcmlhYmxlKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJU3RyaW5nIHYgPSAoU3RyaW5nKSB2YXJpYWJsZXMuZ2V0KGl1KTsKLQkJaWYgKHYgPT0gbnVsbCkgewotCQkJdiA9IG5ldyBTdHJpbmcoIngiICsgdmFyQ291bnQrKyk7IC8vJE5PTi1OTFMtMSQKLQkJCXZhcmlhYmxlcy5wdXQoaXUsIHYpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFic3RyYWN0VmFyaWFibGUoKSB7Ci0JCVN0cmluZyBuZXdWYXIgPSBuZXcgU3RyaW5nKCJ4IiArIHZhckNvdW50KyspOyAvLyROT04tTkxTLTEkCi0JCWFic3RyYWN0VmFyaWFibGVzLmFkZChuZXdWYXIpOwotCQlyZXR1cm4gbmV3VmFyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5vT3B0aW9uYWxWYXJpYWJsZShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVN0cmluZyB2ID0gKFN0cmluZykgbm9vcFZhcmlhYmxlcy5nZXQoaXUpOwotCQlpZiAodiA9PSBudWxsKSB7Ci0JCQl2ID0gbmV3IFN0cmluZygieCIgKyB2YXJDb3VudCsrKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9vcFZhcmlhYmxlcy5wdXQoaXUsIHYpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGludm9rZVNvbHZlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc3VsdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJUEJTb2x2ZXIgc29sdmVyID0gU29sdmVyRmFjdG9yeS5uZXdFY2xpcHNlUDIoKTsKLQkJc29sdmVyLnNldFRpbWVvdXQoNjApOwotCQlPUEJFY2xpcHNlUmVhZGVyMjAwNyByZWFkZXIgPSBuZXcgT1BCRWNsaXBzZVJlYWRlcjIwMDcoc29sdmVyKTsKLQkJLy8gQ05GIGZpbGVuYW1lIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnZva2luZyBzb2x2ZXI6ICIgKyBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZVJlYWRlciBmciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmciA9IG5ldyBGaWxlUmVhZGVyKHByb2JsZW1GaWxlKTsKLQkJCUlQcm9ibGVtIHByb2JsZW0gPSByZWFkZXIucGFyc2VJbnN0YW5jZShmcik7Ci0JCQlpZiAocHJvYmxlbS5pc1NhdGlzZmlhYmxlKCkpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXRpc2ZpYWJsZSAhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlYWRlci5kZWNvZGUocHJvYmxlbS5tb2RlbCgpKSk7Ci0JCQkJfQotCQkJCWJhY2tUb0lVKHByb2JsZW0pOwotCQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTb2x2ZXIgc29sdXRpb24gZm91bmQ6ICIgKyAoc3RvcCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuc2F0aXNmaWFibGUgISIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0Lm1lcmdlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVW5zYXRpc2ZpYWJsZV9wcm9ibGVtLCBwcm9ibGVtRmlsZSkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuUGxhbm5lcl9NaXNzaW5nX29wYl9maWxlLCBwcm9ibGVtRmlsZSkpKTsKLQkJfSBjYXRjaCAoUGFyc2VGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5QbGFubmVyX0Zvcm1hdF9lcnJvciwgcHJvYmxlbUZpbGUpKSk7Ci0JCX0gY2F0Y2ggKENvbnRyYWRpY3Rpb25FeGNlcHRpb24gZSkgewotCQkJcmVzdWx0Lm1lcmdlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVHJpdmlhbF9leGNlcHRpb24sIHByb2JsZW1GaWxlKSkpOwotCQl9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5tZXJnZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5QbGFubmVyX1RpbWVvdXQsIHByb2JsZW1GaWxlKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZyICE9IG51bGwpCi0JCQkJCWZyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJCXByb2JsZW1GaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhY2tUb0lVKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJc29sdXRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgYWxsSVVzID0gdmFyaWFibGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgYWxsSVVzLmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBhbGxJVXMubmV4dCgpOwotCQkJaW50IG1hdGNoID0gSW50ZWdlci5wYXJzZUludCgoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSkuc3Vic3RyaW5nKDEpKTsKLQkJCWlmIChwcm9ibGVtLm1vZGVsKG1hdGNoKSkgewotCQkJCXNvbHV0aW9uLmFkZCgoKElJbnN0YWxsYWJsZVVuaXQpIGVudHJ5LmdldEtleSgpKS51bnJlc29sdmVkKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50U29sdXRpb24oQ29sbGVjdGlvbiBzdGF0ZSkgewotCQlBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3Qoc3RhdGUpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGwpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlcnMgb2YgSVVzIHNlbGVjdGVkOiIgKyBsLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGwuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBleHRyYWN0U29sdXRpb24oKSB7Ci0JCWlmIChERUJVRykKLQkJCXByaW50U29sdXRpb24oc29sdXRpb24pOwotCQlyZXR1cm4gc29sdXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1F1ZXJ5YWJsZUFycmF5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUXVlcnlhYmxlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjYzU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUXVlcnlhYmxlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5Lio7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeWFibGVBcnJheSBpbXBsZW1lbnRzIElRdWVyeWFibGUgewotCXN0YXRpYyBjbGFzcyBJVUNhcGFiaWxpdHkgewotCQlmaW5hbCBJSW5zdGFsbGFibGVVbml0IGl1OwotCQlmaW5hbCBQcm92aWRlZENhcGFiaWxpdHkgY2FwYWJpbGl0eTsKLQotCQlwdWJsaWMgSVVDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFByb3ZpZGVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCQl0aGlzLml1ID0gaXU7Ci0JCQl0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGRhdGFTZXQ7Ci0JcHJpdmF0ZSBNYXAgbmFtZWRDYXBhYmlsaXR5SW5kZXg7Ci0KLQlwdWJsaWMgUXVlcnlhYmxlQXJyYXkoSUluc3RhbGxhYmxlVW5pdFtdIGl1cykgewotCQlkYXRhU2V0ID0gQXJyYXlzLmFzTGlzdChpdXMpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UXVlcnkpCi0JCQlyZXR1cm4gcXVlcnlDYXBhYmlsaXR5KChDYXBhYmlsaXR5UXVlcnkpIHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCQlyZXR1cm4gcXVlcnkucGVyZm9ybShkYXRhU2V0Lml0ZXJhdG9yKCksIGNvbGxlY3Rvcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0b3IgcXVlcnlDYXBhYmlsaXR5KENhcGFiaWxpdHlRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdlbmVyYXRlTmFtZWRDYXBhYmlsaXR5SW5kZXgoKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZENhcGFiaWxpdGllcyA9IHF1ZXJ5LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0SVVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZENhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotCQkJQ29sbGVjdGlvbiBtYXRjaGluZ0lVcyA9IGZpbmRNYXRjaGluZ0lVcyhyZXF1aXJlZENhcGFiaWxpdGllc1tpXSk7Ci0JCQlpZiAobWF0Y2hpbmdJVXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gY29sbGVjdG9yOwotCQkJaWYgKHJlc3VsdElVcyA9PSBudWxsKQotCQkJCXJlc3VsdElVcyA9IG1hdGNoaW5nSVVzOwotCQkJZWxzZQotCQkJCXJlc3VsdElVcy5yZXRhaW5BbGwobWF0Y2hpbmdJVXMpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdElVcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJY29sbGVjdG9yLmFjY2VwdChpdGVyYXRvci5uZXh0KCkpOwotCi0JCXJldHVybiBjb2xsZWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZpbmRNYXRjaGluZ0lVcyhSZXF1aXJlZENhcGFiaWxpdHkgcmVxdWlyZWRDYXBhYmlsaXR5KSB7Ci0JCUxpc3QgaXVDYXBhYmlsaXRpZXMgPSAoTGlzdCkgbmFtZWRDYXBhYmlsaXR5SW5kZXguZ2V0KHJlcXVpcmVkQ2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCQlpZiAoaXVDYXBhYmlsaXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVNldCBtYXRjaGluZ0lVcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdUNhcGFiaWxpdGllcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJVUNhcGFiaWxpdHkgaXVDYXBhYmlsaXR5ID0gKElVQ2FwYWJpbGl0eSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1Q2FwYWJpbGl0eS5jYXBhYmlsaXR5LmlzU2F0aXNmaWVkQnkocmVxdWlyZWRDYXBhYmlsaXR5KSkKLQkJCQltYXRjaGluZ0lVcy5hZGQoaXVDYXBhYmlsaXR5Lml1KTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hpbmdJVXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTmFtZWRDYXBhYmlsaXR5SW5kZXgoKSB7Ci0JCWlmIChuYW1lZENhcGFiaWxpdHlJbmRleCAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW5hbWVkQ2FwYWJpbGl0eUluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRhdGFTZXQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZWRDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb3ZpZGVkQ2FwYWJpbGl0aWVzW2ldLmdldE5hbWUoKTsKLQkJCQlMaXN0IGl1Q2FwYWJpbGl0aWVzID0gKExpc3QpIG5hbWVkQ2FwYWJpbGl0eUluZGV4LmdldChuYW1lKTsKLQkJCQlpZiAoaXVDYXBhYmlsaXRpZXMgPT0gbnVsbCkgewotCQkJCQlpdUNhcGFiaWxpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbmFtZWRDYXBhYmlsaXR5SW5kZXgucHV0KG5hbWUsIGl1Q2FwYWJpbGl0aWVzKTsKLQkJCQl9Ci0JCQkJaXVDYXBhYmlsaXRpZXMuYWRkKG5ldyBJVUNhcGFiaWxpdHkoaXUsIHByb3ZpZGVkQ2FwYWJpbGl0aWVzW2ldKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUmVjb21tZW5kYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE1MzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFJlY29tbWVuZGF0aW9uIHsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uOwotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IG5ld1ZhbHVlOwotCi0JcHVibGljIFJlY29tbWVuZGF0aW9uKFJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uMiwgUmVxdWlyZWRDYXBhYmlsaXR5IG5ld1ZhbHVlMikgewotCQl0aGlzLmFwcGx5T24gPSBhcHBseU9uMjsKLQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlMjsKLQl9Ci0KLQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24oKSB7Ci0JCXJldHVybiBhcHBseU9uOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHkgbmV3VmFsdWUoKSB7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFJlcXVpcmVkQ2FwYWJpbGl0eSB0b01hdGNoKSB7Ci0JCWlmICghdG9NYXRjaC5nZXROYW1lc3BhY2UoKS5lcXVhbHMoYXBwbHlPbi5nZXROYW1lc3BhY2UoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghdG9NYXRjaC5nZXROYW1lKCkuZXF1YWxzKGFwcGx5T24uZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRvTWF0Y2guZ2V0UmFuZ2UoKS5lcXVhbHMoYXBwbHlPbi5nZXRSYW5nZSgpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vVE9ETyBIZXJlLCBpbiB0aGUgbG9uZyBydW4gd2Ugd2FudCB0byBiZSBzbWFydGVyIC5mb3IgZXhhbXBsZSB3ZSBjb3VsZCBjaGVjayB0aGF0IHRoZSByYW5nZSBvZiB0aGUgbWF0Y2ggaXMgYSBzdWJzZXQgb2YgdGhlIHJhbmdlIHNwZWNpZmllZCBvbiBhcHBseU9uLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBtYXRjaGVzKFJlY29tbWVuZGF0aW9uIHRvTWF0Y2gpIHsKLQkJcmV0dXJuIG1hdGNoZXModG9NYXRjaC5hcHBseU9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBSZWNvbW1lbmRhdGlvbiBtZXJnZShSZWNvbW1lbmRhdGlvbiByMikgewotCQlWZXJzaW9uUmFuZ2UgcmVzdWx0ID0gaW50ZXJzZWN0KG5ld1ZhbHVlKCkuZ2V0UmFuZ2UoKSwgcjIubmV3VmFsdWUoKS5nZXRSYW5nZSgpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUmVjb21tZW5kYXRpb24oYXBwbHlPbiwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShhcHBseU9uLmdldE5hbWVzcGFjZSgpLCBhcHBseU9uLmdldE5hbWUoKSwgcmVzdWx0LCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIFZlcnNpb25SYW5nZSBpbnRlcnNlY3QoVmVyc2lvblJhbmdlIHIxLCBWZXJzaW9uUmFuZ2UgcjIpIHsKLQkJVmVyc2lvbiByZXN1bHRNaW4gPSBudWxsOwotCQlib29sZWFuIHJlc3VsdE1pbkluY2x1ZGVkID0gZmFsc2U7Ci0JCVZlcnNpb24gcmVzdWx0TWF4ID0gbnVsbDsKLQkJYm9vbGVhbiByZXN1bHRNYXhJbmNsdWRlZCA9IGZhbHNlOwotCi0JCWludCBtaW5Db21wYXJlID0gcjEuZ2V0TWluaW11bSgpLmNvbXBhcmVUbyhyMi5nZXRNaW5pbXVtKCkpOwotCQlpZiAobWluQ29tcGFyZSA8IDApIHsKLQkJCXJlc3VsdE1pbiA9IHIyLmdldE1pbmltdW0oKTsKLQkJCXJlc3VsdE1pbkluY2x1ZGVkID0gcjIuZ2V0SW5jbHVkZU1pbmltdW0oKTsKLQkJfSBlbHNlIGlmIChtaW5Db21wYXJlID4gMCkgewotCQkJcmVzdWx0TWluID0gcjEuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWluaW11bSgpOwotCQl9IGVsc2UgaWYgKG1pbkNvbXBhcmUgPT0gMCkgewotCQkJcmVzdWx0TWluID0gcjEuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWluaW11bSgpICYmIHIyLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0KLQotCQlpbnQgbWF4Q29tcGFyZSA9IHIxLmdldE1heGltdW0oKS5jb21wYXJlVG8ocjIuZ2V0TWF4aW11bSgpKTsKLQkJaWYgKG1heENvbXBhcmUgPiAwKSB7Ci0JCQlyZXN1bHRNYXggPSByMi5nZXRNYXhpbXVtKCk7Ci0JCQlyZXN1bHRNYXhJbmNsdWRlZCA9IHIyLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0gZWxzZSBpZiAobWF4Q29tcGFyZSA8IDApIHsKLQkJCXJlc3VsdE1heCA9IHIxLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1heGltdW0oKTsKLQkJfSBlbHNlIGlmIChtYXhDb21wYXJlID09IDApIHsKLQkJCXJlc3VsdE1heCA9IHIxLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1heGltdW0oKSAmJiByMi5nZXRJbmNsdWRlTWF4aW11bSgpOwotCQl9Ci0KLQkJaW50IHJlc3VsdFJhbmdlQ29tcGFyaXNvbiA9IHJlc3VsdE1pbi5jb21wYXJlVG8ocmVzdWx0TWF4KTsKLQkJaWYgKHJlc3VsdFJhbmdlQ29tcGFyaXNvbiA8IDApCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZShyZXN1bHRNaW4sIHJlc3VsdE1pbkluY2x1ZGVkLCByZXN1bHRNYXgsIHJlc3VsdE1heEluY2x1ZGVkKTsKLQkJZWxzZSBpZiAocmVzdWx0UmFuZ2VDb21wYXJpc29uID09IDAgJiYgcmVzdWx0TWluSW5jbHVkZWQgPT0gcmVzdWx0TWF4SW5jbHVkZWQpCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZShyZXN1bHRNaW4sIHJlc3VsdE1pbkluY2x1ZGVkLCByZXN1bHRNYXgsIHJlc3VsdE1heEluY2x1ZGVkKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlKFJlY29tbWVuZGF0aW9uIG90aGVyKSB7Ci0JCXJldHVybiBpbnRlcnNlY3QobmV3VmFsdWUuZ2V0UmFuZ2UoKSwgb3RoZXIubmV3VmFsdWUuZ2V0UmFuZ2UoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcHBseU9uID09IG51bGwpID8gMCA6IGFwcGx5T24uaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuZXdWYWx1ZSA9PSBudWxsKSA/IDAgOiBuZXdWYWx1ZS5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgUmVjb21tZW5kYXRpb24gb3RoZXIgPSAoUmVjb21tZW5kYXRpb24pIG9iajsKLQkJaWYgKGFwcGx5T24gPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmFwcGx5T24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWFwcGx5T24uZXF1YWxzKG90aGVyLmFwcGx5T24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLm5ld1ZhbHVlICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob3RoZXIubmV3VmFsdWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTA0ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIUE9JTlRfREFUQV9LRVkgPSAicmVjb21tZW5kYXRpb25zIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLSU5EID0gInJlY29tbWVuZGF0aW9uIjsKLQotCXByaXZhdGUgU2V0IHJlY29tbWVuZGF0aW9uczsKLQotCXB1YmxpYyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IoU2V0IHJlY29tbWVuZGF0aW9ucykgewotCQl0aGlzLnJlY29tbWVuZGF0aW9ucyA9IHJlY29tbWVuZGF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFJlY29tbWVuZGF0aW9ucygpIHsKLQkJcmV0dXJuIHJlY29tbWVuZGF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgUmVjb21tZW5kYXRpb24gZmluZFJlY29tbWVuZGF0aW9uKFJlcXVpcmVkQ2FwYWJpbGl0eSB0b01hdGNoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNvbW1lbmRhdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUmVjb21tZW5kYXRpb24gbmFtZSA9IChSZWNvbW1lbmRhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5hbWUubWF0Y2hlcyh0b01hdGNoKSkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVjb21tZW5kYXRpb24gZmluZFJlY29tbWVuZGF0aW9uKFJlY29tbWVuZGF0aW9uIHRvTWF0Y2gpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY29tbWVuZGF0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNvbW1lbmRhdGlvbiBuYW1lID0gKFJlY29tbWVuZGF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmFtZS5tYXRjaGVzKHRvTWF0Y2gpKQotCQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vTWVyZ2UgdGhlIG90aGVyIGRlc2NyaXB0b3IgaW50byB0aGlzIG9uZS4gUmV0dXJuIGFuIE9LIFN0YXR1cyBpcyB0aGUgbWVyZ2VkIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIHJldHVybiBhbiBJTkZPIFN0YXR1cwotCXB1YmxpYyBJU3RhdHVzIG1lcmdlKFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciBvdGhlcikgewotCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3RoZXIucmVjb21tZW5kYXRpb25zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlY29tbWVuZGF0aW9uIG90aGVyUmVjb21tZW5kYXRpb24gPSAoUmVjb21tZW5kYXRpb24pIGl0Lm5leHQoKTsKLQkJCVJlY29tbWVuZGF0aW9uIG1hdGNoSW5UaGlzID0gZmluZFJlY29tbWVuZGF0aW9uKG90aGVyUmVjb21tZW5kYXRpb24pOwotCQkJaWYgKG1hdGNoSW5UaGlzID09IG51bGwpIHsKLQkJCQlyZWNvbW1lbmRhdGlvbnMuYWRkKG90aGVyUmVjb21tZW5kYXRpb24pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJUmVjb21tZW5kYXRpb24gbmV3UmVjID0gb3RoZXJSZWNvbW1lbmRhdGlvbi5tZXJnZShtYXRjaEluVGhpcyk7Ci0JCQlpZiAobmV3UmVjICE9IG51bGwpIHsKLQkJCQlyZWNvbW1lbmRhdGlvbnMucmVtb3ZlKG1hdGNoSW5UaGlzKTsKLQkJCQlyZWNvbW1lbmRhdGlvbnMuYWRkKG5ld1JlYyk7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCAwLCAiQ29uZmxpY3QgYmV0d2VlbiByZWNvbW1lbmRhdGlvbnMiLCBudWxsKTsKLQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgImNhbid0IG1lcmdlICIgKyBvdGhlclJlY29tbWVuZGF0aW9uICsgIiB3aXRoICIgKyBtYXRjaEluVGhpcykpOwotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcGFyc2UoU3RyaW5nIGRlc2NyaXB0b3IpIHsKLQkJU3RyaW5nVG9rZW5pemVyIGVudHJpZXMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlc2NyaXB0b3IsICJcbiIpOwotCQlTZXQgcmVjb21tZW5kYXRpb25zID0gbmV3IEhhc2hTZXQoZW50cmllcy5jb3VudFRva2VucygpKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBvbmVSZWMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIGVudHJpZXMubmV4dEVsZW1lbnQoKSwgIi8iKTsKLQkJCWlmIChvbmVSZWMuY291bnRUb2tlbnMoKSAhPSA0KSB7Ci0JCQkJLy9mb3JtYXQgZXJyb3IsIGlnbm9yZSBhbmQgY29udGludWUKLQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIG5zID0gb25lUmVjLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyBuYW1lID0gb25lUmVjLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyBvbGRSYW5nZSA9IG9uZVJlYy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlTdHJpbmcgbmV3UmFuZ2UgPSBvbmVSZWMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJcmVjb21tZW5kYXRpb25zLmFkZChuZXcgUmVjb21tZW5kYXRpb24oTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShucywgbmFtZSwgbmV3IFZlcnNpb25SYW5nZShvbGRSYW5nZSksIG51bGwsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkobnMsIG5hbWUsIG5ldyBWZXJzaW9uUmFuZ2UobmV3UmFuZ2UpLCBudWxsLCBmYWxzZSwgZmFsc2UpKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IocmVjb21tZW5kYXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHRvU2VyaWFsaXplKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0b1NlcmlhbGl6ZS5yZWNvbW1lbmRhdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUmVjb21tZW5kYXRpb24gZW50cnkgPSAoUmVjb21tZW5kYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3VsdC5hcHBlbmQoZW50cnkuYXBwbHlPbigpLmdldE5hbWVzcGFjZSgpICsgJy8nICsgZW50cnkuYXBwbHlPbigpLmdldE5hbWUoKSArICcvJyArIGVudHJ5LmFwcGx5T24oKS5nZXRSYW5nZSgpLnRvU3RyaW5nKCkgKyAnLycgKyBlbnRyeS5uZXdWYWx1ZSgpLmdldFJhbmdlKCkudG9TdHJpbmcoKSArICdcbicpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIG90aGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBvdGhlci5yZWNvbW1lbmRhdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVjb21tZW5kYXRpb24gb3RoZXJSZWNvbW1lbmRhdGlvbiA9IChSZWNvbW1lbmRhdGlvbikgaXQubmV4dCgpOwotCQkJUmVjb21tZW5kYXRpb24gbWF0Y2hJblRoaXMgPSBmaW5kUmVjb21tZW5kYXRpb24ob3RoZXJSZWNvbW1lbmRhdGlvbik7Ci0JCQlpZiAobWF0Y2hJblRoaXMgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFvdGhlclJlY29tbWVuZGF0aW9uLmlzQ29tcGF0aWJsZShtYXRjaEluVGhpcykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlcXVpcmVtZW50QmFzZWRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9SZXF1aXJlbWVudEJhc2VkRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGI4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlcXVpcmVtZW50QmFzZWRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotCi1wdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRCYXNlZEZpbHRlciBleHRlbmRzIElVRmlsdGVyIHsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXM7Ci0KLQlwdWJsaWMgUmVxdWlyZW1lbnRCYXNlZEZpbHRlcihSZXF1aXJlZENhcGFiaWxpdHlbXSB0b0ZpbHRlck9uKSB7Ci0JCXJlcXMgPSB0b0ZpbHRlck9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlcXNbaV0uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKSAmJiByZXFzW2ldLmdldE5hbWUoKS5lcXVhbHMoaXUuZ2V0SWQoKSkgJiYgcmVxc1tpXS5nZXRSYW5nZSgpLmlzSW5jbHVkZWQoaXUuZ2V0VmVyc2lvbigpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1NpbXBsZURpcmVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlRGlyZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNDg5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlRGlyZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucm9sbGJhY2suRm9ybWVyU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVEaXJlY3RvciBpbXBsZW1lbnRzIElEaXJlY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTExCQUNLX0xPQ0FUSU9OID0gInJvbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBpbnQgUGxhbldvcmsgPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IEVuZ2luZVdvcmsgPSAxMDA7Ci0JcHJpdmF0ZSBJRW5naW5lIGVuZ2luZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwdWJsaWMgU2ltcGxlRGlyZWN0b3IoKSB7Ci0JCWluaXRpYWxpemVSb2xsYmFja1JlcG9zaXRvcnkoKTsKLQkJZW5naW5lID0gKElFbmdpbmUpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJRW5naW5lLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChlbmdpbmUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb3Zpc2lvbmluZyBlbmdpbmUgaXMgbm90IHJlZ2lzdGVyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlwbGFubmVyID0gKElQbGFubmVyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHBsYW5uZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIHByb3Zpc2lvbmluZyBwbGFubmVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJvbGxiYWNrUmVwb3NpdG9yeSgpIHsKLQkJbmV3IEZvcm1lclN0YXRlKGdldFJvbGxiYWNrUmVwb3NpdG9yeUxvY2F0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBVUkwgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5TG9jYXRpb24oKSB7Ci0JCUFnZW50TG9jYXRpb24gYWdlbnRMb2NhdGlvbiA9IChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoYWdlbnRMb2NhdGlvbi5nZXREYXRhQXJlYShEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiksIFJPTExCQUNLX0xPQ0FUSU9OKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vd2Uga25vdyB0aGlzIGNhbid0IGhhcHBlbiBiZWNhdXNlIHRoZSBhYm92ZSBVUkwgaXMgd2VsbC1mb3JtZWQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmV2ZXJ0KElJbnN0YWxsYWJsZVVuaXQgdGFyZ2V0LCBJUHJvZmlsZSBwcm9maWxlLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBNZXNzYWdlcy5EaXJlY3Rvcl9UYXNrX1VwZGF0aW5nLCBQbGFuV29yayArIEVuZ2luZVdvcmspOwotCQl0cnkgewotCQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRSZXZlcnRQbGFuKHRhcmdldCwgY29udGV4dCwgc3ViLm5ld0NoaWxkKFBsYW5Xb3JrKSk7Ci0JCQlpZiAoIXBsYW4uZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJCXJldHVybiBwbGFuLmdldFN0YXR1cygpOwotCQkJcmV0dXJuIGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbi5nZXRPcGVyYW5kcygpLCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoRW5naW5lV29yaykpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHByb3Zpc2lvbihQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0LCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgdGFza05hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5EaXJlY3Rvcl9UYXNrX0luc3RhbGxpbmcsIHJlcXVlc3QuZ2V0UHJvZmlsZSgpLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIpKTsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGFza05hbWUsIFBsYW5Xb3JrICsgRW5naW5lV29yayk7Ci0JCXRyeSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0W10gaW5zdGFsbFJvb3RzID0gcmVxdWVzdC5nZXRBZGRlZEluc3RhbGxhYmxlVW5pdHMoKTsKLQkJCS8vIG1hcmsgdGhlIHJvb3RzIGFzIHN1Y2gKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFsbFJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVxdWVzdC5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoaW5zdGFsbFJvb3RzW2ldLCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPRklMRV9ST09UX0lVLCBCb29sZWFuLnRvU3RyaW5nKHRydWUpKTsKLQkJCX0KLQkJCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoUGxhbldvcmspKTsKLQkJCWlmICghcGxhbi5nZXRTdGF0dXMoKS5pc09LKCkpCi0JCQkJcmV0dXJuIHBsYW4uZ2V0U3RhdHVzKCk7Ci0KLQkJCUlTdGF0dXMgZW5naW5lUmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocmVxdWVzdC5nZXRQcm9maWxlKCksIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbi5nZXRPcGVyYW5kcygpLCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoRW5naW5lV29yaykpOwotCQkJcmV0dXJuIGVuZ2luZVJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yi5kb25lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlUGxhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1NpbXBsZVBsYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjZDYyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlUGxhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yb2xsYmFjay5Gb3JtZXJTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuVXBkYXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuSVF1ZXJ5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQbGFubmVyIGltcGxlbWVudHMgSVBsYW5uZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFeHBhbmRXb3JrID0gMTI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQU5ORVJfTUFSS0VSID0gInByaXZhdGUub3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wbGFubmVyLmluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIGdldEluc3RhbGxhYmxlVW5pdHMoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9maWxlIGdldFByb2ZpbGUoU3RyaW5nIHByb2ZpbGVJZCkgewotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHByb2ZpbGVSZWdpc3RyeS5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25pbmdQbGFuIGdlbmVyYXRlUHJvdmlzaW9uaW5nUGxhbihJU3RhdHVzIHN0YXR1cywgQ29sbGVjdGlvbiBmcm9tU3RhdGUsIENvbGxlY3Rpb24gdG9TdGF0ZSwgTGlzdCBmcm9tU3RhdGVPcmRlciwgTGlzdCBuZXdTdGF0ZU9yZGVyLCBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjaGFuZ2VSZXF1ZXN0KSB7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBpdU9wZXJhbmRzID0gZ2VuZXJhdGVPcGVyYXRpb25zKGZyb21TdGF0ZSwgdG9TdGF0ZSwgZnJvbVN0YXRlT3JkZXIsIG5ld1N0YXRlT3JkZXIpOwotCQlQcm9wZXJ0eU9wZXJhbmRbXSBwcm9wZXJ0eU9wZXJhbmRzID0gZ2VuZXJhdGVQcm9wZXJ0eU9wZXJhdGlvbnMoY2hhbmdlUmVxdWVzdCk7Ci0KLQkJT3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IE9wZXJhbmRbaXVPcGVyYW5kcy5sZW5ndGggKyBwcm9wZXJ0eU9wZXJhbmRzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaXVPcGVyYW5kcywgMCwgb3BlcmFuZHMsIDAsIGl1T3BlcmFuZHMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShwcm9wZXJ0eU9wZXJhbmRzLCAwLCBvcGVyYW5kcywgaXVPcGVyYW5kcy5sZW5ndGgsIHByb3BlcnR5T3BlcmFuZHMubGVuZ3RoKTsKLQotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ1BsYW4oc3RhdHVzLCBvcGVyYW5kcyk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhbmRbXSBnZW5lcmF0ZVByb3BlcnR5T3BlcmF0aW9ucyhQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCkgewotCQlJUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZSgpOwotCQlMaXN0IG9wZXJhbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBGaXJzdCBkZWFsIHdpdGggcHJvZmlsZSBwcm9wZXJ0aWVzIHRvIHJlbW92ZS4gIE9ubHkgZ2VuZXJhdGUgYW4gb3BlcmFuZCBpZiB0aGUgcHJvcGVydHkgd2FzIHRoZXJlIGluIHRoZSBmaXJzdCBwbGFjZQotCQlTdHJpbmdbXSB0b1JlbW92ZSA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb3BlcnRpZXNUb1JlbW92ZSgpOwotCQlNYXAgZXhpc3RpbmdQcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleGlzdGluZ1Byb3BlcnRpZXMuY29udGFpbnNLZXkodG9SZW1vdmVbaV0pKQotCQkJCW9wZXJhbmRzLmFkZChuZXcgUHJvcGVydHlPcGVyYW5kKHRvUmVtb3ZlW2ldLCBleGlzdGluZ1Byb3BlcnRpZXMuZ2V0KHRvUmVtb3ZlW2ldKSwgbnVsbCkpOwotCQl9Ci0JCS8vIE5vdyBkZWFsIHdpdGggcHJvZmlsZSBwcm9wZXJ0eSBjaGFuZ2VzL2FkZGl0aW9ucwotCQlNYXAgcHJvcGVydHlDaGFuZ2VzID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvcGVydGllc1RvQWRkKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0eUNoYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlvcGVyYW5kcy5hZGQobmV3IFByb3BlcnR5T3BlcmFuZChrZXksIGV4aXN0aW5nUHJvcGVydGllcy5nZXQoa2V5KSwgcHJvcGVydHlDaGFuZ2VzLmdldChrZXkpKSk7Ci0JCX0KLQkJLy8gTm93IGRlYWwgd2l0aCBpdSBwcm9wZXJ0eSBjaGFuZ2VzL2FkZGl0aW9ucy4gIAotCQkvLyBUT0RPIHdlIGFyZW4ndCB5ZXQgY2hlY2tpbmcgdGhhdCB0aGUgSVUgd2lsbCBleGlzdCBpbiB0aGUgZmluYWwgcHJvZmlsZSwgd2lsbCB0aGUgZW5naW5lIGRvIHRoaXM/Ci0JCU1hcCBhbGxJVVByb3BlcnR5Q2hhbmdlcyA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzVG9BZGQoKTsKLQkJaXRlciA9IGFsbElVUHJvcGVydHlDaGFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyLm5leHQoKTsKLQkJCU1hcCBpdVByb3BlcnR5Q2hhbmdlcyA9IChNYXApIGFsbElVUHJvcGVydHlDaGFuZ2VzLmdldChpdSk7Ci0JCQlJdGVyYXRvciBpdVByb3BJdGVyID0gaXVQcm9wZXJ0eUNoYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdVByb3BJdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdVByb3BJdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBrZXkpOwotCQkJCW9wZXJhbmRzLmFkZChuZXcgSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kKGl1LCBrZXksIG9sZFZhbHVlLCBpdVByb3BlcnR5Q2hhbmdlcy5nZXQoa2V5KSkpOwotCQkJfQotCQl9Ci0JCS8vIE5vdyBkZWFsIHdpdGggaXUgcHJvcGVydHkgcmVtb3ZhbHMuCi0JCS8vIFRPRE8gd2UgY291bGQgb3B0aW1pemUgYnkgbm90IGdlbmVyYXRpbmcgcHJvcGVydHkgcmVtb3ZhbHMgZm9yIElVJ3MgdGhhdCBhcmVuJ3QgdGhlcmUgb3Igd29uJ3QgYmUgdGhlcmUuICAKLQkJTWFwIGFsbElVUHJvcGVydHlEZWxldGlvbnMgPSBwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydGllc1RvUmVtb3ZlKCk7Ci0JCWl0ZXIgPSBhbGxJVVByb3BlcnR5RGVsZXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyLm5leHQoKTsKLQkJCU1hcCBleGlzdGluZ0lVUHJvcGVydGllcyA9IHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhpdSk7Ci0JCQlMaXN0IGl1UHJvcGVydHlSZW1vdmFscyA9IChMaXN0KSBhbGxJVVByb3BlcnR5RGVsZXRpb25zLmdldChpdSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXVQcm9wZXJ0eVJlbW92YWxzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCWlmIChleGlzdGluZ0lVUHJvcGVydGllcy5jb250YWluc0tleShrZXkpKQotCQkJCQlvcGVyYW5kcy5hZGQobmV3IEluc3RhbGxhYmxlVW5pdFByb3BlcnR5T3BlcmFuZChpdSwga2V5LCBleGlzdGluZ0lVUHJvcGVydGllcy5nZXQoa2V5KSwgbnVsbCkpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIChQcm9wZXJ0eU9wZXJhbmRbXSkgb3BlcmFuZHMudG9BcnJheShuZXcgUHJvcGVydHlPcGVyYW5kW29wZXJhbmRzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIGdlbmVyYXRlT3BlcmF0aW9ucyhDb2xsZWN0aW9uIGZyb21TdGF0ZSwgQ29sbGVjdGlvbiB0b1N0YXRlLCBMaXN0IGZyb21TdGF0ZU9yZGVyLCBMaXN0IG5ld1N0YXRlT3JkZXIpIHsKLQkJcmV0dXJuIHNvcnRPcGVyYXRpb25zKG5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tU3RhdGUsIHRvU3RhdGUpLCBuZXdTdGF0ZU9yZGVyLCBmcm9tU3RhdGVPcmRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gc29ydE9wZXJhdGlvbnMoSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHRvU29ydCwgTGlzdCBpbnN0YWxsT3JkZXIsIExpc3QgdW5pbnN0YWxsT3JkZXIpIHsKLQkJTGlzdCB1cGRhdGVPcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1NvcnQubGVuZ3RoOyBpKyspIHsKLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3AgPSB0b1NvcnRbaV07Ci0JCQlpZiAob3AuZmlyc3QoKSA9PSBudWxsICYmIG9wLnNlY29uZCgpICE9IG51bGwpIHsKLQkJCQlpbnN0YWxsT3JkZXIuc2V0KGluc3RhbGxPcmRlci5pbmRleE9mKG9wLnNlY29uZCgpKSwgb3ApOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG9wLmZpcnN0KCkgIT0gbnVsbCAmJiBvcC5zZWNvbmQoKSA9PSBudWxsKSB7Ci0JCQkJdW5pbnN0YWxsT3JkZXIuc2V0KHVuaW5zdGFsbE9yZGVyLmluZGV4T2Yob3AuZmlyc3QoKSksIG9wKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChvcC5maXJzdCgpICE9IG51bGwgJiYgb3Auc2Vjb25kKCkgIT0gbnVsbCkgewotCQkJCXVwZGF0ZU9wLmFkZChvcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5zdGFsbE9yZGVyLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWx0IGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgewotCQkJCXRvU29ydFtpKytdID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIGVsdDsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdW5pbnN0YWxsT3JkZXIuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbHQgaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSB7Ci0JCQkJdG9Tb3J0W2krK10gPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgZWx0OwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB1cGRhdGVPcC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWx0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsdCBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHsKLQkJCQl0b1NvcnRbaSsrXSA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBlbHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvU29ydDsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nUGxhbiBnZXRSZXZlcnRQbGFuKElJbnN0YWxsYWJsZVVuaXQgcHJvZmlsZVNuYXBzaG90LCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBFeHBhbmRXb3JrKTsKLQkJc3ViLnNldFRhc2tOYW1lKE1lc3NhZ2VzLkRpcmVjdG9yX1Rhc2tfUmVzb2x2aW5nX0RlcGVuZGVuY2llcyk7Ci0JCXRyeSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIDEsIE1lc3NhZ2VzLkRpcmVjdG9yX1JldmVydF9Qcm9ibGVtcywgbnVsbCk7Ci0KLQkJCWlmICghQm9vbGVhbi52YWx1ZU9mKHByb2ZpbGVTbmFwc2hvdC5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9QUk9GSUxFKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLkRpcmVjdG9yX1VuZXhwZWN0ZWRfSVUsIHByb2ZpbGVTbmFwc2hvdC5nZXRJZCgpKSkpOwotCQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nUGxhbihyZXN1bHQpOwotCQkJfQotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IGdldFByb2ZpbGUocHJvZmlsZVNuYXBzaG90LmdldElkKCkpOwotCQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuRGlyZWN0b3JfVW5leHBlY3RlZF9JVSwgcHJvZmlsZVNuYXBzaG90LmdldElkKCkpKSk7Ci0JCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdQbGFuKHJlc3VsdCk7Ci0JCQl9Ci0KLQkJCS8vVE9ETyBpZiB0aGUgcHJvZmlsZSBjaGFuZ2VzIChsb2NhdGlvbnMgYXJlIGJlaW5nIG1vZGlmaWVkLCBldGMpLCBzaG91bGQgbm90IHdlIGRvIGEgZnVsbCB1bmluc3RhbGwgdGhlbiBhbiBpbnN0YWxsPwotCQkJLy9NYXliZSBpdCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIGNoYW5nZXMgaW4gYSBwcm9maWxlCi0JCQkvL1dlIG5lZWQgdG8gZ2V0IGFsbCB0aGUgaXVzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBwcm9maWxlIGFuZCBnaXZlIHRoYXQgdG8gYmUgd2hhdCB0byBiZWNvbWUKLQotCQkJRGljdGlvbmFyeSBzbmFwc2hvdFNlbGVjdGlvbkNvbnRleHQgPSBjcmVhdGVTZWxlY3Rpb25Db250ZXh0KGdldFNuYXBzaG90UHJvcGVydGllcyhwcm9maWxlU25hcHNob3QpKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBhdmFpbGFibGVJVXMgPSBnYXRoZXJBdmFpbGFibGVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3Byb2ZpbGVTbmFwc2hvdH0sIGNvbnRleHQuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSwgY29udGV4dCwgc3ViLm5ld0NoaWxkKEV4cGFuZFdvcmsgLyAyKSk7Ci0JCQlOZXdEZXBlbmRlbmN5RXhwYW5kZXIgdG9FeHBhbmRlciA9IG5ldyBOZXdEZXBlbmRlbmN5RXhwYW5kZXIobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cHJvZmlsZVNuYXBzaG90fSwgbnVsbCwgYXZhaWxhYmxlSVVzLCBzbmFwc2hvdFNlbGVjdGlvbkNvbnRleHQsIHRydWUpOwotCQkJdG9FeHBhbmRlci5leHBhbmQoc3ViLm5ld0NoaWxkKEV4cGFuZFdvcmsgLyAyKSk7Ci0JCQlSZXNvbHV0aW9uSGVscGVyIG5ld1N0YXRlSGVscGVyID0gbmV3IFJlc29sdXRpb25IZWxwZXIoc25hcHNob3RTZWxlY3Rpb25Db250ZXh0LCB0b0V4cGFuZGVyLmdldFJlY29tbWVuZGF0aW9ucygpKTsKLQkJCUNvbGxlY3Rpb24gbmV3U3RhdGUgPSBuZXdTdGF0ZUhlbHBlci5hdHRhY2hDVXModG9FeHBhbmRlci5nZXRBbGxJbnN0YWxsYWJsZVVuaXRzKCkpOwotCQkJbmV3U3RhdGUucmVtb3ZlKHByb2ZpbGVTbmFwc2hvdCk7Ci0KLQkJCUNvbGxlY3Rpb24gb2xkSVVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJb2xkSVVzLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCi0JCQlEaWN0aW9uYXJ5IG9sZFNlbGVjdGlvbkNvbnRleHQgPSBjcmVhdGVTZWxlY3Rpb25Db250ZXh0KHByb2ZpbGUuZ2V0UHJvcGVydGllcygpKTsKLQkJCVJlc29sdXRpb25IZWxwZXIgb2xkU3RhdGVIZWxwZXIgPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihvbGRTZWxlY3Rpb25Db250ZXh0LCBudWxsKTsKLQkJCUNvbGxlY3Rpb24gb2xkU3RhdGUgPSBvbGRTdGF0ZUhlbHBlci5hdHRhY2hDVXMob2xkSVVzKTsKLQkJCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0ID0gZ2VuZXJhdGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUsIHByb2ZpbGVTbmFwc2hvdCwgbmV3U3RhdGUpOwotCQkJcmV0dXJuIGdlbmVyYXRlUHJvdmlzaW9uaW5nUGxhbihudWxsLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG9sZFN0YXRlSGVscGVyLmdldFNvcnRlZCgpLCBuZXdTdGF0ZUhlbHBlci5nZXRTb3J0ZWQoKSwgcHJvZmlsZUNoYW5nZVJlcXVlc3QpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRGljdGlvbmFyeSBjcmVhdGVTZWxlY3Rpb25Db250ZXh0KE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCUhhc2h0YWJsZSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKHByb3BlcnRpZXMpOwotCQlTdHJpbmcgZW52aXJvbm1lbnRzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQlpZiAoZW52aXJvbm1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVudmlyb25tZW50cywgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpOykgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW50cnkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpbnQgaSA9IGVudHJ5LmluZGV4T2YoJz0nKTsKLQkJCVN0cmluZyBrZXkgPSBlbnRyeS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpOwotCQkJU3RyaW5nIHZhbHVlID0gZW50cnkuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7Ci0JCQlyZXN1bHQucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0U25hcHNob3RQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgcHJvZmlsZVNuYXBzaG90KSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvZmlsZVNuYXBzaG90LmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfUFJPRklMRS5lcXVhbHMoa2V5KSB8fCBrZXkuc3RhcnRzV2l0aChGb3JtZXJTdGF0ZS5JVVBST1BfUFJFRklYKSkKLQkJCQljb250aW51ZTsKLQotCQkJcmVzdWx0LnB1dChrZXksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETyBub3RlIHRoYXQgdGhpcyBvbmx5IGRlc2NyaWJlcyBwcm9wZXJ0eSBjaGFuZ2VzLCBub3QgdGhlIElVIGNoYW5nZXMuCi0JcHJpdmF0ZSBQcm9maWxlQ2hhbmdlUmVxdWVzdCBnZW5lcmF0ZUNoYW5nZVJlcXVlc3QoSVByb2ZpbGUgcHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdCBpdURlc2NyaWJpbmdOZXdTdGF0ZSwgQ29sbGVjdGlvbiBuZXdJVXMpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gaXVEZXNjcmliaW5nTmV3U3RhdGUuZ2V0UHJvcGVydGllcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9maWxlUHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCS8vIGlnbm9yZSB0aGUgcHJvcGVydHkgdGhhdCBjb25maXJtcyB0aGlzIElVIGlzIGEgcHJvZmlsZSBzbmFwc2hvdAotCQkJaWYgKElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX1BST0ZJTEUuZXF1YWxzKGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoa2V5LnN0YXJ0c1dpdGgoRm9ybWVyU3RhdGUuSVVQUk9QX1BSRUZJWCkpIHsKLQkJCQlpbnQgcG9zdElEID0ga2V5LmluZGV4T2YoRm9ybWVyU3RhdGUuSVVQUk9QX1BPU1RGSVgsIEZvcm1lclN0YXRlLklVUFJPUF9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCVN0cmluZyBpZCA9IGtleS5zdWJzdHJpbmcoRm9ybWVyU3RhdGUuSVVQUk9QX1BSRUZJWC5sZW5ndGgoKSwgcG9zdElEKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl1SXRlciA9IG5ld0lVcy5pdGVyYXRvcigpOyBpdUl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl1SXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpZC5lcXVhbHMoaXUuZ2V0SWQoKSkpIHsKLQkJCQkJCVN0cmluZyBpdVByb3BLZXkgPSBrZXkuc3Vic3RyaW5nKHBvc3RJRCArIEZvcm1lclN0YXRlLklVUFJPUF9QT1NURklYLmxlbmd0aCgpKTsKLQkJCQkJCXJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1LCBpdVByb3BLZXksIHByb2ZpbGVQcm9wZXJ0aWVzLmdldChrZXkpKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXF1ZXN0LnNldFByb2ZpbGVQcm9wZXJ0eShrZXksIHByb2ZpbGVQcm9wZXJ0aWVzLmdldChrZXkpKTsKLQkJCX0KLQkJfQotCQkvLyBOb3cgcHJvY2VzcyByZW1vdmFscywgYnV0IGRvbid0IGluY2x1ZGUgdGhvc2UgdGhhdCBzaW1wbHkgY2hhbmdlZCBvciB3ZXJlIG90aGVyd2lzZSByZXNldCBhYm92ZS4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvZmlsZS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXJlcXVlc3QuZ2V0UHJvcGVydGllc1RvQWRkKCkuY29udGFpbnNLZXkoa2V5KSkKLQkJCQlyZXF1ZXN0LnJlbW92ZVByb2ZpbGVQcm9wZXJ0eShrZXkpOwotCQl9Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIHdlIGFkZGVkIHNvIHRob3NlIGNhbiBiZSBleGNsdWRlZAotCQkJSXRlcmF0b3IgaXVJdGVyID0gcmVxdWVzdC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydGllc1RvQWRkKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCUhhc2hNYXAgYWRkZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdoaWxlIChpdUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdUl0ZXIubmV4dCgpOwotCQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdXNbaV0uZ2V0SWQoKSkpIHsKLQkJCQkJYWRkZWRQcm9wZXJ0aWVzID0gKEhhc2hNYXApIHJlcXVlc3QuZ2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnRpZXNUb0FkZCgpLmdldChpdSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1c1tpXSkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghYWRkZWRQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1c1tpXSwga2V5KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBJSW5zdGFsbGFibGVVbml0W10gZ2F0aGVyQXZhaWxhYmxlSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gYWRkaXRpb25hbFNvdXJjZSwgVVJMW10gcmVwb3NpdG9yaWVzLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNYXAgcmVzdWx0c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChhZGRpdGlvbmFsU291cmNlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNvdXJjZS5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBrZXkgPSBhZGRpdGlvbmFsU291cmNlW2ldLmdldElkKCkgKyAiXyIgKyBhZGRpdGlvbmFsU291cmNlW2ldLmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0c01hcC5wdXQoa2V5LCBhZGRpdGlvbmFsU291cmNlW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldEV4dHJhSVVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gaXUuZ2V0SWQoKSArICdfJyArIGl1LmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCXJlc3VsdHNNYXAucHV0KGtleSwgaXUpOwotCQkJfQotCQl9Ci0KLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0KLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgcmVwb3NpdG9yaWVzLmxlbmd0aCAqIDIwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHJlcG9NZ3IubG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLCBzdWIubmV3Q2hpbGQoMTAwKSk7Ci0JCQkJQ29sbGVjdG9yIG1hdGNoZXMgPSByZXBvc2l0b3J5LnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShudWxsLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQkJCVN0cmluZyBrZXkgPSBpdS5nZXRJZCgpICsgIl8iICsgaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50SVUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVzdWx0c01hcC5nZXQoa2V5KTsKLQkJCQkJaWYgKGN1cnJlbnRJVSA9PSBudWxsIHx8IGhhc0hpZ2hlckZpZGVsaXR5KGl1LCBjdXJyZW50SVUpKQotCQkJCQkJcmVzdWx0c01hcC5wdXQoa2V5LCBpdSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NraXAgdW5yZWFkYWJsZSByZXBvc2l0b3JpZXMKLQkJCX0KLQkJfQotCQlzdWIuZG9uZSgpOwotCQlDb2xsZWN0aW9uIHJlc3VsdHMgPSByZXN1bHRzTWFwLnZhbHVlcygpOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0hpZ2hlckZpZGVsaXR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIElJbnN0YWxsYWJsZVVuaXQgY3VycmVudElVKSB7Ci0JCWlmIChCb29sZWFuLnZhbHVlT2YoY3VycmVudElVLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QQVJUSUFMX0lVKSkuYm9vbGVhblZhbHVlKCkgJiYgIUJvb2xlYW4udmFsdWVPZihpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfUEFSVElBTF9JVSkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nUGxhbiBnZXRQcm92aXNpb25pbmdQbGFuKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBFeHBhbmRXb3JrKTsKLQkJc3ViLnNldFRhc2tOYW1lKE1lc3NhZ2VzLkRpcmVjdG9yX1Rhc2tfUmVzb2x2aW5nX0RlcGVuZGVuY2llcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZSgpOwotCi0JCQlJSW5zdGFsbGFibGVVbml0W10gYWxsSVVzID0gdXBkYXRlUGxhbm5lckluZm8ocHJvZmlsZUNoYW5nZVJlcXVlc3QpOwotCi0JCQlVUkxbXSBtZXRhZGF0YVJlcG9zaXRvcmllcyA9IChjb250ZXh0ICE9IG51bGwpID8gY29udGV4dC5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpIDogbnVsbDsKLQkJCURpY3Rpb25hcnkgbmV3U2VsZWN0aW9uQ29udGV4dCA9IGNyZWF0ZVNlbGVjdGlvbkNvbnRleHQocHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZVByb3BlcnRpZXMoKSk7Ci0KLQkJCUxpc3QgZXh0cmFJVXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QocHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0QWRkZWRJbnN0YWxsYWJsZVVuaXRzKCkpKTsKLQkJCWV4dHJhSVVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFJlbW92ZWRJbnN0YWxsYWJsZVVuaXRzKCkpKTsKLQkJCWV4dHJhSVVzLmFkZEFsbChwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRQcm9maWxlKCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQ29sbGVjdGlvbigpKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGF2YWlsYWJsZUlVcyA9IGdhdGhlckF2YWlsYWJsZUluc3RhbGxhYmxlVW5pdHMoKElJbnN0YWxsYWJsZVVuaXRbXSkgZXh0cmFJVXMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtleHRyYUlVcy5zaXplKCldKSwgbWV0YWRhdGFSZXBvc2l0b3JpZXMsIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChFeHBhbmRXb3JrIC8gNCkpOwotCi0JCQlTbGljZXIgc2xpY2VyID0gbmV3IFNsaWNlcihhbGxJVXMsIGF2YWlsYWJsZUlVcywgbmV3U2VsZWN0aW9uQ29udGV4dCk7Ci0JCQlJUXVlcnlhYmxlIHNsaWNlID0gc2xpY2VyLnNsaWNlKGFsbElVcywgbW9uaXRvcik7Ci0JCQlpZiAoc2xpY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ1BsYW4oc2xpY2VyLmdldFN0YXR1cygpKTsKLQkJCVByb2plY3RvciBwcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKHNsaWNlLCBuZXdTZWxlY3Rpb25Db250ZXh0KTsKLQkJCXByb2plY3Rvci5lbmNvZGUoYWxsSVVzLCBzdWIubmV3Q2hpbGQoRXhwYW5kV29yayAvIDQpKTsKLQkJCUlTdGF0dXMgcyA9IHByb2plY3Rvci5pbnZva2VTb2x2ZXIoc3ViLm5ld0NoaWxkKEV4cGFuZFdvcmsgLyA0KSk7Ci0KLQkJCWlmIChzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCS8vbG9nIHRoZSBlcnJvciBmcm9tIHRoZSBuZXcgc29sdmVyIHNvIGl0IGlzIG5vdCBsb3N0Ci0JCQkJTG9nSGVscGVyLmxvZyhzKTsKLQkJCQlpZiAoISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHQgPT0gbnVsbCA/IG51bGwgOiBjb250ZXh0LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpc2FibGUuZXJyb3IucmVwb3J0aW5nIikpKSB7Ci0JCQkJCS8vV2UgaW52b2tlIHRoZSBvbGQgcmVzb2x2ZXIgdG8gZ2V0IGV4cGxhbmF0aW9ucyBmb3Igbm93Ci0JCQkJCUlTdGF0dXMgb2xkUmVzb2x2ZXJTdGF0dXMgPSBuZXcgTmV3RGVwZW5kZW5jeUV4cGFuZGVyKGFsbElVcywgbnVsbCwgYXZhaWxhYmxlSVVzLCBuZXdTZWxlY3Rpb25Db250ZXh0LCBmYWxzZSkuZXhwYW5kKHN1Yi5uZXdDaGlsZChFeHBhbmRXb3JrIC8gNCkpOwotCQkJCQlpZiAoIW9sZFJlc29sdmVyU3RhdHVzLmlzT0soKSkKLQkJCQkJCXMgPSBvbGRSZXNvbHZlclN0YXR1czsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdQbGFuKHMpOwotCQkJfQotCQkJQ29sbGVjdGlvbiBuZXdTdGF0ZSA9IHByb2plY3Rvci5leHRyYWN0U29sdXRpb24oKTsKLQotCQkJUmVzb2x1dGlvbkhlbHBlciBuZXdTdGF0ZUhlbHBlciA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG5ld1NlbGVjdGlvbkNvbnRleHQsIG51bGwpOwotCQkJbmV3U3RhdGUgPSBuZXdTdGF0ZUhlbHBlci5hdHRhY2hDVXMobmV3U3RhdGUpOwotCi0JCQlSZXNvbHV0aW9uSGVscGVyIG9sZFN0YXRlSGVscGVyID0gbmV3IFJlc29sdXRpb25IZWxwZXIoY3JlYXRlU2VsZWN0aW9uQ29udGV4dChwcm9maWxlLmdldFByb3BlcnRpZXMoKSksIG51bGwpOwotCQkJQ29sbGVjdGlvbiBvbGRTdGF0ZSA9IG9sZFN0YXRlSGVscGVyLmF0dGFjaENVcyhwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKSk7Ci0KLQkJCXJldHVybiBnZW5lcmF0ZVByb3Zpc2lvbmluZ1BsYW4ocywgb2xkU3RhdGUsIG5ld1N0YXRlLCBvbGRTdGF0ZUhlbHBlci5nZXRTb3J0ZWQoKSwgbmV3U3RhdGVIZWxwZXIuZ2V0U29ydGVkKCksIHByb2ZpbGVDaGFuZ2VSZXF1ZXN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yi5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvL1RoZSBwbGFubmVyIHVzZXMgaW5zdGFsbGFibGUgdW5pdCBwcm9wZXJ0aWVzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBpdCBoYXMgYmVlbiBhc2tlZCB0byBpbnN0YWxsLiBUaGlzIHVwZGF0ZXMgdGhpcyBpbmZvcm1hdGlvbgotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIHVwZGF0ZVBsYW5uZXJJbmZvKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0KSB7Ci0JCUNvbGxlY3RvciBhbHJlYWR5SW5zdGFsbGVkID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZSgpLnF1ZXJ5KG5ldyBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5KHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb2ZpbGUoKSwgUExBTk5FUl9NQVJLRVIsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhZGRlZCA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpOwotCQlJSW5zdGFsbGFibGVVbml0W10gcmVtb3ZlZCA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFJlbW92ZWRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhbGxJVXMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFthbHJlYWR5SW5zdGFsbGVkLnNpemUoKSArIGFkZGVkLmxlbmd0aCArIHJlbW92ZWQubGVuZ3RoXTsKLQotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxyZWFkeUluc3RhbGxlZC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdS5lcXVhbHMocmVtb3ZlZFtpXSkpIHsKLQkJCQkJcHJvZmlsZUNoYW5nZVJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KHJlbW92ZWRbaV0sIFBMQU5ORVJfTUFSS0VSKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCWFsbElVc1tjb3VudCsrXSA9IGl1OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWQubGVuZ3RoOyBpKyspIHsKLQkJCWFsbElVc1tjb3VudCsrXSA9IGFkZGVkW2ldOwotCQkJcHJvZmlsZUNoYW5nZVJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGFkZGVkW2ldLCBQTEFOTkVSX01BUktFUiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChhbGxJVXMubGVuZ3RoID4gY291bnQpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSByZXN1bHQgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFsbElVcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlhbGxJVXMgPSByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGFsbElVczsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIHVwZGF0ZXNGb3IoSUluc3RhbGxhYmxlVW5pdCB0b1VwZGF0ZSwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTWFwIHJlc3VsdHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NZ3IgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkxbXSByZXBvc2l0b3JpZXMgPSBjb250ZXh0LmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCk7Ci0JCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0KLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgcmVwb3NpdG9yaWVzLmxlbmd0aCAqIDIwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHJlcG9NZ3IubG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLCBzdWIubmV3Q2hpbGQoMTAwKSk7Ci0JCQkJQ29sbGVjdG9yIG1hdGNoZXMgPSByZXBvc2l0b3J5LnF1ZXJ5KG5ldyBVcGRhdGVRdWVyeSh0b1VwZGF0ZSksIG5ldyBDb2xsZWN0b3IoKSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQkJCVN0cmluZyBrZXkgPSBpdS5nZXRJZCgpICsgIl8iICsgaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50SVUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVzdWx0c01hcC5nZXQoa2V5KTsKLQkJCQkJaWYgKGN1cnJlbnRJVSA9PSBudWxsIHx8IGhhc0hpZ2hlckZpZGVsaXR5KGl1LCBjdXJyZW50SVUpKQotCQkJCQkJcmVzdWx0c01hcC5wdXQoa2V5LCBpdSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NraXAgdW5yZWFkYWJsZSByZXBvc2l0b3JpZXMKLQkJCX0KLQkJfQotCQlzdWIuZG9uZSgpOwotCQlDb2xsZWN0aW9uIHJlc3VsdHMgPSByZXN1bHRzTWFwLnZhbHVlcygpOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1NsaWNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1NsaWNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTMxMGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TbGljZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5JUXVlcnlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTbGljZXIgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIElRdWVyeWFibGUgcG9zc2liaWxpdGVzOwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHRvUHJvY2VzczsKLQlwcml2YXRlIFNldCBjb25zaWRlcmVkOyAvL0lVcyB0byBhZGQgdG8gdGhlIHNsaWNlCi0JcHJpdmF0ZSBUd29UaWVyTWFwIHNsaWNlOyAvL1RoZSBJVXMgdGhhdCBoYXZlIGJlZW4gY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBwcm9ibGVtCi0KLQlwcml2YXRlIERpY3Rpb25hcnkgc2VsZWN0aW9uQ29udGV4dDsKLQlwcml2YXRlIE11bHRpU3RhdHVzIHJlc3VsdDsKLQotCXB1YmxpYyBTbGljZXIoSVF1ZXJ5YWJsZSBpbnB1dCwgRGljdGlvbmFyeSBjb250ZXh0KSB7Ci0JCXBvc3NpYmlsaXRlcyA9IGlucHV0OwotCQlzbGljZSA9IG5ldyBUd29UaWVyTWFwKCk7Ci0JCXNlbGVjdGlvbkNvbnRleHQgPSBjb250ZXh0OwotCQlyZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLlBsYW5uZXJfUHJvYmxlbXNfcmVzb2x2aW5nX3BsYW4sIG51bGwpOwotCX0KLQotCXB1YmxpYyBTbGljZXIoSUluc3RhbGxhYmxlVW5pdFtdIGluc3RhbGxSb290cywgSUluc3RhbGxhYmxlVW5pdFtdIGdhdGhlckF2YWlsYWJsZUluc3RhbGxhYmxlVW5pdHMsIERpY3Rpb25hcnkgc2VsZWN0aW9uQ29udGV4dCkgewotCQl0aGlzKG5ldyBRdWVyeWFibGVBcnJheShnYXRoZXJBdmFpbGFibGVJbnN0YWxsYWJsZVVuaXRzKSwgc2VsZWN0aW9uQ29udGV4dCk7Ci0JfQotCi0JcHVibGljIElRdWVyeWFibGUgc2xpY2UoSUluc3RhbGxhYmxlVW5pdFtdIGl1cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlsb25nIHN0YXJ0ID0gMDsKLQkJCWlmIChERUJVRykgewotCQkJCXN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBzbGljaW5nOiAiICsgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXZhbGlkYXRlSW5wdXQoaXVzKTsKLQkJCWNvbnNpZGVyZWQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGl1cykpOwotCQkJdG9Qcm9jZXNzID0gbmV3IExpbmtlZExpc3QoY29uc2lkZXJlZCk7Ci0JCQl3aGlsZSAoIXRvUHJvY2Vzcy5pc0VtcHR5KCkpCi0JCQkJcHJvY2Vzc0lVKChJSW5zdGFsbGFibGVVbml0KSB0b1Byb2Nlc3MucmVtb3ZlRmlyc3QoKSk7Ci0KLQkJCWlmIChERUJVRykgewotCQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2xpY2luZyBjb21wbGV0ZTogIiArIChzdG9wIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJaWYgKHJlc3VsdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBRdWVyeWFibGVBcnJheSgoSUluc3RhbGxhYmxlVW5pdFtdKSBjb25zaWRlcmVkLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbY29uc2lkZXJlZC5zaXplKCldKSk7Ci0JfQotCi0JcHVibGljIE11bHRpU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvL1RoaXMgaXMgYSBzaG9ydGN1dCB0byBzaW1wbGlmeSB0aGUgZXJyb3IgcmVwb3J0aW5nIHdoZW4gdGhlIGZpbHRlciBvZiB0aGUgaXVzIHdlIGFyZSBiZWluZyBhc2tlZCB0byBpbnN0YWxsIGRvZXMgbm90IHBhc3MgCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW5wdXQoSUluc3RhbGxhYmxlVW5pdFtdIGl1cykgewotCQkvL1RPRE8gTmVlZCB0byBzZWUgd2hhdCBpcyBkb25lIGluIHZhbGlkYXRlSW5wdXQgb2YgUEJQcm9qZWN0b3IKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghaXNBcHBsaWNhYmxlKGl1c1tpXSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIElVICIgKyBpdXNbaV0gKyAiIGNhbid0IGJlIGluc3RhbGxlZCBpbiB0aGlzIGVudmlyb25tZW50IGJlY2F1c2UgaXRzIGZpbHRlciBkb2VzIG5vdCBtYXRjaC4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUKLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJU3RyaW5nIGZpbHRlciA9IHJlcS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5jcmVhdGVGaWx0ZXIoZmlsdGVyKS5tYXRjaChzZWxlY3Rpb25Db250ZXh0KTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJU3RyaW5nIGVuYWJsZW1lbnRGaWx0ZXIgPSBpdS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGVuYWJsZW1lbnRGaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJcmV0dXJuIERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuY3JlYXRlRmlsdGVyKGVuYWJsZW1lbnRGaWx0ZXIpLm1hdGNoKHNlbGVjdGlvbkNvbnRleHQpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSVUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlzbGljZS5wdXQoaXUuZ2V0SWQoKSwgaXUuZ2V0VmVyc2lvbigpLCBpdSk7Ci0JCWlmICghaXNBcHBsaWNhYmxlKGl1KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWlmIChyZXFzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWlzQXBwbGljYWJsZShyZXFzW2ldKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFyZXFzW2ldLmlzR3JlZWR5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZXhwYW5kUmVxdWlyZW1lbnQoaXUsIHJlcXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFJlcXVpcmVtZW50KElJbnN0YWxsYWJsZVVuaXQgaXUsIFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJQ29sbGVjdG9yIG1hdGNoZXMgPSBwb3NzaWJpbGl0ZXMucXVlcnkobmV3IENhcGFiaWxpdHlRdWVyeShyZXEpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlpbnQgdmFsaWRNYXRjaGVzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBtYXRjaCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWlzQXBwbGljYWJsZShtYXRjaCkpCi0JCQkJY29udGludWU7Ci0JCQl2YWxpZE1hdGNoZXMrKzsKLQkJCWlmICghc2xpY2UuY29udGFpbnNLZXkobWF0Y2guZ2V0SWQoKSwgbWF0Y2guZ2V0VmVyc2lvbigpKSkKLQkJCQljb25zaWRlcihtYXRjaCk7Ci0JCX0KLQotCQlpZiAodmFsaWRNYXRjaGVzID09IDApIHsKLQkJCWlmIChyZXEuaXNPcHRpb25hbCgpKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIElVIGZvdW5kIHRvIHNhdGlzZnkgb3B0aW9uYWwgZGVwZW5kZW5jeSBvZiAiICsgaXUgKyAiIG9uIHJlcSAiICsgcmVxKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeSwgaXUsIHJlcSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25zaWRlcihJSW5zdGFsbGFibGVVbml0IG1hdGNoKSB7Ci0JCWlmIChjb25zaWRlcmVkLmFkZChtYXRjaCkpCi0JCQl0b1Byb2Nlc3MuYWRkTGFzdChtYXRjaCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1R3b1RpZXJNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9Ud29UaWVyTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDc5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1R3b1RpZXJNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBwcm92aWRlIGEgdHdvLXRpZXIgbWFwLgotICogTWFwT2Yoa2V5MSA9PiBNYXBPZihrZXkyID0+IHZhbHVlKSkuCi0gKiBFdmVuIHRob3VnaCB0aGlzIGNsYXNzIGltcGxlbWVudHMgTWFwIHRoZSBiZWhhdmlvciBvZgotICogdGhlIG1ldGhvZHMgYXJlbid0IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhhdCBvZiBhIHJlYWwKLSAqIE1hcCAtIGVzcGVjaWFsbHksIGVudHJ5U2V0KCksIGtleVNldCgpIGV0Yy4gd29ya3Mgb2ZmCi0gKiB0aGUgb3V0ZXIgbWFwIHdoaWxlIHZhbHVlcygpIHJldHVybnMgYWxsIHRoZSB2YWx1ZXMgb2YKLSAqIGFsbCB0aGUgaW5uZXIgbWFwcy4KLSAqLwotcHVibGljIGNsYXNzIFR3b1RpZXJNYXAgaW1wbGVtZW50cyBNYXAsIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjI0OTc3MjA4NzMxODYyNjVMOwotCi0JcHJpdmF0ZSBNYXAgb3V0ZXJNYXA7Ci0JcHJpdmF0ZSBpbnQgcG9saWN5OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX05PTkUgPSAwLCBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HID0gMSA8PCAwLCBQT0xJQ1lfSU5ORVJfTUFQX1BSRVNFUlZFX0VYSVNUSU5HID0gMSA8PCAxLCBQT0xJQ1lfSU5ORVJfTUFQX1NPUlRFRF9BU0NFTkRJTkcgPSAxIDw8IDIsIFBPTElDWV9JTk5FUl9NQVBfU09SVEVEX0RFU0NFTkRJTkcgPSAxIDw8IDMsIFBPTElDWV9JTk5FUl9NQVBfRU5TVVJFX1NJTkdMRVRPTiA9IDEgPDwgNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfSU5ORVJfTUFQX1NPUlRFRF9NQVNLID0gUE9MSUNZX0lOTkVSX01BUF9TT1JURURfQVNDRU5ESU5HIHwgUE9MSUNZX0lOTkVSX01BUF9TT1JURURfREVTQ0VORElORzsKLQotCXB1YmxpYyBUd29UaWVyTWFwKCkgewotCQl0aGlzKDgsIFBPTElDWV9OT05FKTsKLQl9Ci0KLQlwdWJsaWMgVHdvVGllck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBQT0xJQ1lfTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHR3by10aWVyIG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBpbml0aWFsQ2FwYWNpdHkgYW5kIHBvbGljeS4gVGhlIHBvbGljeSBkZXRlcm1pbmVzCi0JICogd2hldGhlciB0aGUgb3V0ZXIgbWFwIGlzIG9yZGVyZWQsIGlubmVyIG1hcCBpcwotCSAqIHNvcnRlZCwgY2xvYmJlciB2YWx1ZXMgb2YgaW5uZXIgbWFwIGV0Yy4KLQkgKi8KLQlwdWJsaWMgVHdvVGllck1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgcG9saWN5KSB7Ci0JCXRoaXMucG9saWN5ID0gcG9saWN5OwotCQl0aGlzLm91dGVyTWFwID0gc2hvdWxkVXNlT3JkZXJlZE1hcCgpID8gbmV3IExpbmtlZEhhc2hNYXAoaW5pdGlhbENhcGFjaXR5KSA6IG5ldyBIYXNoTWFwKGluaXRpYWxDYXBhY2l0eSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSB2YWx1ZSB3aXRoIGtleSBrZXkxIGludG8gdGhlIGlubmVyIG1hcCAKLQkgKiB0aGF0IGlzIG9idGFpbmVkIGZyb20gdGhlIG91dGVyIG1hcCB3aXRoIGtleSBrZXkyLgotCSAqIElmIHlvdSBoYXZlIHNldCBQT0xJQ1lfSU5ORVJfTUFQX1BSRVNFUlZFX0VYSVNUSU5HCi0JICogYXQgdGhlIHRpbWUgb2YgY3JlYXRpbmcgdGhpcywgaXQgd2lsbCBub3Qgb3ZlcndyaXRlCi0JICogaWYgdGhlcmUgaXMgYWxyZWFkeSBhIG5vbi1udWxsIHZhbHVlIGF0IGtleTIuIAotCSAqIFRoZSBvdGhlciBQT0xJQ1lfSU5ORVJfTUFQXyogcG9saWNpZXMgZGV0ZXJtaW5lIAotCSAqIHdoYXQga2luZCBvZiBpbm5lciBtYXAgaXMgY3JlYXRlZC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHBhcmFtIGtleTIgVGhlIGtleSBmb3IgaW5uZXIgbWFwLgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUuCi0JICogQHJldHVybiBFeGlzdGluZyB2YWx1ZSBpZiBhbnksIG90aGVyd2lzZSBudWxsLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IHZhbHVlKSB7Ci0JCU1hcCBpbm5lck1hcCA9IChNYXApIHRoaXMub3V0ZXJNYXAuZ2V0KGtleTEpOwotCQlpZiAoaW5uZXJNYXAgPT0gbnVsbCkgewotCQkJaWYgKHNob3VsZFVzZVNpbmdsZXRvbklubmVyTWFwKCkpIHsKLQkJCQl0aGlzLm91dGVyTWFwLnB1dChrZXkxLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoa2V5MiwgdmFsdWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlubmVyTWFwID0gY3JlYXRlSW5uZXJNYXAoKTsKLQkJCXRoaXMub3V0ZXJNYXAucHV0KGtleTEsIGlubmVyTWFwKTsKLQkJfQotCQkvLyBJdCBpcyBmYXN0ZXIgdG8gY2hlY2sgZm9yIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgCi0JCS8vIHRoaXMgd2F5IGluc3RlYWQgb2YgY29udGFpbnNLZXkoKSBjaGVjay4gT2YgY291cnNlLAotCQkvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIHJlY29nbml6aW5nIGEgbnVsbCBlbnRyeSwgCi0JCS8vIHdoaWNoIEkgdGhpbmsgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4KLQkJT2JqZWN0IGV4aXN0aW5nID0gaW5uZXJNYXAucHV0KGtleTIsIHZhbHVlKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgc2hvdWxkUHJlc2VydmVFeGlzdGluZygpKSB7Ci0JCQlpbm5lck1hcC5wdXQoa2V5MiwgZXhpc3RpbmcpOwotCQl9Ci0JCXJldHVybiBleGlzdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIGlubmVyIG1hcCB1c2luZyBrZXkyCi0JICogYXMga2V5IHdoZXJlIHRoZSBpbm5lciBtYXAgaXMgb2J0YWluZWQgZnJvbSB0aGUgCi0JICogb3V0ZXIgbWFwIHVzaW5nIGtleTEuCi0JICogQHBhcmFtIGtleTEgVGhlIGtleSBmb3Igb3V0ZXIgbWFwLgotCSAqIEBwYXJhbSBrZXkyIFRoZSBrZXkgZm9yIGlubmVyIG1hcC4KLQkgKiBAcmV0dXJuIFRoZSBvYmplY3QgZm9yIGtleTIgaW4gaW5uZXIgbWFwIGZvciBrZXkxIAotCSAqIGluIHRoZSBvdXRlciBtYXAuIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotCQlpZiAoa2V5MSA9PSBudWxsIHx8IGtleTIgPT0gbnVsbCkKLQkJCXJldHVybiBnZXRBbGwoa2V5MSk7Ci0JCU1hcCBpbm5lck1hcCA9IChNYXApIHRoaXMub3V0ZXJNYXAuZ2V0KGtleTEpOwotCQlPYmplY3QgdmFsdWUgPSBpbm5lck1hcCA9PSBudWxsID8gbnVsbCA6IGlubmVyTWFwLmdldChrZXkyKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaW5uZXIgbWFwIGZvciBrZXkxIGluCi0JICogdGhlIG91dGVyIG1hcC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIHZhbHVlcyBpbiB0aGUgaW5uZXIgbWFwLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbChPYmplY3Qga2V5MSkgewotCQlpZiAoa2V5MSA9PSBudWxsKQotCQkJLy8gcmV0dXJuIGFsbAotCQkJcmV0dXJuIHZhbHVlcygpOwotCQlNYXAgaW5uZXJNYXAgPSAoTWFwKSB0aGlzLm91dGVyTWFwLmdldChrZXkxKTsKLQkJcmV0dXJuIGlubmVyTWFwID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihpbm5lck1hcC52YWx1ZXMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLQkJaWYgKGtleTEgPT0gbnVsbCB8fCBrZXkyID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlQWxsKGtleTEpOwotCQlNYXAgaW5uZXJNYXAgPSAoTWFwKSB0aGlzLm91dGVyTWFwLmdldChrZXkxKTsKLQkJaWYgKGlubmVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHNob3VsZFVzZVNpbmdsZXRvbklubmVyTWFwKCkpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBpbm5lck1hcC5nZXQoa2V5Mik7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQl0aGlzLm91dGVyTWFwLnJlbW92ZShrZXkxKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJT2JqZWN0IHJlc3VsdCA9IChpbm5lck1hcCA9PSBudWxsKSA/IG51bGwgOiBpbm5lck1hcC5yZW1vdmUoa2V5Mik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBpbm5lck1hcC5pc0VtcHR5KCkpIHsKLQkJCXRoaXMub3V0ZXJNYXAucmVtb3ZlKGtleTEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gcmVtb3ZlQWxsKE9iamVjdCBrZXkxKSB7Ci0JCWlmIChrZXkxID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTWFwIGlubmVyTWFwID0gKE1hcCkgdGhpcy5vdXRlck1hcC5yZW1vdmUoa2V5MSk7Ci0JCXJldHVybiBpbm5lck1hcCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGlubmVyTWFwLnZhbHVlcygpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIHZhbGlkIG9iamVjdCBmb3IKLQkgKiBrZXkyIGluIHRoZSBpbm5lciBtYXAgZm9yIGtleTEgaW4gdGhlIG91dGVyIG1hcC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHBhcmFtIGtleTIgVGhlIGtleSBmb3IgaW5uZXIgbWFwLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5vbi1udWxsIG9iamVjdCBleGlzdHM7IG90aGVyd2lzZQotCSAqIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotCQlpZiAoa2V5MSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoa2V5MiA9PSBudWxsKQotCQkJcmV0dXJuIGNvbnRhaW5zS2V5KGtleTEpOwotCQlyZXR1cm4gZ2V0KGtleTEsIGtleTIpICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMub3V0ZXJNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gdGhpcy5vdXRlck1hcC5jb250YWluc0tleShrZXkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1hcCBpbm5lck1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoaW5uZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjc2l6ZSgpCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5vdXRlck1hcC5zaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCNpc0VtcHR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5zaXplKCkgPT0gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI2VudHJ5U2V0KCkKLQkgKi8KLQlwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHRoaXMub3V0ZXJNYXAuZW50cnlTZXQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCN2YWx1ZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRoaXMub3V0ZXJNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCS8vIEEgbnVsbCBrZXkgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24hCi0JCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkQWxsKGdldEFsbChrZXkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjZ2V0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCQlpZiAoa2V5IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIGtleXMgPSAoT2JqZWN0W10pIGtleTsKLQkJCXJldHVybiBnZXQoa2V5c1swXSwga2V5c1sxXSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGdldEFsbChrZXkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAja2V5U2V0KCkKLQkgKi8KLQlwdWJsaWMgU2V0IGtleVNldCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0aGlzLm91dGVyTWFwLmtleVNldCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoa2V5IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIGtleXMgPSAoT2JqZWN0W10pIGtleTsKLQkJCXJldHVybiBwdXQoa2V5c1swXSwga2V5c1sxXSwgdmFsdWUpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpcnN0IGFyZyBzaG91bGQgYmUgYW4gYXJyYXkhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJaWYgKGtleSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlPYmplY3RbXSBrZXlzID0gKE9iamVjdFtdKSBrZXk7Ci0JCQlyZXR1cm4gcmVtb3ZlKGtleXNbMF0sIGtleXNbMV0pOwotCQl9IGVsc2UKLQkJCXJldHVybiByZW1vdmVBbGwoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLm91dGVyTWFwLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCIgIChFbXB0eSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHRoaXMub3V0ZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCXNiLmFwcGVuZCgiICAiKS5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIiA9ICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOwotCQkJfQotCQkJc2Iuc2V0TGVuZ3RoKHNiLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZHVtcChQcmludFN0cmVhbSBwcykgewotCQlpZiAocHMgPT0gbnVsbCkgewotCQkJcHMgPSBTeXN0ZW0ub3V0OwotCQl9Ci0JCXBzLnByaW50bG4odGhpcy50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBjcmVhdGVJbm5lck1hcCgpIHsKLQkJTWFwIGlubmVyTWFwOwotCQlpZiAoc2hvdWxkVXNlU29ydGVkSW5uZXJNYXAoKSkgewotCQkJaW5uZXJNYXAgPSBuZXcgVHJlZU1hcChuZXcgVmFsdWVDb21wYXJhdG9yKHNob3VsZFNvcnRJbkFzY2VuZGluZ09yZGVyKCkpKTsKLQkJfSBlbHNlIGlmIChzaG91bGRVc2VPcmRlcmVkTWFwKCkpIHsKLQkJCWlubmVyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMik7Ci0JCX0gZWxzZSB7Ci0JCQlpbm5lck1hcCA9IG5ldyBIYXNoTWFwKDIpOwotCQl9Ci0JCXJldHVybiBpbm5lck1hcDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUHJlc2VydmVFeGlzdGluZygpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfUFJFU0VSVkVfRVhJU1RJTkcpID09IFBPTElDWV9JTk5FUl9NQVBfUFJFU0VSVkVfRVhJU1RJTkc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFVzZU9yZGVyZWRNYXAoKSB7Ci0JCXJldHVybiAodGhpcy5wb2xpY3kgJiBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HKSA9PSBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRVc2VTb3J0ZWRJbm5lck1hcCgpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfU09SVEVEX01BU0spICE9IDA7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFNvcnRJbkFzY2VuZGluZ09yZGVyKCkgewotCQlyZXR1cm4gKHRoaXMucG9saWN5ICYgUE9MSUNZX0lOTkVSX01BUF9TT1JURURfTUFTSykgPT0gUE9MSUNZX0lOTkVSX01BUF9TT1JURURfQVNDRU5ESU5HOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRVc2VTaW5nbGV0b25Jbm5lck1hcCgpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfRU5TVVJFX1NJTkdMRVRPTikgPT0gUE9MSUNZX0lOTkVSX01BUF9FTlNVUkVfU0lOR0xFVE9OOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MjQ5NzcyMDg3MzE4NjI2Nkw7Ci0JCXByaXZhdGUgYm9vbGVhbiBhc2NlbmRpbmc7Ci0KLQkJcHVibGljIFZhbHVlQ29tcGFyYXRvcihib29sZWFuIGFzY2VuZGluZykgewotCQkJdGhpcy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQl0cnkgewotCQkJCWlmIChvMSBpbnN0YW5jZW9mIENvbXBhcmFibGUpIHsKLQkJCQkJaW50IGNtcCA9ICgoQ29tcGFyYWJsZSkgbzEpLmNvbXBhcmVUbyhvMik7Ci0JCQkJCXJldHVybiB0aGlzLmFzY2VuZGluZyA/IGNtcCA6ICgwIC0gY21wKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjVkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLURpcmVjdG9yX1VuaW5zdGFsbF9Qcm9ibGVtcz1Qcm9ibGVtcyBvY2N1cnJlZCB3aGlsZSB1bmluc3RhbGxpbmcuCi1EaXJlY3Rvcl9JbnN0YWxsX1Byb2JsZW1zPVByb2JsZW1zIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcuCi1EaXJlY3Rvcl9DYW5ub3RfVW5pbnN0YWxsPUNhbiBub3QgdW5pbnN0YWxsIHswfSBiZWNhdXNlIG90aGVycyBJVXMgZGVwZW5kIG9uIGl0LiAKLURpcmVjdG9yX05vdGhpbmdfVG9fVW5pbnN0YWxsPU5vdGhpbmcgdG8gdW5pbnN0YWxsLgotRGlyZWN0b3JfQWxyZWFkeV9JbnN0YWxsZWQ9ezB9IGlzIGFscmVhZHkgaW5zdGFsbGVkLgotRGlyZWN0b3JfUmV2ZXJ0X1Byb2JsZW1zPVByb2JsZW1zIG9jY3VycmVkIHdoaWxlIHJldmVydGluZyB0aGUgaW5zdGFsbC4KLURpcmVjdG9yX1VuZXhwZWN0ZWRfSVU9VGhlIGluc3RhbGxhYmxlIHVuaXQgezB9IGNhbiBub3QgYmUgdXNlZCBoZXJlLiAKLURpcmVjdG9yX1Rhc2tfSW5zdGFsbGluZz1JbnN0YWxsaW5nIGludG8gezB9Ci1EaXJlY3Rvcl9UYXNrX1VuaW5zdGFsbGluZz1Vbmluc3RhbGxpbmcKLURpcmVjdG9yX1Rhc2tfVXBkYXRpbmc9VXBkYXRpbmcKLURpcmVjdG9yX1Rhc2tfUmVzb2x2aW5nX0RlcGVuZGVuY2llcz1SZXNvbHZpbmcgZGVwZW5kZW5jaWVzCi0KLURpcmVjdG9yX1Vuc2F0aXNmaWVkX0RlcGVuZGVuY2llcz1cCi0gIENhbm5vdCBjb21wbGV0ZSB0aGUgaW5zdGFsbCBiZWNhdXNlIHNvbWUgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc2F0aXNmaWFibGUKLURpcmVjdG9yX1Vuc2F0aXNmaWVkX0RlcGVuZGVuY3k9XAotICBVbnNhdGlzZmllZCBkZXBlbmRlbmN5OiB7MH0KLVBsYW5uZXJfRXJyb3Jfc2F2aW5nX29wYmZpbGU9RXhjZXB0aW9uIHdyaXRpbmcgcHJvYmxlbSBmaWxlIGluOiB7MH0uIAotUGxhbm5lcl9Gb3JtYXRfZXJyb3I9Rm9ybWF0IGVycm9yIGluIGZpbGU6IHswfS4gCi1QbGFubmVyX01pc3Npbmdfb3BiX2ZpbGU9TWlzc2luZyBmaWxlOiB7MH0uCi1QbGFubmVyX1RpbWVvdXQ9VGhlIHNvbHZlciB0aW1lZCBvdXQgb24gcHJvYmxlbSB7MH0uCi1QbGFubmVyX1Byb2JsZW1zX3Jlc29sdmluZ19wbGFuPVByb2JsZW1zIHJlc29sdmluZyBwcm92aXNpb25pbmcgcGxhbi4KLVBsYW5uZXJfVHJpdmlhbF9leGNlcHRpb249Tm8gc29sdXRpb24gZm91bmQgYmVjYXVzZSBvZiBhIHRyaXZpYWwgY29udHJhZGljdGlvbiBpbiB7MH0uCi1QbGFubmVyX1Vuc2F0aXNmaWFibGVfcHJvYmxlbT1ObyBzb2x1dGlvbiBmb3VuZCBiZWNhdXNlIHRoZSBwcm9ibGVtIGluIHswfSBpcyB1bnNhdGlzZmlhYmxlLiAKLVBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeT1ObyBJVSBmb3VuZCB0byBzYXRpc2Z5IGRlcGVuZGVuY3kgZnJvbSB7MH0gdG8gezF9LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vUmVzb2x1dGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vUmVzb2x1dGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMyMjIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1Jlc29sdXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5EaXJlY3RvckFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLlJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHV0aW9uSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBOT19GUkFHTUVOVFMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50WzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKLQlwcml2YXRlIFN0YXRlIHN0YXRlOwotCXByaXZhdGUgRGljdGlvbmFyeSBzZWxlY3Rpb25Db250ZXh0OwotCXByaXZhdGUgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHJlY29tbWVuZGF0aW9uczsKLQkvKioKLQkgKiBNYXAgb2YgSUluc3RhbGxhYmxlVW5pdC0+KElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgcmVwcmVzZW50aW5nIHRoZSAKLQkgKiBtYXBwaW5nIG9mIElVcyB0byB0aGUgZnJhZ21lbnQgdGhleSBhcmUgYm91bmQgdG8uCi0JICovCi0JcHJpdmF0ZSBNYXAgZnJhZ21lbnRCaW5kaW5nczsKLQotCXB1YmxpYyBSZXNvbHV0aW9uSGVscGVyKERpY3Rpb25hcnkgc2VsZWN0aW9uQ29udGV4dCwgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHJlY29tbWVuZGF0aW9ucykgewotCQl0aGlzLnNlbGVjdGlvbkNvbnRleHQgPSBzZWxlY3Rpb25Db250ZXh0OwotCQl0aGlzLnJlY29tbWVuZGF0aW9ucyA9IHJlY29tbWVuZGF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVBsYXRmb3JtQWRtaW4gcGEgPSAoUGxhdGZvcm1BZG1pbikgRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHNyKTsKLQkJdHJhbnNmb3JtZXIgPSBuZXcgVHJhbnNmb3JtZXIocGEuZ2V0RmFjdG9yeSgpLCBzZWxlY3Rpb25Db250ZXh0LCByZWNvbW1lbmRhdGlvbnMpOwotCQlzdGF0ZSA9IHBhLmdldEZhY3RvcnkoKS5jcmVhdGVTdGF0ZSh0cnVlKTsKLQkJZnJhZ21lbnRCaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChzZWxlY3Rpb25Db250ZXh0ICE9IG51bGwpCi0JCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMoc2VsZWN0aW9uQ29udGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvU3RhdGUoQnVuZGxlRGVzY3JpcHRpb24gYmQpIHsKLQkJc3RhdGUuYWRkQnVuZGxlKGJkKTsKLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZURlc2NyaXB0aW9uIGFkZEluUmVzb2x1dGlvbihJSW5zdGFsbGFibGVVbml0IHRvQWRkKSB7Ci0JCXRyYW5zZm9ybWVyLnZpc2l0SW5zdGFsbGFibGVVbml0KHRvQWRkKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRpb25Ub0FkZCA9IHRyYW5zZm9ybWVyLmdldFJlc3VsdCgpOwotCQkvLwkJYnVuZGxlRGVzY3JpcHRpb25Ub0lVLnB1dChkZXNjcmlwdGlvblRvQWRkLCB0b0FkZCk7Ci0JCWFkZFRvU3RhdGUoZGVzY3JpcHRpb25Ub0FkZCk7Ci0JCXJldHVybiBkZXNjcmlwdGlvblRvQWRkOwotCX0KLQotCS8qKiAKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGluc3RhbGxhYmxlIHVuaXQgdG8gaW5zdGFsbCB3aWxsIGhhdmUgYWxsIHRoZWlyIGNvbnN0cmFpbnRzIHNhdGlzZmllZCB3aGVuIGluc3RhbGxlZCB3aXRoIG90aGVyIGluc3RhbGxhYmxlIHVuaXRzLgotCSAqIEBwYXJhbSB0b0luc3RhbGwgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRvIGluc3RhbGwKLQkgKiBAcGFyYW0gZXhpc3RpbmdTdGF0ZSB0aGUgb3RoZXIgaW5zdGFsbGFibGUgdW5pdHMgdG8gcmVzb2x2ZSBhZ2FpbnN0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnN0YWxsYWJsZSB1bml0IHRvIGluc3RhbGwgcmVzb2x2ZXMsIHJldHVybiBmYWxzZSBvdGhlcndpc2UuIAotCSAqLwotCXB1YmxpYyBVbnNhdGlzZmllZENhcGFiaWxpdHlbXSBpbnN0YWxsKFNldCB0b0luc3RhbGwsIFNldCBleGlzdGluZ1N0YXRlKSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhZGRlZEJ1bmRsZSA9IG5ldyBCdW5kbGVEZXNjcmlwdGlvblt0b0luc3RhbGwuc2l6ZSgpXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9JbnN0YWxsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWFkZGVkQnVuZGxlW2orK10gPSBhZGRJblJlc29sdXRpb24oKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhpc3RpbmdTdGF0ZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGRJblJlc29sdXRpb24oKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQotCQlzdGF0ZS5yZXNvbHZlKCk7IC8vV2UgbWF5IHdhbnQgdG8gcmVzb2x2ZSBpbiB0d28gdGltZXMuIGZpcnN0IHRoZSBleGlzdGluZyBzdGF0ZSwgdGhlbiBhZGQgdGhlIHRvSW5zdGFsbC4gVGhpcyB3b3VsZCBhbGxvdyB0byBzZWUgd2hhdCBjaGFuZ2VzIHdoZW4gZHJvcHBpbmcgdGhlIG5ldyBpdS4KLQkJLy9BbHNvIGl0IGNvdWxkIGFsbG93IHVzIHRvIGRvIGFuIGluY3JlbWVudGFsIHJlc29sdXRpb24uIGhvd2V2ZXIgdGhlIHJlc3VsdHMgbWF5IGRpZmZlcgotCi0JCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkQnVuZGxlLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRzLmFkZEFsbChjcmVhdGVVbnNhdGlzZmllZENhcGFiaWxpdGllcyhzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoYWRkZWRCdW5kbGVbaV0pLCBhZGRlZEJ1bmRsZVtpXSkpOwotCQl9Ci0JCXJldHVybiAoVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10pIHJlc3VsdHMudG9BcnJheShuZXcgVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0KLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjcmVhdGVVbnNhdGlzZmllZENhcGFiaWxpdGllcyhWZXJzaW9uQ29uc3RyYWludFtdIHVuc2F0aXNmaWVkLCBCdW5kbGVEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnNhdGlzZmllZC5sZW5ndGg7IGkrKykgewotCQkJUmVxdWlyZWRDYXBhYmlsaXR5IG9yaWdpbmFsRGVwZW5kZW5jeSA9IChSZXF1aXJlZENhcGFiaWxpdHkpICgoU3RhdGVNZXRhZGF0YU1hcCkgZGVzY3JpcHRpb24uZ2V0VXNlck9iamVjdCgpKS5nZXRHZW5lcmljU3BlY2lmaWNhdGlvbnMoKS5nZXQodW5zYXRpc2ZpZWRbaV0pOwotCQkJcmVzdWx0cy5hZGQobmV3IFVuc2F0aXNmaWVkQ2FwYWJpbGl0eShvcmlnaW5hbERlcGVuZGVuY3ksICgoU3RhdGVNZXRhZGF0YU1hcCkgZGVzY3JpcHRpb24uZ2V0VXNlck9iamVjdCgpKS5nZXRVbml0KCkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGVzIGluc3RhbGxhYmxlIHVuaXQgZnJhZ21lbnRzIHRvIGVhY2ggSVUgYmVpbmcgaW5zdGFsbGVkLgotCSAqIAotCSAqIFRPRE86IFRoaXMgbWV0aG9kIHNob3VsZCBwcm9iYWJseSBiZSByZW5hbWVkIHRvIGF0dGFjaEZyYWdtZW50cwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGF0dGFjaENVcyhDb2xsZWN0aW9uIHRvQXR0YWNoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRvQXR0YWNoLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWFkZEluUmVzb2x1dGlvbigoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYmRzID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJUmVzb2x2ZXJFcnJvcltdIHJlID0gc3RhdGUuZ2V0UmVzb2x2ZXJFcnJvcnMoYmRzW2ldKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZVtqXSk7Ci0JCQkJfQotCQkJfQotCQkJQnVuZGxlRGVzY3JpcHRpb25bXSBwb3RlbnRpYWxJVUZyYWdtZW50cyA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0RGVwZW5kZW50QnVuZGxlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YmRzW2ldfSk7Ci0JCQkvLyBUT0RPOiBXZSBuZWVkIHRvIGRlZmluZSBhIHdheSB0byBhbGxvdyBJVUZyYWdtZW50cyB0byB3b3JrIHRvZ2V0aGVyIHRvIGRvIGNvbmZpZ3VyYXRpb24gd29yay4KLQkJCS8vIEZvciBub3cgd2Ugd2lsbCBzZWxlY3QganVzdCBvbmUgZnJhZ21lbnQgYnkgcHJlZmVycmluZyBhIGZyYWdtZW50IHRoYXQgbWF0Y2hlcyB0aGUgaG9zdAotCi0JCQlJSW5zdGFsbGFibGVVbml0IGhvc3RJVSA9ICgoU3RhdGVNZXRhZGF0YU1hcCkgYmRzW2ldLmdldFVzZXJPYmplY3QoKSkuZ2V0VW5pdCgpOwotCQkJQXJyYXlMaXN0IGFwcGxpY2FibGVGcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IHBvdGVudGlhbElVRnJhZ21lbnRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBkZXBlbmRlbnRJVSA9ICgoU3RhdGVNZXRhZGF0YU1hcCkgcG90ZW50aWFsSVVGcmFnbWVudHNba10uZ2V0VXNlck9iamVjdCgpKS5nZXRVbml0KCk7Ci0JCQkJaWYgKGhvc3RJVS5lcXVhbHMoZGVwZW5kZW50SVUpIHx8ICFkZXBlbmRlbnRJVS5pc0ZyYWdtZW50KCkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHBvdGVudGlhbEZyYWdtZW50ID0gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgZGVwZW5kZW50SVU7Ci0KLQkJCQkvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGhvc3QgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgZnJhZ21lbnQKLQkJCQlSZXF1aXJlZENhcGFiaWxpdHkgcmVxc0Zyb21GcmFnbWVudFtdID0gcG90ZW50aWFsRnJhZ21lbnQuZ2V0SG9zdCgpOwotCQkJCVByb3ZpZGVkQ2FwYWJpbGl0eSBob3N0Q2FwYWJpbGl0aWVzW10gPSBob3N0SVUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJCQlib29sZWFuIG1hdGNoID0gdHJ1ZTsKLQkJCQlib29sZWFuIHJlcXVpcmVtZW50TWF0Y2hlZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgcmVxc0Zyb21GcmFnbWVudC5sZW5ndGggJiYgbWF0Y2ggPT0gdHJ1ZTsgbCsrKSB7Ci0JCQkJCXJlcXVpcmVtZW50TWF0Y2hlZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IGhvc3RDYXBhYmlsaXRpZXMubGVuZ3RoOyBtKyspIHsKLQkJCQkJCWlmIChob3N0Q2FwYWJpbGl0aWVzW21dLmlzU2F0aXNmaWVkQnkocmVxc0Zyb21GcmFnbWVudFtsXSkpIHsKLQkJCQkJCQlyZXF1aXJlbWVudE1hdGNoZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZXF1aXJlbWVudE1hdGNoZWQgPT0gZmFsc2UpIHsKLQkJCQkJCW1hdGNoID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJfQotCQkJCWlmIChtYXRjaCkgewotCQkJCQlhcHBsaWNhYmxlRnJhZ21lbnRzLmFkZChwb3RlbnRpYWxGcmFnbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgdGhlRnJhZ21lbnQgPSBudWxsOwotCQkJaW50IHNwZWNpZmljaXR5TGV2ZWwgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFwcGxpY2FibGVGcmFnbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBmcmFnbWVudCA9IChJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZnJhZ21lbnQuZ2V0SG9zdCgpLmxlbmd0aCA+IHNwZWNpZmljaXR5TGV2ZWwpIHsKLQkJCQkJdGhlRnJhZ21lbnQgPSBmcmFnbWVudDsKLQkJCQkJc3BlY2lmaWNpdHlMZXZlbCA9IGZyYWdtZW50LmdldEhvc3QoKS5sZW5ndGg7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRoZUZyYWdtZW50ICE9IG51bGwpCi0JCQkJZnJhZ21lbnRCaW5kaW5ncy5wdXQoaG9zdElVLCB0aGVGcmFnbWVudCk7Ci0JCX0KLQkJLy9idWlsZCB0aGUgY29sbGVjdGlvbiBvZiByZXNvbHZlZCBJVXMKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgSGFzaFNldCh0b0F0dGFjaC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9BdHRhY2guaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvL2p1c3QgcmV0dXJuIGZyYWdtZW50cyBhcyB0aGV5IGFyZQotCQkJaWYgKGl1LmlzRnJhZ21lbnQoKSkgewotCQkJCXJlc3VsdC5hZGQoaXUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy9yZXR1cm4gYSBuZXcgSVUgdGhhdCBjb21iaW5lcyB0aGUgSVUgd2l0aCBpdHMgYm91bmQgZnJhZ21lbnRzCi0JCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgZnJhZ21lbnQgPSAoSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBmcmFnbWVudEJpbmRpbmdzLmdldChpdSk7Ci0JCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBmcmFnbWVudHM7Ci0JCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkKLQkJCQlmcmFnbWVudHMgPSBOT19GUkFHTUVOVFM7Ci0JCQllbHNlCi0JCQkJZnJhZ21lbnRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIHtmcmFnbWVudH07Ci0JCQlyZXN1bHQuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChpdSwgZnJhZ21lbnRzKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuIHN0YXRlLmdldEJ1bmRsZShpdS5nZXRJZCgpLCBpdS5nZXRWZXJzaW9uKCkpLmlzUmVzb2x2ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldEFsbFJlc29sdmVkKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJkID0gc3RhdGUuZ2V0UmVzb2x2ZWRCdW5kbGVzKCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGJkLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmQubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGQoZXh0cmFjdElVKGJkW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZXh0cmFjdElVKEJ1bmRsZURlc2NyaXB0aW9uIGJkKSB7Ci0JCXJldHVybiAoKFN0YXRlTWV0YWRhdGFNYXApIGJkLmdldFVzZXJPYmplY3QoKSkuZ2V0VW5pdCgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFNvcnRlZCgpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSB0b1NvcnQgPSBzdGF0ZS5nZXRSZXNvbHZlZEJ1bmRsZXMoKTsKLQkJc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5zb3J0QnVuZGxlcyh0b1NvcnQpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QodG9Tb3J0Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Tb3J0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkKGV4dHJhY3RJVSh0b1NvcnRbaV0pKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1N0YXRlTWV0YWRhdGFNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1N0YXRlTWV0YWRhdGFNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyOTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9TdGF0ZU1ldGFkYXRhTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLS8vSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHN0b3JlZCBpbiB0aGUgdXNlciBvYmplY3Qgc2xvdCBvZiBidW5kbGVzY3JpcHRpb25zIHRvIGVhc2UgbmF2aWdhdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kZWxzLgotcHVibGljIGNsYXNzIFN0YXRlTWV0YWRhdGFNYXAgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCB1bml0OwotCXByaXZhdGUgTWFwIGNvcnJlc3BvbmRpbmdTcGVjaWZpY2F0aW9uczsgLy9pbmRleGVzIGluIHRoaXMgYXJyYXkgbWFwcyB0byB0aGUgb25lcyBpbiB0aGUgZGVwZW5kZW5jaWVzIGFycmF5LiBUaGlzIGlzIGdyb3NzLiBUT0RPCi0KLQlwdWJsaWMgU3RhdGVNZXRhZGF0YU1hcChJSW5zdGFsbGFibGVVbml0IHVuaXQsIE1hcCBjb3JyZXNwb25kaW5nU3BlY2lmaWNhdGlvbnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy51bml0ID0gdW5pdDsKLQkJdGhpcy5jb3JyZXNwb25kaW5nU3BlY2lmaWNhdGlvbnMgPSBjb3JyZXNwb25kaW5nU3BlY2lmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0VW5pdCgpIHsKLQkJcmV0dXJuIHVuaXQ7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRHZW5lcmljU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiBjb3JyZXNwb25kaW5nU3BlY2lmaWNhdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNmFjOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuSW52YWxpZFN5bnRheEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIElVX0tJTkQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJVV9OQU1FU1BBQ0UgPSAiaXUubmFtZXNwYWNlIjsKLQlzdGF0aWMgbG9uZyBpdUludGVybmFsSWQgPSAwOwotCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgU3RhdGVPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgQXJyYXlMaXN0IGl1Q2FwYWJpbGl0aWVzOwotCXByaXZhdGUgTWFwIGl1RGVwZW5kZW5jaWVzOwotCXByaXZhdGUgYnl0ZSBraW5kID0gSVVfS0lORDsKLQotCXByaXZhdGUgQnVuZGxlRGVzY3JpcHRpb24gcmVzdWx0ID0gbnVsbDsKLQotCXByaXZhdGUgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHJlY29tbWVuZGF0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtZXIoU3RhdGVPYmplY3RGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcyhmYWN0b3J5LCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNmb3JtZXIoU3RhdGVPYmplY3RGYWN0b3J5IGZhY3RvcnksIERpY3Rpb25hcnkgY29udGV4dCwgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHJlY29tbWVuZGF0aW9ucykgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLnJlY29tbWVuZGF0aW9ucyA9IHJlY29tbWVuZGF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJVV9LSU5EIDoKLQkJCQlyZXR1cm4gSVVfTkFNRVNQQUNFOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBraW5kIik7IC8vVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCQl9Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKFJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCS8vIElmIHRoZXJlIGlzIG5vIGNvbnRleHQgdGhlbiBiZSBvcHRpbWlzdGljCi0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIGZpbHRlciA9IGNhcGFiaWxpdHkuZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJcmV0dXJuIERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuY3JlYXRlRmlsdGVyKGZpbHRlcikubWF0Y2goY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgd2UgZmFpbCB0byBwYXJzZSB0aGUgZmlsdGVyIHRyZWF0IGl0IGFzIGludmFsaWQgYW5kIGJlIG9wdGltaXN0aWMKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdG9GaWx0ZXIoVmVyc2lvblJhbmdlIHJhbmdlKSB7Ci0JCWlmIChyYW5nZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIigmIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiKHZlcnNpb24+PSIpLmFwcGVuZChyYW5nZS5nZXRNaW5pbXVtKCkudG9TdHJpbmcoKSkuYXBwZW5kKCcpJyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFyYW5nZS5nZXRJbmNsdWRlTWluaW11bSgpKQotCQkJYnVmLmFwcGVuZCgiKCEodmVyc2lvbj0iKS5hcHBlbmQocmFuZ2UuZ2V0TWluaW11bSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgiKSkiKTsKLQkJYnVmLmFwcGVuZCgiKHZlcnNpb248PSIpLmFwcGVuZChyYW5nZS5nZXRNYXhpbXVtKCkudG9TdHJpbmcoKSkuYXBwZW5kKCcpJyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFyYW5nZS5nZXRJbmNsdWRlTWF4aW11bSgpKQotCQkJYnVmLmFwcGVuZCgiKCEodmVyc2lvbj0iKS5hcHBlbmQocmFuZ2UuZ2V0TWF4aW11bSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgiKSkiKTsKLQkJYnVmLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRDYXBhYmlsaXR5KFByb3ZpZGVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCWl1Q2FwYWJpbGl0aWVzLmFkZChmYWN0b3J5LmNyZWF0ZUdlbmVyaWNEZXNjcmlwdGlvbihjYXBhYmlsaXR5LmdldE5hbWUoKSwgY2FwYWJpbGl0eS5nZXROYW1lc3BhY2UoKSwgY2FwYWJpbGl0eS5nZXRWZXJzaW9uKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEluc3RhbGxhYmxlVW5pdChJSW5zdGFsbGFibGVVbml0IHRvVHJhbnNmb3JtKSB7Ci0JCWtpbmQgPSBJVV9LSU5EOwotCi0JCS8vU3RhcnQgd2l0aCB0aGUgZGVwZW5kZW5jaWVzCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gdG9UcmFuc2Zvcm0uZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJaXVEZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcChyZXF1aXJlcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdFJlcXVpcmVkQ2FwYWJpbGl0eShyZXF1aXJlc1tpXSk7Ci0JCX0KLQotCQkvL0RvIHRoZSBjYXBhYmlsaXRpZXMKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzID0gdG9UcmFuc2Zvcm0uZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJaXVDYXBhYmlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KHJlcXVpcmVzLmxlbmd0aCArIDEpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXRDYXBhYmlsaXR5KGNhcGFiaWxpdGllc1tpXSk7Ci0JCX0KLQotCQkvL0FkZCBhIGNhcGFiaWxpdHkgcmVwcmVzZW50aW5nIHRoZSBJVSBpdHNlbGYKLQkJaXVDYXBhYmlsaXRpZXMuYWRkKGZhY3RvcnkuY3JlYXRlR2VuZXJpY0Rlc2NyaXB0aW9uKHRvVHJhbnNmb3JtLmdldElkKCksIGdldE5hbWVzcGFjZSgpLCB0b1RyYW5zZm9ybS5nZXRWZXJzaW9uKCksIG51bGwpKTsKLQotCQlHZW5lcmljU3BlY2lmaWNhdGlvbltdIGdlbmVyaWNTcGVjaWZpY2F0aW9ucyA9IG5ldyBHZW5lcmljU3BlY2lmaWNhdGlvbltpdURlcGVuZGVuY2llcy5zaXplKCldOwotCQlpdURlcGVuZGVuY2llcy5rZXlTZXQoKS50b0FycmF5KGdlbmVyaWNTcGVjaWZpY2F0aW9ucyk7Ci0KLQkJR2VuZXJpY0Rlc2NyaXB0aW9uW10gZ2VuZXJpY0Rlc2NyaXB0aW9ucyA9IG5ldyBHZW5lcmljRGVzY3JpcHRpb25baXVDYXBhYmlsaXRpZXMuc2l6ZSgpXTsKLQkJaXVDYXBhYmlsaXRpZXMudG9BcnJheShnZW5lcmljRGVzY3JpcHRpb25zKTsKLQotCQkvL0ZpbmFsbHkgY3JlYXRlIHRoZSBidW5kbGUgZGVzY3JpcHRpb24KLQkJLy9UT0RPIE5lZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZm9yIHRoZSBJVSBpdHNlbGYKLQkJcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihpdUludGVybmFsSWQrKywgdG9UcmFuc2Zvcm0uZ2V0SWQoKSwgdG9UcmFuc2Zvcm0uZ2V0VmVyc2lvbigpLCAoU3RyaW5nKSBudWxsLCAoQnVuZGxlU3BlY2lmaWNhdGlvbltdKSBudWxsLCAoSG9zdFNwZWNpZmljYXRpb24pIG51bGwsIChJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdKSBudWxsLCAoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10pIG51bGwsIHRvVHJhbnNmb3JtLmlzU2luZ2xldG9uKCksIHRydWUsIHRydWUsIHRvVHJhbnNmb3JtLmdldEZpbHRlcigpLCAoU3RyaW5nW10pIG51bGwsIGdlbmVyaWNTcGVjaWZpY2F0aW9ucywgZ2VuZXJpY0Rlc2NyaXB0aW9ucyk7Ci0JCXJlc3VsdC5zZXRVc2VyT2JqZWN0KG5ldyBTdGF0ZU1ldGFkYXRhTWFwKHRvVHJhbnNmb3JtLCBpdURlcGVuZGVuY2llcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVxdWlyZWRDYXBhYmlsaXR5KFJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNFbmFibGVkKGNhcGFiaWxpdHkpKSB7Ci0JCQkJY2FwYWJpbGl0eSA9IHJld3JpdGUoY2FwYWJpbGl0eSk7Ci0JCQkJaXVEZXBlbmRlbmNpZXMucHV0KGZhY3RvcnkuY3JlYXRlR2VuZXJpY1NwZWNpZmljYXRpb24oY2FwYWJpbGl0eS5nZXROYW1lKCksIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCksIHRvRmlsdGVyKGNhcGFiaWxpdHkuZ2V0UmFuZ2UoKSksIGNhcGFiaWxpdHkuaXNPcHRpb25hbCgpLCBjYXBhYmlsaXR5LmlzTXVsdGlwbGUoKSksIGNhcGFiaWxpdHkpOwotCQkJfQotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgIkludmFsaWQgZmlsdGVyOiAiICsgZS5nZXRGaWx0ZXIoKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSByZXdyaXRlKFJlcXVpcmVkQ2FwYWJpbGl0eSBtYXRjaCkgewotCQlpZiAocmVjb21tZW5kYXRpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbWF0Y2g7Ci0JCVJlY29tbWVuZGF0aW9uIGZvdW5kUmVjb21tZW5kYXRpb24gPSByZWNvbW1lbmRhdGlvbnMuZmluZFJlY29tbWVuZGF0aW9uKG1hdGNoKTsKLQkJcmV0dXJuIGZvdW5kUmVjb21tZW5kYXRpb24gIT0gbnVsbCA/IGZvdW5kUmVjb21tZW5kYXRpb24ubmV3VmFsdWUoKSA6IG1hdGNoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1Vuc2F0aXNmaWVkQ2FwYWJpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vVW5zYXRpc2ZpZWRDYXBhYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODAyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vVW5zYXRpc2ZpZWRDYXBhYmlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBwcm92aXNpb25pbmcgZGVwZW5kZW5jeSB0aGF0IHdhcyBub3Qgc2F0aXNmaWVkIGR1cmluZwotICogcmVzb2x1dGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVuc2F0aXNmaWVkQ2FwYWJpbGl0eSB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IG93bmVyOwotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IHJlcXVpcmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucmVzb2x2ZWQgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSByZXF1aXJlZCBUaGUgZGVwZW5kZW5jeSB0aGF0IHdhcyBub3Qgc2F0aXNmaWVkLgotCSAqIEBwYXJhbSBvd25lciBUaGUgaW5zdGFsbGFibGUgdW5pdCB3aG9zZSBkZXBlbmRlbmN5IHdhcyBub3Qgc2F0aXNmaWVkLgotCSAqLwotCXB1YmxpYyBVbnNhdGlzZmllZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5IHJlcXVpcmVkLCBJSW5zdGFsbGFibGVVbml0IG93bmVyKSB7Ci0JCXRoaXMucmVxdWlyZSA9IHJlcXVpcmVkOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpYyBkZXBlbmRlbmN5IHRoYXQgd2FzIG5vdCBzYXRpc2ZpZWQuCi0JICovCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eSBnZXRSZXF1aXJlZENhcGFiaWxpdHkoKSB7Ci0JCXJldHVybiByZXF1aXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGxhYmxlIHVuaXQgd2hvc2UgZGVwZW5kZW5jeSB3YXMgbm90IHNhdGlzZmllZC4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRVbnNhdGlzZmllZFVuaXQoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbIiArIG93bmVyICsgIl0gIiArIHJlcXVpcmUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JvbGxiYWNrL0Zvcm1lclN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcm9sbGJhY2svRm9ybWVyU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ZmQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcm9sbGJhY2svRm9ybWVyU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yb2xsYmFjazsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLkRpcmVjdG9yQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuSVVUcmFuc2Zvcm1hdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBGb3JtZXJTdGF0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVQUk9QX1BSRUZJWCA9ICItLS1JVVBST1BFUlRZLS0tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVUFJPUF9QT1NURklYID0gIi0tLUlVUFJPUEVSVFlLRVktLS0iOyAvLyROT04tTkxTLTEkCi0JVVJMIGxvY2F0aW9uID0gbnVsbDsKLQotCUhhc2h0YWJsZSBnZW5lcmF0ZWRJVXMgPSBuZXcgSGFzaHRhYmxlKCk7IC8va2V5IHByb2ZpbGUgaWQsIHZhbHVlIHRoZSBpdSByZXByZXNlbnRpbmcgdGhpcyBwcm9maWxlCi0KLQlwdWJsaWMgRm9ybWVyU3RhdGUoVVJMIHJlcG9Mb2NhdGlvbikgewotCQlpZiAocmVwb0xvY2F0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXBvc2l0b3J5IGxvY2F0aW9uIGNhbid0IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgZXZlbnRCdXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSk7Ci0JCWxvY2F0aW9uID0gcmVwb0xvY2F0aW9uOwotCi0JCS8vbGlzdGVuIGZvciBwcmUtZXZlbnQuIHRvIHNuYXBzaG90IHRoZSBwcm9maWxlCi0JCWV2ZW50QnVzLmFkZExpc3RlbmVyKG5ldyBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIEJlZ2luT3BlcmF0aW9uRXZlbnQpIHsKLQkJCQkJQmVnaW5PcGVyYXRpb25FdmVudCBldmVudCA9IChCZWdpbk9wZXJhdGlvbkV2ZW50KSBvOwotCQkJCQlJSW5zdGFsbGFibGVVbml0IGl1Rm9yUHJvZmlsZSA9IHByb2ZpbGVUb0lVKGV2ZW50LmdldFByb2ZpbGUoKSk7Ci0JCQkJCWdlbmVyYXRlZElVcy5wdXQoZXZlbnQuZ2V0UHJvZmlsZSgpLmdldFByb2ZpbGVJZCgpLCBpdUZvclByb2ZpbGUpOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFByb2ZpbGVFdmVudCkgewotCQkJCQlQcm9maWxlRXZlbnQgZXZlbnQgPSAoUHJvZmlsZUV2ZW50KSBvOwotCQkJCQlpZiAoZXZlbnQuZ2V0UmVhc29uKCkgPT0gUHJvZmlsZUV2ZW50LkNIQU5HRUQpCi0JCQkJCQlnZXRSZXBvc2l0b3J5KCkuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHsoSUluc3RhbGxhYmxlVW5pdCkgZ2VuZXJhdGVkSVVzLmdldChldmVudC5nZXRQcm9maWxlSWQoKSl9KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJvbGxiYWNrT3BlcmF0aW9uRXZlbnQpIHsKLQkJCQkJUm9sbGJhY2tPcGVyYXRpb25FdmVudCBldmVudCA9IChSb2xsYmFja09wZXJhdGlvbkV2ZW50KSBvOwotCQkJCQlnZW5lcmF0ZWRJVXMucmVtb3ZlKGV2ZW50LmdldFByb2ZpbGUoKS5nZXRQcm9maWxlSWQoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy9UT0RPIFdlIG5lZWQgdG8gZGVjaWRlIHdoYXQgdG8gZG8gb24gcHJvZmlsZSByZW1vdmFsCQkJCQotCQkJCS8vCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBQcm9maWxlRXZlbnQpIHsKLQkJCQkvLwkJCQkJUHJvZmlsZUV2ZW50IHBlID0gKFByb2ZpbGVFdmVudCkgbzsKLQkJCQkvLwkJCQkJaWYgKHBlLmdldFJlYXNvbigpID09IFByb2ZpbGVFdmVudC5SRU1PVkVEKSB7Ci0JCQkJLy8JCQkJCQlwcm9maWxlUmVnaXN0cmllcy5yZW1vdmUocGUuZ2V0UHJvZmlsZSgpLmdldFByb2ZpbGVJZCgpKTsKLQkJCQkvLwkJCQkJCXBlcnNpc3QoKTsKLQkJCQkvLwkJCQkJfQotCQkJCS8vCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlJTWV0YWRhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCX0KLQkJdHJ5IHsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgIkFnZW50IHJvbGxiYWNrIHJlcG9zaXRvcnkiLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSk7Ci0JCQlyZXBvc2l0b3J5LnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2coZSk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIG9wZW4gb3IgY3JlYXRlIEFnZW50J3Mgcm9sbGJhY2sgcmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JSUluc3RhbGxhYmxlVW5pdCBwcm9maWxlVG9JVShJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIHJlc3VsdCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJcmVzdWx0LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX1BST0ZJTEUsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJcmVzdWx0LnNldElkKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlyZXN1bHQuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigwLCAwLCAwLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkpOwotCQlyZXN1bHQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoSVVUcmFuc2Zvcm1hdGlvbkhlbHBlci50b1JlcXVpcmVtZW50cyhwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpLCBmYWxzZSkpOwotCQkvLyBTYXZlIHRoZSBwcm9maWxlIHByb3BlcnRpZXMKLQkJLy8gVE9ETyB3ZSBhcmVuJ3QgbWFya2luZyB0aGVzZSBwcm9wZXJ0aWVzIGluIGFueSBzcGVjaWFsIHdheSB0byBpbmRpY2F0ZSB0aGV5IGNhbWUgZnJvbSBwcm9maWxlIHByb3BlcnRpZXMuICBTaG91bGQgd2U/Ci0JCU1hcCBwcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LnNldFByb3BlcnR5KGtleSwgKFN0cmluZykgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0JCX0KLQkJLy8gU2F2ZSB0aGUgSVUgcHJvZmlsZSBwcm9wZXJ0aWVzCi0JCUl0ZXJhdG9yIGFsbElVcyA9IHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxJVXMuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGFsbElVcy5uZXh0KCk7Ci0JCQlwcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KTsKLQkJCWl0ZXIgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJcmVzdWx0LnNldFByb3BlcnR5KElVUFJPUF9QUkVGSVggKyBpdS5nZXRJZCgpICsgSVVQUk9QX1BPU1RGSVggKyBrZXksIChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KGtleSkpOwotCQkJfQotCQl9Ci0KLQkJLy9UT0RPIERvIHdlIG5lZWQgdG8gbWFyayBwcm9maWxlIHdpdGggYSBzcGVjaWFsIG1hcmtlcgotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChyZXN1bHQpOwotCX0KLQkvLwlwcml2YXRlIGNvcHlQcm9wZXJ0eShQcm9maWxlIHApIHsKLQkvLwkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gcC5nZXRWYWx1ZXMoKTsKLQkvLwl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSURpcmVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSURpcmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODQ0ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lEaXJlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLS8qKgotICogRGlyZWN0b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBzaG91bGQgYmUgZG9uZSB0byBhIGdpdmVuIAotICogcHJvZmlsZSB0byByZXNoYXBlIGl0IGFzIHJlcXVlc3RlZC4gVGhhdCBpcywgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAKLSAqIHByb2ZpbGUsIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRlc2lyZWQgZW5kIHN0YXRlIG9mIHRoYXQgcHJvZmlsZSBhbmQgbWV0YWRhdGEgCi0gKiBkZXNjcmliaW5nIHRoZSBhdmFpbGFibGUgSVVzLCBhIGRpcmVjdG9yIHByb2R1Y2VzIGEgbGlzdCBvZiBwcm92aXNpb25pbmcgCi0gKiBvcGVyYXRpb25zIChlLmcuLCBpbnN0YWxsLCB1cGRhdGUgb3IgdW5pbnN0YWxsKSB0byBwZXJmb3JtIG9uIHRoZSByZWxhdGVkIElVcy4gCi0gKiBEaXJlY3RvcnMgYXJlIGFsc28gYWJsZSB0byB2YWxpZGF0ZSBwcm9maWxlcyBhbmQgYXNzaXN0IGluIHRoZSBkaWFnbm9zaXMgb2YgCi0gKiBjb25maWd1cmF0aW9uIGVycm9ycy4gTm90ZSB0aGF0IGRpcmVjdG9ycyBtYXkgcmFuZ2UgaW4gY29tcGxleGl0eSBmcm9tIAotICogdmVyeSBzaW1wbGUgKGUuZy4sIHJlYWRpbmcgYSBsaXN0IG9mIGJ1bmRsZXMgZnJvbSBhIHN0YXRpYyBmaWxlKSB0byB2ZXJ5IGNvbXBsZXguIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaXJlY3RvciB7Ci0KLQkvKioKLQkgKiBwZXJmb3JtcyB0aGUgY2hhbmdlIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvZmlsZUNoYW5nZVJlcXVlc3QgVGhlIGNoYW5nZSByZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQgVGhlIHByb3Zpc2lvbmluZyBjb250ZXh0IHVzZWQgZm9yIGZpbmRpbmcgcmVzb3VyY2VzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByb3Zpc2lvbihQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV2ZXJ0cyB0aGUgcHJvZmlsZSB0byBhIHByZXZpb3VzIHN0YXRlIGRlc2NyaWJlZCBpbiB0aGUgZ2l2ZSBJbnN0YWxsYWJsZVVuaXQuCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzIFRoZSBpbnN0YWxsYWJsZSB1bml0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQotCSAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIHJldmVydAotCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBwcm92aXNpb25pbmcgY29udGV4dCB1c2VkIGZvciBmaW5kaW5nIHJlc291cmNlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZXZlcnQoSUluc3RhbGxhYmxlVW5pdCBwcmV2aW91cywgSVByb2ZpbGUgcHJvZmlsZSwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yJ3Mgcm9sbGJhY2sgcmVwb3NpdG9yeSwgd2hlcmUgaW5mb3JtYXRpb24gYWJvdXQKLQkgKiBwcmV2aW91cyBwcm9maWxlIHN0YXRlcyBpcyBzdG9yZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRSb2xsYmFja1JlcG9zaXRvcnlMb2NhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lQbGFubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSVBsYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZmJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSVBsYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLS8qKgotICogUGxhbm5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB3aGF0IHNob3VsZCBiZSBkb25lIHRvIGEgZ2l2ZW4gCi0gKiBwcm9maWxlIHRvIHJlc2hhcGUgaXQgYXMgcmVxdWVzdGVkLiBUaGF0IGlzLCBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIAotICogcHJvZmlsZSwgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzaXJlZCBlbmQgc3RhdGUgb2YgdGhhdCBwcm9maWxlIGFuZCBtZXRhZGF0YSAKLSAqIGRlc2NyaWJpbmcgdGhlIGF2YWlsYWJsZSBJVXMsIGEgcGxhbm5lciBwcm9kdWNlcyBhIHBsYW4gdGhhdCBsaXN0cyB0aGUKLSAqIHByb3Zpc2lvbmluZyBvcGVyYW5kcyB0aGF0IHRoZSBlbmdpbmUgc2hvdWxkIHBlcmZvcm0uICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGxhbm5lciB7Ci0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4gZ2V0UHJvdmlzaW9uaW5nUGxhbihQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4gZ2V0UmV2ZXJ0UGxhbihJSW5zdGFsbGFibGVVbml0IHByb2ZpbGVTbmFwc2hvdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXSB1cGRhdGVzRm9yKElJbnN0YWxsYWJsZVVuaXQgdG9VcGRhdGUsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL1Byb2ZpbGVDaGFuZ2VSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvUHJvZmlsZUNoYW5nZVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNjljNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvUHJvZmlsZUNoYW5nZVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5EaXJlY3RvckFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGNsYXNzIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHsKLQotCXByaXZhdGUgZmluYWwgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIEFycmF5TGlzdCBpdXNUb1JlbW92ZSA9IG51bGw7IC8vIGxpc3Qgb2YgaXVzIHRvIHJlbW92ZQotCXByaXZhdGUgQXJyYXlMaXN0IGl1c1RvQWRkID0gbnVsbDsgLy8gbGlzdCBvZiBpdXMgdG8gYWRkCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvcGVydGllc1RvUmVtb3ZlID0gbnVsbDsgLy8gbGlzdCBvZiBrZXlzIGZvciBwcm9wZXJ0aWVzIHRvIGJlIHJlbW92ZWQKLQlwcml2YXRlIEhhc2hNYXAgcHJvcGVydGllc1RvQWRkID0gbnVsbDsgLy8gbWFwIG9mIGtleS0+dmFsdWUgZm9yIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQKLQlwcml2YXRlIE1hcCBpdVByb3BlcnRpZXNUb0FkZCA9IG51bGw7IC8vIG1hcCBpdS0+bWFwIG9mIGtleS0+dmFsdWUgcGFpcnMgZm9yIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgZm9yIGFuIGl1Ci0JcHJpdmF0ZSBNYXAgaXVQcm9wZXJ0aWVzVG9SZW1vdmUgPSBudWxsOyAvLyBtYXAgb2YgaXUtPmxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSByZW1vdmVkIGZvciBhbiBpdQotCi0JcHVibGljIHN0YXRpYyBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjcmVhdGVCeVByb2ZpbGVJZChTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2ZpbGVSZWdpc3RyeSB1bmF2YWlsYWJsZSIpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2ZpbGUgaWQgIiArIHByb2ZpbGVJZCArICIgaXMgbm90IHJlZ2lzdGVyZWQuIik7Ci0JCXJldHVybiBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JfQotCi0JcHVibGljIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KElQcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2ZpbGUgY2Fubm90IGJlIG51bGwuIik7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JfQotCi0JcHVibGljIElQcm9maWxlIGdldFByb2ZpbGUoKSB7Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcChwcm9maWxlLmdldFByb3BlcnRpZXMoKSk7Ci0JCWlmIChwcm9wZXJ0aWVzVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnRpZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJcmVzdWx0LnJlbW92ZShpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0aWVzVG9BZGQgIT0gbnVsbCkKLQkJCXJlc3VsdC5wdXRBbGwocHJvcGVydGllc1RvQWRkKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldFByb2ZpbGVQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsKSB7Ci0JCWlmIChpdXNUb0FkZCA9PSBudWxsKQotCQkJaXVzVG9BZGQgPSBuZXcgQXJyYXlMaXN0KHRvSW5zdGFsbC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvSW5zdGFsbC5sZW5ndGg7IGkrKykKLQkJCWl1c1RvQWRkLmFkZCh0b0luc3RhbGxbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIHRvVW5pbnN0YWxsKSB7Ci0JCWlmIChpdXNUb1JlbW92ZSA9PSBudWxsKQotCQkJaXVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KHRvVW5pbnN0YWxsLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Vbmluc3RhbGwubGVuZ3RoOyBpKyspCi0JCQlpdXNUb1JlbW92ZS5hZGQodG9Vbmluc3RhbGxbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2ZpbGVQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHByb3BlcnRpZXNUb0FkZCA9PSBudWxsKQotCQkJcHJvcGVydGllc1RvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllc1RvQWRkLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9maWxlUHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlpZiAocHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlwcm9wZXJ0aWVzVG9SZW1vdmUuYWRkKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoaXVQcm9wZXJ0aWVzVG9BZGQgPT0gbnVsbCkKLQkJCWl1UHJvcGVydGllc1RvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSAoTWFwKSBpdVByb3BlcnRpZXNUb0FkZC5nZXQoaXUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWl1UHJvcGVydGllc1RvQWRkLnB1dChpdSwgcHJvcGVydGllcyk7Ci0JCX0KLQkJcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXkpIHsKLQkJaWYgKGl1UHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlpdVByb3BlcnRpZXNUb1JlbW92ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3Qga2V5cyA9IChMaXN0KSBpdVByb3BlcnRpZXNUb1JlbW92ZS5nZXQoaXUpOwotCQlpZiAoa2V5cyA9PSBudWxsKSB7Ci0JCQlrZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXVQcm9wZXJ0aWVzVG9SZW1vdmUucHV0KGl1LCBrZXlzKTsKLQkJfQotCQlrZXlzLmFkZChrZXkpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gZ2V0UmVtb3ZlZEluc3RhbGxhYmxlVW5pdHMoKSB7Ci0JCWlmIChpdXNUb1JlbW92ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJSW5zdGFsbGFibGVVbml0WzBdOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgaXVzVG9SZW1vdmUudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtpdXNUb1JlbW92ZS5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpIHsKLQkJaWYgKGl1c1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdFtdKSBpdXNUb0FkZC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1c1RvQWRkLnNpemUoKV0pOwotCX0KLQotCS8vIFN0cmluZyBba2V5LCBrZXksIGtleV0gbmFtZXMgb2YgcHJvcGVydGllcyB0byByZW1vdmUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydGllc1RvUmVtb3ZlKCkgewotCQlpZiAocHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcHJvcGVydGllc1RvUmVtb3ZlLnRvQXJyYXkobmV3IFN0cmluZ1twcm9wZXJ0aWVzVG9SZW1vdmUuc2l6ZSgpXSk7Ci0JfQotCi0JLy8gbWFwIG9mIGtleSB2YWx1ZSBwYWlycwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllc1RvQWRkKCkgewotCQlpZiAocHJvcGVydGllc1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHByb3BlcnRpZXNUb0FkZDsKLQl9Ci0KLQkvLyBtYXAgb2YgaXUtPmxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSByZW1vdmVkIGZvciBhbiBpdQkKLQlwdWJsaWMgTWFwIGdldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzVG9SZW1vdmUoKSB7Ci0JCWlmIChpdVByb3BlcnRpZXNUb1JlbW92ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpdVByb3BlcnRpZXNUb1JlbW92ZTsKLQl9Ci0KLQkvLyBUT0RPIFRoaXMgY2FuIGJlIHJlcHJlc2VudGVkIGFuZCByZXR1cm5lZCBpbiB3aGF0ZXZlciB3YXkgbWFrZXMgbW9zdCBzZW5zZSBmb3IgcGxhbm5lci9lbmdpbmUKLQkvLyBtYXAgaXUtPm1hcCBvZiBrZXktPnZhbHVlIHBhaXJzIGZvciBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIGZvciBhbiBpdQotCXB1YmxpYyBNYXAgZ2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnRpZXNUb0FkZCgpIHsKLQkJaWYgKGl1UHJvcGVydGllc1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGl1UHJvcGVydGllc1RvQWRkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL1Byb3Zpc2lvbmluZ1BsYW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9Qcm92aXNpb25pbmdQbGFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTI0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL1Byb3Zpc2lvbmluZ1BsYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuT3BlcmFuZDsKLQotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ1BsYW4gewotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0JcHJpdmF0ZSBPcGVyYW5kW10gb3BlcmFuZHM7Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nUGxhbihJU3RhdHVzIHN0YXR1cykgewotCQl0aGlzKHN0YXR1cywgbmV3IE9wZXJhbmRbMF0pOwotCX0KLQotCXB1YmxpYyBQcm92aXNpb25pbmdQbGFuKElTdGF0dXMgc3RhdHVzLCBPcGVyYW5kW10gb3BlcmFuZHMpIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCXRoaXMub3BlcmFuZHMgPSBvcGVyYW5kczsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqIAotCSAqIFRoZSBvcGVyYW5kcyB0byBwYXNzIHRvIHRoZSBlbmdpbmUuCi0JICogQHJldHVybiB0aGUgb3BlcmFuZHMgdG8gYmUgZXhlY3V0ZWQuIFRoaXMgbWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIHRoZQotCSAqIHBsYW4gaGFzIGVycm9ycyBvciBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgotCSAqLwotCXB1YmxpYyBPcGVyYW5kW10gZ2V0T3BlcmFuZHMoKSB7Ci0JCXJldHVybiBvcGVyYW5kczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGUyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYjU4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLSNUaHUgU2VwIDA2IDIzOjQ4OjA0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NmFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU4OjExIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MmVjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4ZW1wbGFyeXNldHVwLkFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXhlbXBsYXJ5c2V0dXA7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3OTRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIEV4ZW1wbGFyeSBTZXR1cAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leGVtcGxhcnlzZXR1cC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leGVtcGxhcnlzZXR1cC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MDRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXhlbXBsYXJ5c2V0dXAvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXhlbXBsYXJ5c2V0dXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5TaW1wbGVEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLlNpbXBsZVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuTWV0YWRhdGFDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5TaW1wbGVQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLkdhcmJhZ2VDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lk1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXByaXZhdGUgSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1czsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uQnVzOwotCi0JcHJpdmF0ZSBNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIGRlZmF1bHRNYW5hZ2VyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25EZWZhdWx0TWFuYWdlcjsKLQotCS8vCXByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRpZmFjdFJlcG9NYW5hZ2VyOwotCS8vCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25BcnRpZmFjdFJlcG9NYW5hZ2VyOwotCi0JcHJpdmF0ZSBJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeTsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uUHJvZmlsZVJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkRpcmVjdG9yOwotCi0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25QbGFubmVyOwotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vTmVlZCB0byBkbyB0aGUgY29uZmlndXJhdGlvbiBvZiBhbGwgdGhlIGJpdHMgYW5kIHBpZWNlczoKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBhQ29udGV4dDsKLQotCQlyZWdpc3RlckV2ZW50QnVzKCk7Ci0JCS8vY3JlYXRlIHRoZSBwcm9maWxlIHJlZ2lzdHJ5Ci0JCXJlZ2lzdGVyUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCS8vY3JlYXRlIG1ldGFkYXRhIHJlcG9zaXRvcmllcwotCQlyZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCk7Ci0JCXJlZ2lzdGVyTWV0YWRhdGFDYWNoZSgpOwotCi0JCS8vY3JlYXRlIHRoZSBkaXJlY3RvciBhbmQgcGxhbm5lci4gIFRoZSBwbGFubmVyIG11c3QgYmUKLQkJLy9yZWdpc3RlcmVkIGZpcnN0IGJlY2F1c2UgdGhlIGRpcmVjdG9yIGZpbmRzIGl0IGluIGl0cyBjb25zdHJ1Y3Rvci4KLQkJcmVnaXN0ZXJQbGFubmVyKCk7Ci0JCXJlZ2lzdGVyRGlyZWN0b3IoKTsKLQkJc3RhcnRHYXJiYWdlQ29sbGVjdG9yKCk7Ci0KLQkJLy9jcmVhdGUgYXJ0aWZhY3QgcmVwb3NpdG9yaWVzCi0JCS8vCQlyZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0R2FyYmFnZUNvbGxlY3RvcigpIHsKLQkJbmV3IEdhcmJhZ2VDb2xsZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLwkJdW5yZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCk7Ci0JCXVucmVnaXN0ZXJEaXJlY3RvcigpOwotCQl1bnJlZ2lzdGVyUGxhbm5lcigpOwotCQl1bnJlZ2lzdGVyRGVmYXVsdE1ldGFkYXRhUmVwb01hbmFnZXIoKTsKLQkJdW5yZWdpc3RlclByb2ZpbGVSZWdpc3RyeSgpOwotCQl1bnJlZ2lzdGVyRXZlbnRCdXMoKTsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGlyZWN0b3IoKSB7Ci0JCWRpcmVjdG9yID0gbmV3IFNpbXBsZURpcmVjdG9yKCk7Ci0JCXJlZ2lzdHJhdGlvbkRpcmVjdG9yID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgZGlyZWN0b3IsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRGlyZWN0b3IoKSB7Ci0JCXJlZ2lzdHJhdGlvbkRpcmVjdG9yLnVucmVnaXN0ZXIoKTsKLQkJcmVnaXN0cmF0aW9uRGlyZWN0b3IgPSBudWxsOwotCQlkaXJlY3RvciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUGxhbm5lcigpIHsKLQkJcGxhbm5lciA9IG5ldyBTaW1wbGVQbGFubmVyKCk7Ci0JCXJlZ2lzdHJhdGlvblBsYW5uZXIgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJUGxhbm5lci5jbGFzcy5nZXROYW1lKCksIHBsYW5uZXIsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyUGxhbm5lcigpIHsKLQkJcmVnaXN0cmF0aW9uUGxhbm5lci51bnJlZ2lzdGVyKCk7Ci0JCXJlZ2lzdHJhdGlvblBsYW5uZXIgPSBudWxsOwotCQlwbGFubmVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJQcm9maWxlUmVnaXN0cnkoKSB7Ci0JCXByb2ZpbGVSZWdpc3RyeSA9IG5ldyBTaW1wbGVQcm9maWxlUmVnaXN0cnkoKTsKLQkJcmVnaXN0cmF0aW9uUHJvZmlsZVJlZ2lzdHJ5ID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCksIHByb2ZpbGVSZWdpc3RyeSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJQcm9maWxlUmVnaXN0cnkoKSB7Ci0JCXJlZ2lzdHJhdGlvblByb2ZpbGVSZWdpc3RyeS51bnJlZ2lzdGVyKCk7Ci0JCXJlZ2lzdHJhdGlvblByb2ZpbGVSZWdpc3RyeSA9IG51bGw7Ci0JCXByb2ZpbGVSZWdpc3RyeSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdE1ldGFkYXRhUmVwb01hbmFnZXIoKSB7Ci0JCWRlZmF1bHRNYW5hZ2VyID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJcmVnaXN0cmF0aW9uRGVmYXVsdE1hbmFnZXIgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGRlZmF1bHRNYW5hZ2VyLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCkgewotCQlyZWdpc3RyYXRpb25EZWZhdWx0TWFuYWdlci51bnJlZ2lzdGVyKCk7Ci0JCXJlZ2lzdHJhdGlvbkRlZmF1bHRNYW5hZ2VyID0gbnVsbDsKLQkJZGVmYXVsdE1hbmFnZXIgPSBudWxsOwotCX0KLQotCS8vCXByaXZhdGUgdm9pZCByZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCkgewotCS8vCQlhcnRpZmFjdFJlcG9NYW5hZ2VyID0gbmV3IEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkvLwkJcmVnaXN0cmF0aW9uQXJ0aWZhY3RSZXBvTWFuYWdlciA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSwgYXJ0aWZhY3RSZXBvTWFuYWdlciwgbnVsbCk7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJEZWZhdWx0QXJ0aWZhY3RSZXBvTWFuYWdlcigpIHsKLQkvLwkJcmVnaXN0cmF0aW9uQXJ0aWZhY3RSZXBvTWFuYWdlci51bnJlZ2lzdGVyKCk7Ci0JLy8JCWFydGlmYWN0UmVwb01hbmFnZXIgPSBudWxsOwotCS8vCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3Rlck1ldGFkYXRhQ2FjaGUoKSB7Ci0JCS8vVE9ETzogd2UgbmVlZCB0byBzdGFydCBtZXRhZGF0YSBjYWNoZSBhdCBhIHNwZWNpZmljIHRpbWUsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyCi0JCS8vYmVpbmcgcHJlc2VudC4gUmVhbGx5LCBNZXRhZGF0YUNhY2hlIHNob3VsZCBqdXN0IHdhaXQgdW50aWwgbWV0YWRhdGEgcmVwb3NpdG9yeSBzZXJ2aWNlCi0JCS8vaXMgYXZhaWxhYmxlIGFuZCB0aGVuIGluaXRpYWxpemUgaXRzZWxmCi0JCW5ldyBNZXRhZGF0YUNhY2hlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRXZlbnRCdXMoKSB7Ci0JCWJ1cyA9IG5ldyBQcm92aXNpb25pbmdFdmVudEJ1cygpOwotCQlyZWdpc3RyYXRpb25CdXMgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FLCBidXMsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRXZlbnRCdXMoKSB7Ci0JCXJlZ2lzdHJhdGlvbkJ1cy51bnJlZ2lzdGVyKCk7Ci0JCXJlZ2lzdHJhdGlvbkJ1cyA9IG51bGw7Ci0JCWJ1cy5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NmExNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvT1NHaSVNaW5pbXVtLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQzY2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWE5ZjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDdkMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0jV2VkIE1hciAxOSAxNzo0MzoxNiBCUlQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJjYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTg6MDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM5YjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uLkFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uO3gtaW50ZXJuYWw6PXRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLm9zZ2kuZnJhbWV3b3JrCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IjMuNC4wIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkN2VkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhiNWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXh0ZW5zaW9uIExvY2F0aW9uIFJlcG9zaXRvcnkgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzJjOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgIGlkPSJleHRlbnNpb25SZXBvc2l0b3J5IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS5tZXRhZGF0YVJlcG9zaXRvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgIHN1ZmZpeD0iZWNsaXBzZSI+Ci0gICAgICA8L2ZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5hcnRpZmFjdFJlcG9zaXRvcmllcyI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIHN1ZmZpeD0iZWNsaXBzZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDU5NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBidW5kbGVDb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4OGIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlXYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeS5BYnN0cmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfRVhURU5TSU9OID0gInByb2ZpbGUuZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFID0gImVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGFydGlmYWN0UmVwb3NpdG9yeTsKLQotCXB1YmxpYyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCJFeHRlbnNpb246ICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBudWxsLCBudWxsLCBsb2NhdGlvbiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIGJhc2UgPSBnZXRCYXNlRGlyZWN0b3J5KGxvY2F0aW9uKTsKLQkJRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoYmFzZSwgUExVR0lOUyk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShiYXNlLCBGRUFUVVJFUyk7Ci0KLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU3RyaW5nIHN0YXRlRGlyTmFtZSA9IEludGVnZXIudG9TdHJpbmcobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKS5oYXNoQ29kZSgpKTsKLQkJRmlsZSBidW5kbGVEYXRhID0gY29udGV4dC5nZXREYXRhRmlsZShudWxsKTsKLQkJRmlsZSBzdGF0ZURpciA9IG5ldyBGaWxlKGJ1bmRsZURhdGEsIHN0YXRlRGlyTmFtZSk7Ci0JCVVSTCBsb2NhbFJlcG9zaXRvcnlVUkw7Ci0JCXRyeSB7Ci0JCQlsb2NhbFJlcG9zaXRvcnlVUkwgPSBzdGF0ZURpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdW5leHBlY3RlZAotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkZhaWxlZCB0byBjcmVhdGUgbG9jYWwgcmVwb3NpdG9yeSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYXJ0aWZhY3RSZXBvc2l0b3J5ID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBpbml0aWFsaXplQXJ0aWZhY3RSZXBvc2l0b3J5KGxvY2FsUmVwb3NpdG9yeVVSTCwgImV4dGVuc2lvbiBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiAtICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKG5ldyBGaWxlW10ge3BsdWdpbnMsIGZlYXR1cmVzfSk7Ci0JCVJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBSZXBvc2l0b3J5TGlzdGVuZXIoY29udGV4dCwgbnVsbCwgYXJ0aWZhY3RSZXBvc2l0b3J5KTsKLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBpbml0aWFsaXplQXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCBzdGF0ZURpclVSTCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0JCVNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5sb2FkKHN0YXRlRGlyVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCX0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gZmFjdG9yeS5jcmVhdGUoc3RhdGVEaXJVUkwsIHJlcG9zaXRvcnlOYW1lLCBudWxsKTsKLQkJLy9yZXBvc2l0b3J5LnNldFByb3BlcnR5KFBST0ZJTEVfRVhURU5TSU9OLCAidHJ1ZSIpOwotCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlnZXRCYXNlRGlyZWN0b3J5KGxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0QmFzZURpcmVjdG9yeShVUkwgdXJsKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFGSUxFLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBtdXN0IHVzZSBmaWxlIHByb3RvY29sIiwgbnVsbCkpOwotCi0JCUZpbGUgYmFzZSA9IG5ldyBGaWxlKHVybC5nZXRQYXRoKCkpOwotCQlpZiAoIWJhc2UuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG5vdCBhIGRpcmVjdG9yeSIsIG51bGwpKTsKLQotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGJhc2UpKQotCQkJcmV0dXJuIGJhc2U7Ci0KLQkJRmlsZSBlY2xpcHNlQmFzZSA9IG5ldyBGaWxlKGJhc2UsIEVDTElQU0UpOwotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGVjbGlwc2VCYXNlKSkKLQkJCXJldHVybiBlY2xpcHNlQmFzZTsKLQotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBpcyBub3QgYW4gZXh0ZW5zaW9uIiwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCYXNlRGlyZWN0b3J5KEZpbGUgYmFzZSkgewotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShiYXNlLCBQTFVHSU5TKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGJhc2UsIEZFQVRVUkVTKTsKLQotCQlyZXR1cm4gcGx1Z2lucy5pc0RpcmVjdG9yeSgpIHx8IGZlYXR1cmVzLmlzRGlyZWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcnMoSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmNvbnRhaW5zKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5jb250YWlucyhrZXkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdHMocmVxdWVzdHMsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0T3V0cHV0U3RyZWFtKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RGaWxlKGtleSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzY2I5MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkudmFsaWRhdGUobG9jYXRpb24sIG1vbml0b3IpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU0YTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeVdhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLlJlcG9zaXRvcnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnkuQWJzdHJhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZXBvc2l0b3J5IGltcGxlbWVudHMgSU1ldGFkYXRhUmVwb3NpdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRSA9ICJlY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOUyA9ICJwbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeTsKLQotCXB1YmxpYyBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCJFeHRlbnNpb246ICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBudWxsLCBudWxsLCBsb2NhdGlvbiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIGJhc2UgPSBnZXRCYXNlRGlyZWN0b3J5KGxvY2F0aW9uKTsKLQkJRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoYmFzZSwgUExVR0lOUyk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShiYXNlLCBGRUFUVVJFUyk7Ci0KLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU3RyaW5nIHN0YXRlRGlyTmFtZSA9IEludGVnZXIudG9TdHJpbmcobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKS5oYXNoQ29kZSgpKTsKLQkJRmlsZSBidW5kbGVEYXRhID0gY29udGV4dC5nZXREYXRhRmlsZShudWxsKTsKLQkJRmlsZSBzdGF0ZURpciA9IG5ldyBGaWxlKGJ1bmRsZURhdGEsIHN0YXRlRGlyTmFtZSk7Ci0JCVVSTCBsb2NhbFJlcG9zaXRvcnlVUkw7Ci0JCXRyeSB7Ci0JCQlsb2NhbFJlcG9zaXRvcnlVUkwgPSBzdGF0ZURpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdW5leHBlY3RlZAotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkZhaWxlZCB0byBjcmVhdGUgbG9jYWwgcmVwb3NpdG9yeSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJbWV0YWRhdGFSZXBvc2l0b3J5ID0gaW5pdGlhbGl6ZU1ldGFkYXRhUmVwb3NpdG9yeShsb2NhbFJlcG9zaXRvcnlVUkwsICJleHRlbnNpb24gbG9jYXRpb24gaW1wbGVtZW50YXRpb24gLSAiICsgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihuZXcgRmlsZVtdIHtwbHVnaW5zLCBmZWF0dXJlc30pOwotCQlSZXBvc2l0b3J5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUmVwb3NpdG9yeUxpc3RlbmVyKGNvbnRleHQsIG1ldGFkYXRhUmVwb3NpdG9yeSwgbnVsbCk7Ci0JCXdhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQl9Ci0KLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgaW5pdGlhbGl6ZU1ldGFkYXRhUmVwb3NpdG9yeShVUkwgc3RhdGVEaXJVUkwsIFN0cmluZyByZXBvc2l0b3J5TmFtZSkgewotCQlTaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGZhY3RvcnkubG9hZChzdGF0ZURpclVSTCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGUoc3RhdGVEaXJVUkwsIHJlcG9zaXRvcnlOYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsYWJsZVVuaXRzKElJbnN0YWxsYWJsZVVuaXRbXSBpbnN0YWxsYWJsZVVuaXRzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhRdWVyeSBxdWVyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWdldEJhc2VEaXJlY3RvcnkobG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KFVSTCB1cmwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoIUZJTEUuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG11c3QgdXNlIGZpbGUgcHJvdG9jb2wiLCBudWxsKSk7Ci0KLQkJRmlsZSBiYXNlID0gbmV3IEZpbGUodXJsLmdldFBhdGgoKSk7Ci0JCWlmICghYmFzZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCAibG9jYXRpb24gbm90IGEgZGlyZWN0b3J5IiwgbnVsbCkpOwotCi0JCWlmIChpc0Jhc2VEaXJlY3RvcnkoYmFzZSkpCi0JCQlyZXR1cm4gYmFzZTsKLQotCQlGaWxlIGVjbGlwc2VCYXNlID0gbmV3IEZpbGUoYmFzZSwgRUNMSVBTRSk7Ci0JCWlmIChpc0Jhc2VEaXJlY3RvcnkoZWNsaXBzZUJhc2UpKQotCQkJcmV0dXJuIGVjbGlwc2VCYXNlOwotCi0JCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIGlzIG5vdCBhbiBleHRlbnNpb24iLCBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Jhc2VEaXJlY3RvcnkoRmlsZSBiYXNlKSB7Ci0JCUZpbGUgcGx1Z2lucyA9IG5ldyBGaWxlKGJhc2UsIFBMVUdJTlMpOwotCQlGaWxlIGZlYXR1cmVzID0gbmV3IEZpbGUoYmFzZSwgRkVBVFVSRVMpOwotCi0JCXJldHVybiBwbHVnaW5zLmlzRGlyZWN0b3J5KCkgfHwgZmVhdHVyZXMuaXNEaXJlY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGEwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkudmFsaWRhdGUobG9jYXRpb24sIG1vbml0b3IpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZjU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9kZWJ1ZyA9IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwZTkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTIzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NmQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI1R1ZSBBdWcgMjEgMTE6Mjc6NDggQ0RUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0MDliZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS40LjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucHJlZnM7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvci5HQ0FjdGl2YXRvcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM5OTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGY0MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IFByb3Zpc2lvbmluZyBHYXJiYWdlIENvbGxlY3RvcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg0MDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1hcmtzZXRwcm92aWRlcnMiIG5hbWU9IkdhcmJhZ2UgQ29sbGVjdG9yIiBzY2hlbWE9InNjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QiLz4KLSAgIAotCTwhLS08ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yb290c2V0cHJvdmlkZXJzIgotCQkJaWQ9IlJvb3RTZXRUZXN0Ij4KLQkJCTxydW4gCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci50ZXN0LlJvb3RTZXRUZXN0Ii8+Ci0JPC9leHRlbnNpb24+LS0+Ci0JCi0JIDwhLS08ZXh0ZW5zaW9uCi0JcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWFya3NldHByb3ZpZGVycyIKLQlpZD0iVGVzdFByb3ZpZGVyIj4KLQk8cnVuIAotCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLnRlc3QuTWFya1NldFByb3ZpZGVyVGVzdCIvPgotPC9leHRlbnNpb24+LS0+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zY2hlbWEvR2FyYmFnZUNvbGxlY3Rvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQzOTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIgaWQ9Im1hcmtzZXRwcm92aWRlcnMiIG5hbWU9IlByb2ZpbGUtYmFzZWQgbWFyayBzZXQgcHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1biIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1biI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLklNYXJrU2V0UHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvQ29yZUdhcmJhZ2VDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvQ29yZUdhcmJhZ2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZWI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0NvcmVHYXJiYWdlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBHaXZlbiBhIE1hcmtTZXQsIHRoZSBDb3JlR2FyYmFnZUNvbGxlY3RvciByZW1vdmVzIGFueSBJQXJ0aWZhY3REZXNjcmlwdG9ycyB3aGljaAotICogYXJlIG5vdCBtYXBwZWQgdG8gYmUgYW4gSUFydGlmYWN0S2V5IGluIHRoZSBNYXJrU2V0LgotICovCi1wdWJsaWMgY2xhc3MgQ29yZUdhcmJhZ2VDb2xsZWN0b3IgewotCi0JLyoqCi0JICogV2hlbiBzZXQgdG8gdHJ1ZSwgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2dnZWQgZXZlcnkgdGltZSBhbiBhcnRpZmFjdCBpcyByZW1vdmVkIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGxpc3Qgb2YgSUFydGlmYWN0S2V5cyBhbmQgYW4gSUFydGlmYWN0UmVwb3NpdG9yeSwgcmVtb3ZlcyBhbGwgYXJ0aWZhY3RzCi0JICogaW4gYVJlcG9zaXRvcnkgdGhhdCBhcmUgbm90IG1hcHBlZCB0byBieSBhbiBJQXJ0aWZhY3RLZXkgaW4gbWFya1NldAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhbihJQXJ0aWZhY3RLZXlbXSBtYXJrU2V0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFSZXBvc2l0b3J5KSB7Ci0JCUlBcnRpZmFjdEtleVtdIHJlcG9zaXRvcnlLZXlzID0gYVJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVwb3NpdG9yeUtleXMubGVuZ3RoOyBqKyspIHsKLQkJCWJvb2xlYW4gYXJ0aWZhY3RJc0FjdGl2ZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBtYXJrU2V0Lmxlbmd0aDsgaysrKSB7Ci0JCQkJaWYgKHJlcG9zaXRvcnlLZXlzW2pdLmVxdWFscyhtYXJrU2V0W2tdKSkgewotCQkJCQlhcnRpZmFjdElzQWN0aXZlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFhcnRpZmFjdElzQWN0aXZlKSB7Ci0JCQkJYVJlcG9zaXRvcnkucmVtb3ZlRGVzY3JpcHRvcihyZXBvc2l0b3J5S2V5c1tqXSk7Ci0JCQkJaWYgKGRlYnVnTW9kZSkgewotCQkJCQlUcmFjaW5nLmRlYnVnKCJLZXkgcmVtb3ZlZDoiICsgcmVwb3NpdG9yeUtleXNbal0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiBzZXQgdG8gdHJ1ZSwgZGVidWcgbW9kZSB3aWxsIGxvZyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGFydGlmYWN0IGRlbGV0ZWQgYnkgdGhlIENvcmVHYXJiYWdlQ29sbGVjdG9yCi0JICogQHBhcmFtIGluRGVidWdNb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlYnVnTW9kZShib29sZWFuIGluRGVidWdNb2RlKSB7Ci0JCWRlYnVnTW9kZSA9IGluRGVidWdNb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvR0NBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvR0NBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRkY2RjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dDQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBHQ0FjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdDX0VOQUJMRUQgPSAiZ2NfZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfU1RSSU5HID0gR0NBY3RpdmF0b3IuSUQgKyAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9ERUJVRyA9IGZhbHNlOwotCi0Jc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXByaXZhdGUgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lciBidXNMaXN0ZW5lcjsKLQotCXN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGN0eCwgU3RyaW5nIG5hbWUpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByZXN1bHQgPSBjdHguZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQljdHgudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBpbkNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlHQ0FjdGl2YXRvci5jb250ZXh0ID0gaW5Db250ZXh0OwotCQlEZWJ1Z09wdGlvbnMgZGVidWcgPSAoRGVidWdPcHRpb25zKSBnZXRTZXJ2aWNlKGluQ29udGV4dCwgRGVidWdPcHRpb25zLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkZWJ1ZyAhPSBudWxsKSB7Ci0JCQlDb3JlR2FyYmFnZUNvbGxlY3Rvci5zZXREZWJ1Z01vZGUoZGVidWcuZ2V0Qm9vbGVhbk9wdGlvbihERUJVR19TVFJJTkcsIERFRkFVTFRfREVCVUcpKTsKLQkJfQotCQlyZWdpc3RlckdDVHJpZ2dlcigpOwotCX0KLQotCS8vCVJlZ2lzdGVyIHRoZSBsaXN0ZW5lciB1c2VkIHRvIHRyaWdnZXIgdGhlIEdDLgotCXByaXZhdGUgdm9pZCByZWdpc3RlckdDVHJpZ2dlcigpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgZ2V0U2VydmljZShHQ0FjdGl2YXRvci5jb250ZXh0LCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGV2ZW50QnVzID09IG51bGwpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBHQ0FjdGl2YXRvci5JRCwgTWVzc2FnZXMuTWlzc2luZ19idXMpKTsKLQkJCXJldHVybjsKLQkJfQotCQlldmVudEJ1cy5hZGRMaXN0ZW5lcihidXNMaXN0ZW5lciA9IG5ldyBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKCkgewotCQkJLy9UaGUgR0MgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gdW5pbnN0YWxsIGV2ZW50IG9jY3VyZWQgZHVyaW5nIGEgInRyYW5zYWN0aW9uIiBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4gICAKLQkJCXByaXZhdGUgYm9vbGVhbiB1bmluc3RhbGxFdmVudE9jY3VycmVkID0gZmFsc2U7Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRFdmVudCkgewotCQkJCQlJbnN0YWxsYWJsZVVuaXRFdmVudCBldmVudCA9IChJbnN0YWxsYWJsZVVuaXRFdmVudCkgbzsKLQkJCQkJaWYgKGV2ZW50LmlzVW5pbnN0YWxsKCkgJiYgZXZlbnQuaXNQb3N0KCkpIHsKLQkJCQkJCXVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ29tbWl0T3BlcmF0aW9uRXZlbnQpIHsKLQkJCQkJaWYgKHVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPT0gdHJ1ZSkgewotCQkJCQkJQ29tbWl0T3BlcmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29tbWl0T3BlcmF0aW9uRXZlbnQpIG87Ci0JCQkJCQlpZiAoZ2V0Qm9vbGVhblByZWZlcmVuY2UoR0NfRU5BQkxFRCwgdHJ1ZSkpIHsKLQkJCQkJCQluZXcgR2FyYmFnZUNvbGxlY3RvcigpLnJ1bkdDKGV2ZW50LmdldFByb2ZpbGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQl1bmluc3RhbGxFdmVudE9jY3VycmVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSb2xsYmFja09wZXJhdGlvbkV2ZW50KSB7Ci0JCQkJCXVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldEJvb2xlYW5QcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZlNlcnZpY2UgPSAoSVByZWZlcmVuY2VzU2VydmljZSkgZ2V0U2VydmljZShjb250ZXh0LCBJUHJlZmVyZW5jZXNTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcmVmU2VydmljZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdG9kbyB3ZSBzaG91bGQgbG9vayBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUgYXMgd2VsbCBidXQgaGF2ZSB0byBiZSBjYXJlZnVsIHRoYXQgdGhlIGluc3RhbmNlIGxvY2F0aW9uIGhhcyBiZWVuIHNldAotCQlub2Rlcy5hZGQobmV3IENvbmZpZ3VyYXRpb25TY29wZSgpLmdldE5vZGUoSUQpKTsKLQkJbm9kZXMuYWRkKG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKElEKSk7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YocHJlZlNlcnZpY2UuZ2V0KGtleSwgQm9vbGVhbi50b1N0cmluZyhkZWZhdWx0VmFsdWUpLCAoUHJlZmVyZW5jZXNbXSkgbm9kZXMudG9BcnJheShuZXcgUHJlZmVyZW5jZXNbbm9kZXMuc2l6ZSgpXSkpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckdDVHJpZ2dlcigpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgZ2V0U2VydmljZShHQ0FjdGl2YXRvci5jb250ZXh0LCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGV2ZW50QnVzICE9IG51bGwgJiYgYnVzTGlzdGVuZXIgIT0gbnVsbCkKLQkJCWV2ZW50QnVzLnJlbW92ZUxpc3RlbmVyKGJ1c0xpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgaW5Db250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdW5yZWdpc3RlckdDVHJpZ2dlcigpOwotCQlHQ0FjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9HYXJiYWdlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dhcmJhZ2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmMDQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dhcmJhZ2VDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogVGhlIG1haW4gY29udHJvbCBwb2ludCBmb3IgdGhlIHAyIGdhcmJhZ2UgY29sbGVjdG9yLiAgVGFrZXMgYSBQcm9maWxlIGFuZCBydW5zIHRoZSBDb3JlR2FyYmFnZUNvbGxlY3RvciB3aXRoIHRoZQotICogYXBwcm9wcmlhdGUgTWFya1NldHMgZm9yIHRoZSByZXBvc2l0b3JpZXMgdXNlZCBieSB0aGF0IFByb2ZpbGUuCi0gKiAKLSAqIFRha2VzIHRoZSBwcm9maWxlIHBhc3NlZCBpbiBhbmQgY3JlYXRlcyBhIHNldCAobWFya1NldCkgdGhhdCBtYXBzIHRoZSBhcnRpZmFjdCByZXBvc2l0b3JpZXMgaXQgdXNlcyB0byB0aGUKLSAqIGFydGlmYWN0IGtleXMgaXRzIElVcyBob2xkLiAgVGhpcyBpcyBkb25lIGJ5IGdldHRpbmcgTWFya1NldHMgZnJvbSBhbGwgcmVnaXN0ZXJlZCBJTWFya1NldFByb3ZpZGVycy4KLSAqIAotICogVGhlbiwgdGhlIE1hcmtTZXRzIGFyZSBvYnRhaW5lZCBmb3IgZXZlcnkgb3RoZXIgcmVnaXN0ZXJlZCBQcm9maWxlIGluIGEgc2ltaWxhciBmYXNoaW9uLiAgRWFjaCBNYXJrU2V0IGlzCi0gKiBjaGVja2VkIHRvIHNlZSBpZiBpdHMgYXJ0aWZhY3QgcmVwb3NpdG9yeSBpcyBhbHJlYWR5IGEga2V5IGluIG1hcmtTZXQuICBJZiBzbywgdGhhdCBNYXJrU2V0J3MgYXJ0aWZhY3Qga2V5cyAKLSAqIGFyZSBhZGRlZCB0byB0aGUgbGlzdCB0aGF0IGlzIG1hcHBlZCB0byBieSB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9NQVJLU0VUID0gR0NBY3RpdmF0b3IuSUQgKyAiLm1hcmtzZXRwcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNYXBzIElBcnRpZmFjdFJlcG9zaXRvcnkgb2JqZWN0cyB0byB0aGVpciByZXNwZWN0aXZlICJtYXJrZWQgc2V0IiBvZiBJQXJ0aWZhY3RLZXlzCi0JICovCi0JcHJpdmF0ZSBNYXAgbWFya1NldDsKLQotCXB1YmxpYyB2b2lkIHJ1bkdDKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJbWFya1NldCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghdHJhdmVyc2VNYWluUHJvZmlsZShwcm9maWxlKSkKLQkJCXJldHVybjsKLQotCQkvL0NvbXBsZXRlIGVhY2ggTWFya1NldCB3aXRoIHRoZSBNYXJrU2V0cyBwcm92aWRlZCBieSBhbGwgb2YgdGhlIG90aGVyIHJlZ2lzdGVyZWQgUHJvZmlsZXMKLQkJdHJhdmVyc2VSZWdpc3RlcmVkUHJvZmlsZXMoKTsKLQotCQkvL1J1biB0aGUgR0Mgb24gZWFjaCBNYXJrU2V0Ci0JCWludm9rZUNvcmVHQygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1haW5Qcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsdHMgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUFRfTUFSS1NFVCk7Ci0KLQkJLy9GaXJzdCB3ZSBjb2xsZWN0IGFsbCByZXBvcyBhbmQga2V5cyBmb3IgdGhlIHByb2ZpbGUgYmVpbmcgR0MnZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShjb25maWdFbHRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInJ1biIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVuQXR0cmlidXRlID0gY29uZmlnRWx0c1tpXTsKLQkJCWlmIChydW5BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQljb250cmlidXRlTWFya1NldHMocnVuQXR0cmlidXRlLCBwcm9maWxlLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW52b2tlQ29yZUdDKCkgewotCQlJdGVyYXRvciBrZXlJdGVyYXRvciA9IG1hcmtTZXQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUFydGlmYWN0UmVwb3NpdG9yeSBuZXh0UmVwbyA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5KSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gKElBcnRpZmFjdEtleVtdKSAoKENvbGxlY3Rpb24pIG1hcmtTZXQuZ2V0KG5leHRSZXBvKSkudG9BcnJheShuZXcgSUFydGlmYWN0S2V5WzBdKTsKLQkJCU1hcmtTZXQgYU1hcmtTZXQgPSBuZXcgTWFya1NldChrZXlzLCBuZXh0UmVwbyk7Ci0JCQluZXcgQ29yZUdhcmJhZ2VDb2xsZWN0b3IoKS5jbGVhbihhTWFya1NldC5nZXRLZXlzKCksIGFNYXJrU2V0LmdldFJlcG8oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhdmVyc2VSZWdpc3RlcmVkUHJvZmlsZXMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbHRzID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFBUX01BUktTRVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKGNvbmZpZ0VsdHNbaV0uZ2V0TmFtZSgpLmVxdWFscygicnVuIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBydW5BdHRyaWJ1dGUgPSBjb25maWdFbHRzW2ldOwotCQkJaWYgKHJ1bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIEdDQWN0aXZhdG9yLmdldFNlcnZpY2UoR0NBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVByb2ZpbGVbXSByZWdpc3RlcmVkUHJvZmlsZXMgPSBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZXMoKTsKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpc3RlcmVkUHJvZmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQljb250cmlidXRlTWFya1NldHMocnVuQXR0cmlidXRlLCByZWdpc3RlcmVkUHJvZmlsZXNbal0sIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUGFyYW1ldGVyaXplZFNhZmVSdW5uYWJsZSBpbXBsZW1lbnRzIElTYWZlUnVubmFibGUgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZnOwotCQlJUHJvZmlsZSBhUHJvZmlsZTsKLQkJTWFya1NldFtdIGFQcm9maWxlTWFya1NldHM7Ci0KLQkJcHVibGljIFBhcmFtZXRlcml6ZWRTYWZlUnVubmFibGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bnRBdHRyaWJ1dGUsIElQcm9maWxlIHByb2ZpbGUpIHsKLQkJCWNmZyA9IHJ1bnRBdHRyaWJ1dGU7Ci0JCQlhUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEdDQWN0aXZhdG9yLklELCBNZXNzYWdlcy5FcnJvcl9pbl9leHRlbnNpb24sIGV4Y2VwdGlvbikpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlJTWFya1NldFByb3ZpZGVyIGFNYXJrU2V0UHJvdmlkZXIgPSAoSU1hcmtTZXRQcm92aWRlcikgY2ZnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJCWlmIChhTWFya1NldFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlhUHJvZmlsZU1hcmtTZXRzID0gbnVsbDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlhUHJvZmlsZU1hcmtTZXRzID0gYU1hcmtTZXRQcm92aWRlci5nZXRNYXJrU2V0cyhhUHJvZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWFya1NldFtdIGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiBhUHJvZmlsZU1hcmtTZXRzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVNYXJrU2V0cyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVuQXR0cmlidXRlLCBJUHJvZmlsZSBwcm9maWxlLCBib29sZWFuIGFkZFJlcG9zaXRvcmllcykgewotCQlQYXJhbWV0ZXJpemVkU2FmZVJ1bm5hYmxlIHByb3ZpZGVyRXhlY3V0b3IgPSBuZXcgUGFyYW1ldGVyaXplZFNhZmVSdW5uYWJsZShydW5BdHRyaWJ1dGUsIHByb2ZpbGUpOwotCQlTYWZlUnVubmVyLnJ1bihwcm92aWRlckV4ZWN1dG9yKTsKLQkJTWFya1NldFtdIGFQcm9maWxlTWFya1NldHMgPSBwcm92aWRlckV4ZWN1dG9yLmdldFJlc3VsdCgpOwotCQlpZiAoYVByb2ZpbGVNYXJrU2V0c1swXSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYVByb2ZpbGVNYXJrU2V0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFQcm9maWxlTWFya1NldHNbaV0gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGFQcm9maWxlTWFya1NldHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoYVByb2ZpbGVNYXJrU2V0c1tqXSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uIGtleXMgPSAoQ29sbGVjdGlvbikgbWFya1NldC5nZXQoYVByb2ZpbGVNYXJrU2V0c1tqXS5nZXRSZXBvKCkpOwotCQkJCWlmIChrZXlzID09IG51bGwpIHsKLQkJCQkJaWYgKGFkZFJlcG9zaXRvcmllcykgewotCQkJCQkJa2V5cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQltYXJrU2V0LnB1dChhUHJvZmlsZU1hcmtTZXRzW2pdLmdldFJlcG8oKSwga2V5cyk7Ci0JCQkJCQlhZGRLZXlzKGtleXMsIGFQcm9maWxlTWFya1NldHNbal0uZ2V0S2V5cygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZEtleXMoa2V5cywgYVByb2ZpbGVNYXJrU2V0c1tqXS5nZXRLZXlzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRLZXlzKENvbGxlY3Rpb24ga2V5TGlzdCwgSUFydGlmYWN0S2V5W10ga2V5QXJyYXkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlBcnJheS5sZW5ndGg7IGkrKykKLQkJCWtleUxpc3QuYWRkKGtleUFycmF5W2ldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0lNYXJrU2V0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvSU1hcmtTZXRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmYyMDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvSU1hcmtTZXRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotCi0vKiogCi0gKiBBbnkgY2xhc3Mgd2hpY2ggZGVjbGFyZXMgaXRzZWxmIGFzIGFuIGV4dGVuc2lvbiB0byB0aGUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLm1hcmtzZXRwcm92aWRlcnMKLSAqIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gIEdpdmVuIGEgUHJvZmlsZSwgaW1wbGVtZW50b3JzIHdpbGwgbmVlZCB0byBwcm92aWRlIGFuIGFycmF5IG9mCi0gKiBNYXJrU2V0IG9iamVjdHMsIGVhY2ggb2Ygd2hpY2ggc2hvdWxkIGNvbnRhaW4gYW4gSUFydGlmYWN0UmVwb3NpdG9yeSBhbmQgdGhlIElBcnRpZmFjdEtleXMgdXNlZCBieSB0aGUgZ2l2ZW4KLSAqIFByb2ZpbGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcmtTZXRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTWFya1NldCBmb3IgZWFjaCBidW5kbGUgcG9vbCB1c2VkIGJ5IGEgUHJvZmlsZSBwLiAgVGhlIE1hcmtTZXQgd2lsbCBjb250YWluCi0JICogYWxsIG9mIHRoZSBJQXJ0aWZhY3RLZXlzIGZvdW5kIGluIHAsIGFzIHdlbGwgYXMgdGhlIElBcnRpZmFjdFJlcG9zaXRvcnkgb3ZlciB3aGljaCB0aGUKLQkgKiByb290IHNldCBvZiBrZXlzIGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogQHBhcmFtIHByb2ZpbGUgQSBwcm9maWxlIHdob3NlIEFydGlmYWN0UmVwb3NpdG9yaWVzIHJlcXVpcmUgYSBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIE1hcmtTZXQgb2JqZWN0KHMpIGNvbnRhaW5pbmcgcCdzIElBcnRpZmFjdFJlcG9zaXRvcnkgYW5kIGl0cyByb290IHNldCBvZiBJQXJ0aWZhY3RLZXlzCi0JICovCi0JcHVibGljIE1hcmtTZXRbXSBnZXRNYXJrU2V0cyhJUHJvZmlsZSBwcm9maWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElBcnRpZmFjdFJlcG9zaXRvcnkgZm9yIHdoaWNoIHRoaXMgSU1hcmtTZXRQcm92aWRlciBwcm92aWRlcyBhIE1hcmtTZXQuCi0JICogQHBhcmFtIHAgVGhlIFByb2ZpbGUgd2hvc2UgSUFydGlmYWN0UmVwb3NpdG9yeSBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIElBcnRpZmFjdFJlcG9zaXRvcnkgZm9yIHdoaWNoIHRoaXMgSU1hcmtTZXRQcm92aWRlciBwcm92aWRlcyBhIE1hcmtTZXQuCi0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShJUHJvZmlsZSBwKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9NYXJrU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL01hcmtTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMjQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL01hcmtTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmdhcmJhZ2Vjb2xsZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgdXNlZCB0byBzdG9yZSBhbiBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFuZCBpdHMgcm9vdCBzZXQgb2YgSUFydGlmYWN0S2V5cy4KLSAqLwotcHVibGljIGNsYXNzIE1hcmtTZXQgewotCi0JLyoqCi0JICogVGhlIHJvb3Qgc2V0IGZvciByZXBvLiAgVGhpcyBpcyB0aGUgc2V0IG9mIGtleXMgdGhhdCBjdXJyZW50bHkgbWFwIHRvIGFuIGFydGlmYWN0IGluIHJlcG8uCi0JICovCi0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXlbXSBrZXlzOwotCi0JLyoqCi0JICogVGhlIEFydGlmYWN0UmVwb3NpdG9yeSBmb3Igd2hpY2ggYSByb290IHNldCBpcyBiZWluZyBzdG9yZWQuCi0JICovCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG87Ci0KLQlwdWJsaWMgTWFya1NldChJQXJ0aWZhY3RLZXlbXSBpbktleXMsIElBcnRpZmFjdFJlcG9zaXRvcnkgaW5SZXBvKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5LZXlzKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChpblJlcG8pOwotCQlrZXlzID0gaW5LZXlzOwotCQlyZXBvID0gaW5SZXBvOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRLZXlzKCkgewotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvKCkgewotCQlyZXR1cm4gcmVwbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwZmVhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JfaW5fZXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfYnVzOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjIzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXJyb3JfaW5fZXh0ZW5zaW9uPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdG8gYW4gSU1hcmtTZXRQcm92aWRlci4KLU1pc3NpbmdfYnVzPVByb3Zpc2lvbmluZ0V2ZW50QnVzIHNlcnZpY2UgY291bGQgbm90IGJlIG9idGFpbmVkLCBDb3JlR2FyYmFnZUNvbGxlY3RvciB3aWxsIG5vdCBmdW5jdGlvbiBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiN2Y0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhMGIzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0jVGh1IE9jdCAxMSAxNjo0NjozMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZTAwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jVGh1IE9jdCAxMSAxNjo1NDoxMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkKLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxMWY3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci5JbnN0YWxsZXJBY3RpdmF0b3IKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uub3NnaSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uuc3d0Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZjY2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIFRoaXMgaXMgYSBzaW1wbGUgaW5zdGFsbCBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyB1c2Ugb2YgcDIuICBTZWUgdGhlIGNsYXNzCi0gY29tbWVudCBvbiB0aGUgSW5zdGFsbERlc2NyaXB0aW9uIGNsYXNzIGZvciBkZXRhaWxzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNkYzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHByb2R1Y3RfbGcuZ2lmLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvY29uZmlnLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3NTVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jIEVjbGlwc2UgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGUKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBtZXJnZWQgaW50byB0aGUgCi0jIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHN5c3RlbSBzdGFydHVwLiAgVGhlIHZhbHVlcyBjb250cm9sIHRoZSB3YXkgdGhlIAotIyBydW50aW1lIGlzIHN0cnVjdHVyZWQgYW5kIHJ1bnMuCi0KLSMgTm90ZTogIE9ubHkgcGxhdGZvcm06L2Jhc2UvIGFuZCBmaWxlOiBVUkxzIGFyZSBzdXBwb3J0ZWQuICBJbiBnZW5lcmFsIHRoZSAKLSMgVVJMcyBnaXZlbiBtYXkgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIChlLmcuLCAuLi4vbG9jYXRpb25fMS4yLjMpLiAgCi0jIElmIGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGJpbmRzCi0jIHRvIHRoZSBsb2NhdGlvbiB3aGljaCBtYXRjaGVzIGV4YWN0bHkgb3IgdG8gdGhlIHZlcnNpb25lZCBsb2NhdGlvbiB3aXRoIHRoZQotIyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuICBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGdpdmVuIHRoZW4gb25seSBleGFjdCBtYXRjaGVzCi0jIGFyZSBjb25zaWRlcmVkLgotCi0jIFRoZSBVUkwgZm9yIHRoZSBydW50aW1lIGVudHJ5IHBvaW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSMgcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpIAotI29zZ2kuZnJhbWV3b3JrPXBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaQotCi0jIFRoZSBjbGFzc3BhdGggZm9yIHRoZSBmcmFtZXdvcmsgZm91bmQgYXQgdGhlIG9zZ2kuZnJhbWV3b3JrIGxvY2F0aW9uLiAgVGhpcyAKLSMgY29tbWEtc2VwYXJhdGVkIGxpc3QgY29udGFpbnMgZWl0aGVyIFVSTHMgb3Igc2ltcGxlIGVsZW1lbnQgbmFtZXMuICBTaW1wbGUKLSMgbmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIGluc3RhbGwgZGlyZWN0b3J5LiAgCi0jIFR5cGljYWxseSB0aGlzIHZhbHVlIG5lZWQgbm90IGJlIHNldCBhcyBpdCBpcyBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrIGl0c2VsZi4KLSMgVmVyc2lvbiBtYXRjaCBzZWFyY2hpbmcgaXMgbm90IGRvbmUgZm9yIFVSTHMgbGlzdGVkIGhlcmUuCi0jb3NnaS5mcmFtZXdvcmtDbGFzc1BhdGggPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgdG8gc2VhcmNoIGZvciB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlIChzcGxhc2guYm1wKS4KLSMgRm9yIGVhY2ggbGlzdCBlbGVtZW50IGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBubC88bG9jYWxlPiBpcyBzZWFyY2hlZC4KLSMgVGhlIHN5c3RlbSBiaW5kcyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgZmlsZS4gIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0jb3NnaS5zcGxhc2hQYXRoPQotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZXQgYXQgc3lzdGVtIHN0YXJ0dXAgaXQgaXMgdXNlZCAKLSMgaW4gZmF2b3VyIG9mIHRoZSBvc2dpLnNwbGFzaFBhdGggc2VhcmNoaW5nIG91dGxpbmVkIGFib3ZlLiAgSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLgotI29zZ2kuc3BsYXNoTG9jYXRpb24gPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkCi0jIG9uY2UgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gIEVhY2ggZW50cnkgaWYgb2YgdGhlIGZvcm0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAIFs8c3RhcnRsZXZlbD5dIFsiOnN0YXJ0Il1dCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLgotIyBJZiB0aGUgInN0YXJ0IiB0YWcgaXMgYWRkZWQgdGhlbiB0aGUgYnVuZGxlIHdpbGwgYmUgbWFya2VkIGFzIHN0YXJ0ZWQgYWZ0ZXIgYmVpbmcgaW5zdGFsbGVkLgotIyBTaW1wbGUgYnVuZGxlIGxvY2F0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIHBhcmVudCBkaXJlY3RvcnkuCi0jIFRoZSBzdGFydGxldmVsIGluZGljYXRlcyB0aGUgT1NHaSBzdGFydCBsZXZlbCBhdCB3aGljaCB0aGUgYnVuZGxlIHNob3VsZCBydW4uCi1vc2dpLmJ1bmRsZXM9XAotCW9yZy5lY2xpcHNlLmNvcmUuam9icyxcCi0Jb3JnLmVjbGlwc2UuZWNmLFwKLQlvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLFwKLQlvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHksXAotCW9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIsXAotCW9yZy5lY2xpcHNlLmVxdWlub3guYXBwQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94QHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3JAc3RhcnQsXAotCW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMsXAotCW9yZy5lY2xpcHNlLnN3dCxcCi0Jb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NixcCi0Jb3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYsXAotCW9yZy5lY2xpcHNlLnN3dC5jYXJib24ubWFjb3N4LFwKLQlvcmcuc2F0NGouY29yZSxcCi0Jb3JnLnNhdDRqLnBiCi0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5yZWNvbmNpbGU9ZmFsc2UKLQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLgotIyBUaGUgcHJvZHVjdCBpZGVudGlmaWVkIHdpbGwgc3VwcGx5IHRoZSBicmFuZGluZyAod2luZG93IGljb25zLCB0aXRsZSBiYXIgdGV4dCkgZXRjIAotIyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uICAKLWVjbGlwc2UucHJvZHVjdD1vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci5wcm9kdWN0Ci0KLSMgVGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4gIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaGVyZSBpcyB0aGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbgotIyB0aGUgcnVudGltZSB3aWxsIGZpbmQsIGluc3RhbnRpYXRlIGFuZCBleGVjdXRlIG9uY2UgdGhlIHN5c3RlbSBpcyB1cC4gIE5vdGUgdGhhdCB0eXBpY2FsbHkgCi0jIHRoZSBpZGVudGlmaWVkIGVjbGlwc2UucHJvZHVjdCBkZWZpbmVzIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSNlY2xpcHNlLmFwcGxpY2F0aW9uPQotCi0jIFRoZSBidWlsZCBpZGVudGlmaWVyCi1lY2xpcHNlLmJ1aWxkSWQ9QGJ1aWxkQAotCi0jIEVuZCBvZiBmaWxlIG1hcmtlciAtIG11c3QgYmUgaGVyZQotZW9mPWVvZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvaW5zdGFsbGVyLnByb2R1Y3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2luc3RhbGxlci5wcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA0ZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvaW5zdGFsbGVyLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IlJDUCBQcm9kdWN0IiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIucHJvZHVjdCIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLmFwcGxpY2F0aW9uIiB1c2VGZWF0dXJlcz0iZmFsc2UiPgotCi0gICA8YWJvdXRJbmZvPgotICAgICAgPGltYWdlIHBhdGg9InByb2R1Y3RfbGcuZ2lmIi8+Ci0gICAgICA8dGV4dD4KLSAgICAgICAgIFAyIEluc3RhbGxlcgotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJjdXN0b20iIHBhdGg9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9jb25maWcuaW5pIi8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzPi1Eb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsRGVzY3JpcHRpb249aHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy90ZXN0VXBkYXRlcy9zZGstaW5zdGFsbGVyLnByb3BlcnRpZXM8L3ZtQXJncz4KLSAgIDwvbGF1bmNoZXJBcmdzPgotCi0gICA8d2luZG93SW1hZ2VzLz4KLQotICAgPHNwbGFzaAotICAgICAgbG9jYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyIiAvPgotICAgPGxhdW5jaGVyIG5hbWU9InAyaW5zdGFsbGVyIj4KLSAgICAgIDxzb2xhcmlzLz4KLSAgICAgIDx3aW4gdXNlSWNvPSJmYWxzZSI+Ci0gICAgICAgICA8Ym1wLz4KLSAgICAgIDwvd2luPgotICAgPC9sYXVuY2hlcj4KLQotICAgPHZtPgotICAgPC92bT4KLQotICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5jYXJib24ubWFjb3N4Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiIgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5zYXQ0ai5jb3JlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuc2F0NGoucGIiLz4KLSAgIDwvcGx1Z2lucz4KLQotPC9wcm9kdWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjI0MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgSW5zdGFsbGVyCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iYXBwbGljYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbEFwcGxpY2F0aW9uIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InByb2R1Y3QiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByb2R1Y3RzIj4KLSAgICAgIDxwcm9kdWN0Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIuYXBwbGljYXRpb24iCi0gICAgICAgICAgICBuYW1lPSJSQ1AgUHJvZHVjdCI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFwcE5hbWUiCi0gICAgICAgICAgICAgICB2YWx1ZT0iUkNQIFByb2R1Y3QiPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYWJvdXRJbWFnZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJwcm9kdWN0X2xnLmdpZiI+Ci0gICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhYm91dFRleHQiCi0gICAgICAgICAgICAgICB2YWx1ZT0iUDIgSW5zdGFsbGVyIj4KLSAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L3Byb2R1Y3Q+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Byb2R1Y3RfbGcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wcm9kdWN0X2xnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5NWUyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Byb2R1Y3RfbGcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zZGstaW5zdGFsbGVyLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Nkay1pbnN0YWxsZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzMDQyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Nkay1pbnN0YWxsZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotZWNsaXBzZS5wMi5tZXRhZGF0YT1odHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL2VjbGlwc2UvdGVzdFVwZGF0ZXMvCi1lY2xpcHNlLnAyLmFydGlmYWN0cz1odHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL2VjbGlwc2UvdGVzdFVwZGF0ZXMvCi1lY2xpcHNlLnAyLmZsYXZvcj10b29saW5nCi1lY2xpcHNlLnAyLnByb2ZpbGVOYW1lPUVjbGlwc2UgU0RLCi1lY2xpcHNlLnAyLmxhdW5jaGVyTmFtZT1lY2xpcHNlCi1lY2xpcHNlLnAyLnJvb3RJZD1zZGsKLWVjbGlwc2UucDIuYXV0b1N0YXJ0PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0hlYWRsZXNzSW5zdGFsbEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0hlYWRsZXNzSW5zdGFsbEFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0ZDEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9IZWFkbGVzc0luc3RhbGxBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuKjsKLQotLyoqCi0gKiBBIGhlYWRsZXNzIGluc3RhbGwgYWR2aXNvciB0aGF0IHByaW50cyBldmVyeXRoaW5nIHRvIGEgbG9nLgotICovCi1wdWJsaWMgY2xhc3MgSGVhZGxlc3NJbnN0YWxsQWR2aXNvciBleHRlbmRzIEluc3RhbGxBZHZpc29yIHsKLQljbGFzcyBIZWFkbGVzc1Byb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQ7Ci0KLQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCQlzZXRSZXN1bHQobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEluc3RhbGxlckFjdGl2YXRvci5QSV9JTlNUQUxMRVIsIG5hbWUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0JCQkvL25vdGhpbmcgdG8gZG8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7Ci0JCQkvL25vdGhpbmcgdG8gZG8KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCQljYW5jZWxlZCA9IHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgSW5zdGFsbGVyQWN0aXZhdG9yLlBJX0lOU1RBTExFUiwgbmFtZSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJLy9ub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLQkJCS8vbm90aGluZyB0byBkbwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybUluc3RhbGwoSUluc3RhbGxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBvcGVyYXRpb24uaW5zdGFsbChuZXcgSGVhZGxlc3NQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHVibGljIEluc3RhbGxEZXNjcmlwdGlvbiBwcmVwYXJlSW5zdGFsbERlc2NyaXB0aW9uKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQkvLyBUaGUgaGVhZGxlc3MgYWR2aXNvciBoYXMgbm8gZnVydGhlciBpbnB1dCBvbiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb21wdEZvckxhdW5jaChJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc3VsdChJU3RhdHVzIHN0YXR1cykgewotCQlMb2dIZWxwZXIubG9nKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCS8vbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vbm90aGluZyB0byBkbwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbEFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiMTQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIudWkuU1dUSW5zdGFsbEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGluc3RhbGxlciBhcHBsaWNhdGlvbiBidWlsdCB1c2luZyBQMi4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIGdpdmVuCi0gKiBhbiAiaW5zdGFsbCBkZXNjcmlwdGlvbiIgYXMgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3Igc3lzdGVtIHByb3BlcnR5IAotICogKHtAbGluayAjU1lTX1BST1BfSU5TVEFMTF9ERVNDUklQVElPTn0pLiAgVGhlIGFwcGxpY2F0aW9uIHJlYWRzIHRoaXMKLSAqIGluc3RhbGwgZGVzY3JpcHRpb24sIGFuZCBsb29rcyBmb3IgYW4gZXhpc3RpbmcgcHJvZmlsZSBpbiB0aGUgbG9jYWwgaW5zdGFsbCByZWdpc3RyeSB0aGF0Ci0gKiBtYXRjaGVzIGl0LiAgSWYgbm8gcHJvZmlsZSBpcyBmb3VuZCwgaXQgY3JlYXRlcyBhIG5ldyBwcm9maWxlLCBhbmQgaW5zdGFsbHMgdGhlIHJvb3QKLSAqIElVIGluIHRoZSBpbnN0YWxsIGRlc2NyaXB0aW9uIGludG8gdGhlIHByb2ZpbGUuIEl0IG1heSB0aGVuIGxhdW5jaCB0aGUgaW5zdGFsbGVkIGFwcGxpY2F0aW9uLAotICogZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBpbnN0YWxsIGRlc2NyaXB0aW9uLiAgSWYgYW4gZXhpc3RpbmcgcHJvZmlsZSBpcyBmb3VuZCwKLSAqIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkIHBlcmZvcm1zIGFuIHVwZGF0ZSBvbiB0aGUgZXhpc3RpbmcgcHJvZmlsZSB3aXRoIHRoZSBuZXcgcm9vdAotICogSVUgaW4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24uIFRodXMsIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBjYW4gYmUgdXBkYXRlZCBieSBkcm9wcGluZwotICogaW4gYSBuZXcgaW5zdGFsbCBkZXNjcmlwdGlvbiBmaWxlLCBhbmQgcmUtcnVubmluZyB0aGlzIGluc3RhbGxlciBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogQSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMIG9mIGFuIGluc3RhbGwgZGVzY3JpcHRpb24uIEFuIGluc3RhbGwgZGVzY3JpcHRpb24gaXMgYSBmaWxlCi0JICogdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSBpbnN0YWxsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNfUFJPUF9JTlNUQUxMX0RFU0NSSVBUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGluc3RhbGwgYWR2aXNvci4gVGhpcyBmaWVsZCBpcyBub24gbnVsbCB3aGlsZSB0aGUgaW5zdGFsbCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLgotCSAqLwotCXByaXZhdGUgSW5zdGFsbEFkdmlzb3IgYWR2aXNvcjsKLQotCS8qKgotCSAqIFRocm93cyBhbiBleGNlcHRpb24gb2Ygc2V2ZXJpdHkgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGZhaWwobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBzZXZlcml0eSBlcnJvciB3aXRoIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvcmVFeGNlcHRpb24gZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgaW5zdGFsbCBkZXNjcmlwdGlvbiwgZmlsbGluZyBpbiBhbnkgbWlzc2luZyBkYXRhIGlmIG5lZWRlZC4KLQkgKi8KLQlwcml2YXRlIEluc3RhbGxEZXNjcmlwdGlvbiBjb21wdXRlSW5zdGFsbERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmZXRjaEluc3RhbGxEZXNjcmlwdGlvbihTdWJNb25pdG9yLmNvbnZlcnQobnVsbCkpOwotCQlyZXR1cm4gYWR2aXNvci5wcmVwYXJlSW5zdGFsbERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEluc3RhbGxBZHZpc29yIGNyZWF0ZUluc3RhbGxDb250ZXh0KCkgewotCQkvL1RPRE8gY3JlYXRlIGFuIGFwcHJvcHJpYXRlIGFkdmlzb3IgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaGVhZGxlc3Mgb3IgR1VJIGluc3RhbGwgaXMgZGVzaXJlZC4KLQkJSW5zdGFsbEFkdmlzb3IgcmVzdWx0ID0gbmV3IFNXVEluc3RhbGxBZHZpc29yKCk7Ci0JCXJlc3VsdC5zdGFydCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEZldGNoIGFuZCByZXR1cm4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24gdG8gYmUgaW5zdGFsbGVkLgotCSAqLwotCXByaXZhdGUgSW5zdGFsbERlc2NyaXB0aW9uIGZldGNoSW5zdGFsbERlc2NyaXB0aW9uKFN1Yk1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgc2l0ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9JTlNUQUxMX0RFU0NSSVBUSU9OKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXRocm93IGZhaWwoTWVzc2FnZXMuQXBwX05vU2l0ZSk7Ci0JCXRyeSB7Ci0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwoc2l0ZSk7Ci0JCQlyZXR1cm4gSW5zdGFsbERlc2NyaXB0aW9uUGFyc2VyLmxvYWRGcm9tUHJvcGVydGllcyhzaXRlVVJMLm9wZW5TdHJlYW0oKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9JbnZhbGlkU2l0ZSArIHNpdGUsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9JbnZhbGlkU2l0ZSArIHNpdGUsIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cyhmaW5hbCBFeGNlcHRpb24gZmFpbHVyZSkgewotCQlUaHJvd2FibGUgY2F1c2UgPSBmYWlsdXJlOwotCQkvL3Vud3JhcCB0YXJnZXQgZXhjZXB0aW9uIGlmIGFwcGxpY2FibGUKLQkJaWYgKGZhaWx1cmUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQljYXVzZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZmFpbHVyZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkKLQkJCQljYXVzZSA9IGZhaWx1cmU7Ci0JCX0KLQkJaWYgKGNhdXNlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiAoKENvcmVFeGNlcHRpb24pIGNhdXNlKS5nZXRTdGF0dXMoKTsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW5zdGFsbGVyQWN0aXZhdG9yLlBJX0lOU1RBTExFUiwgTWVzc2FnZXMuQXBwX0Vycm9yLCBjYXVzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaFByb2R1Y3QoSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGluc3RhbGxMb2NhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQlJUGF0aCB0b1J1biA9IGluc3RhbGxMb2NhdGlvbi5hcHBlbmQoZGVzY3JpcHRpb24uZ2V0TGF1bmNoZXJOYW1lKCkpOwotCQl0cnkgewotCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyh0b1J1bi50b1N0cmluZygpLCBudWxsLCBpbnN0YWxsTG9jYXRpb24udG9GaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9MYXVuY2hGYWlsZWQgKyB0b1J1biwgZSk7Ci0JCX0KLQkJLy93YWl0IGEgZmV3IHNlY29uZHMgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byByZWFkIHRoZSBtZXNzYWdlCi0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMzAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RhcnQob3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCkgewotCQl0cnkgewotCQkJYXBwQ29udGV4dC5hcHBsaWNhdGlvblJ1bm5pbmcoKTsKLQkJCWFkdmlzb3IgPSBjcmVhdGVJbnN0YWxsQ29udGV4dCgpOwotCQkJLy9mZXRjaCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRvIGluc3RhbGwKLQkJCUluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0aW9uID0gY29tcHV0ZUluc3RhbGxEZXNjcmlwdGlvbigpOwotCQkJCXN0YXJ0UmVxdWlyZWRCdW5kbGVzKGRlc2NyaXB0aW9uKTsKLQkJCQkvL3BlcmZvcm0gbG9uZyBydW5uaW5nIGluc3RhbGwgb3BlcmF0aW9uCi0JCQkJSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEluc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uKEluc3RhbGxlckFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLCBkZXNjcmlwdGlvbik7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSBhZHZpc29yLnBlcmZvcm1JbnN0YWxsKG9wZXJhdGlvbik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJCQkJYWR2aXNvci5zZXRSZXN1bHQocmVzdWx0KTsKLQkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJCX0KLQkJCQkvL2p1c3QgZXhpdCBhZnRlciBhIHN1Y2Nlc3NmdWwgdXBkYXRlCi0JCQkJaWYgKCFvcGVyYXRpb24uaXNGaXJzdEluc3RhbGwoKSkKLQkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJCWlmIChjYW5BdXRvU3RhcnQoZGVzY3JpcHRpb24pKQotCQkJCQlsYXVuY2hQcm9kdWN0KGRlc2NyaXB0aW9uKTsKLQkJCQllbHNlIHsKLQkJCQkJLy9ub3RpZnkgdXNlciB0aGF0IHRoZSBwcm9kdWN0IHdhcyBpbnN0YWxsZWQKLQkJCQkJLy9UT0RPIHByZXNlbnQgdGhlIHVzZXIgYW4gb3B0aW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IHRoZSBwcm9kdWN0Ci0JCQkJCWFkdmlzb3Iuc2V0UmVzdWx0KHJlc3VsdCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFkdmlzb3Iuc2V0UmVzdWx0KFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBlcnJvciA9IGdldFN0YXR1cyhlKTsKLQkJCQlhZHZpc29yLnNldFJlc3VsdChlcnJvcik7Ci0JCQkJTG9nSGVscGVyLmxvZyhlcnJvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCX0gZmluYWxseSB7Ci0JCQlhZHZpc29yLnN0b3AoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGluc3RhbGwKLQkgKiBkZXNjcmlwdGlvbiBjYW4gYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5BdXRvU3RhcnQoSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWlmICghZGVzY3JpcHRpb24uaXNBdXRvU3RhcnQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9jYW4ndCBzdGFydCBpZiB3ZSBkb24ndCBrbm93IGxhdW5jaGVyIG5hbWUgYW5kIHBhdGgKLQkJaWYgKGRlc2NyaXB0aW9uLmdldExhdW5jaGVyTmFtZSgpID09IG51bGwgfHwgZGVzY3JpcHRpb24uZ2V0SW5zdGFsbExvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFkdmlzb3IucHJvbXB0Rm9yTGF1bmNoKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIHAyIGJ1bmRsZXMgbmVlZGVkIHRvIGNvbnRpbnVlIHdpdGggdGhlIGluc3RhbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0UmVxdWlyZWRCdW5kbGVzKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBpbnN0YWxsTG9jYXRpb24gPSBkZXNjcmlwdGlvbi5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJaWYgKGluc3RhbGxMb2NhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgZmFpbChNZXNzYWdlcy5BcHBfTm9JbnN0YWxsTG9jYXRpb24sIG51bGwpOwotCQkvL3NldCBhZ2VudCBsb2NhdGlvbiBpZiBzcGVjaWZpZWQKLQkJSVBhdGggYWdlbnRMb2NhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEFnZW50TG9jYXRpb24oKTsKLQkJaWYgKGFnZW50TG9jYXRpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIGFnZW50QXJlYSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGFnZW50QXJlYSA9PSBudWxsIHx8IGFnZW50QXJlYS5sZW5ndGgoKSA9PSAwKQotCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiLCBhZ2VudExvY2F0aW9uLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCX0KLQkJLy9zZXQgYnVuZGxlIHBvb2wgbG9jYXRpb24gaWYgc3BlY2lmaWVkCi0JCUlQYXRoIGJ1bmRsZUxvY2F0aW9uID0gZGVzY3JpcHRpb24uZ2V0QnVuZGxlTG9jYXRpb24oKTsKLQkJaWYgKGJ1bmRsZUxvY2F0aW9uICE9IG51bGwgJiYgU3lzdGVtLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfQ0FDSEUpID09IG51bGwpCi0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSwgYnVuZGxlTG9jYXRpb24udG9TdHJpbmcoKSk7Ci0KLQkJLy9zdGFydCB1cCBwMgotCQl0cnkgewotCQkJSW5zdGFsbGVyQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiKS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZmFpbChNZXNzYWdlcy5BcHBfRmFpbGVkU3RhcnQsIGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0b3AoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vbm90ZSB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQKLQkJSW5zdGFsbEFkdmlzb3IgdGVtcENvbnRleHQgPSBhZHZpc29yOwotCQlpZiAodGVtcENvbnRleHQgIT0gbnVsbCkgewotCQkJdGVtcENvbnRleHQuc3RvcCgpOwotCQkJYWR2aXNvciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsRGVzY3JpcHRpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTBmODI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci5JbnN0YWxsRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyBpbnN0YWxsIGRlc2NyaXB0aW9ucyBmcm9tIGEgc3RyZWFtLgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbERlc2NyaXB0aW9uUGFyc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BR0VOVF9MT0NBVElPTiA9ICJlY2xpcHNlLnAyLmFnZW50TG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVJUSUZBQ1RfUkVQT1NJVE9SWSA9ICJlY2xpcHNlLnAyLmFydGlmYWN0cyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JVTkRMRV9MT0NBVElPTiA9ICJlY2xpcHNlLnAyLmJ1bmRsZUxvY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5TVEFMTF9MT0NBVElPTiA9ICJlY2xpcHNlLnAyLmluc3RhbGxMb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lTX0FVVE9fU1RBUlQgPSAiZWNsaXBzZS5wMi5hdXRvU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MQVVOQ0hFUl9OQU1FID0gImVjbGlwc2UucDIubGF1bmNoZXJOYW1lIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUVUQURBVEFfUkVQT1NJVE9SWSA9ICJlY2xpcHNlLnAyLm1ldGFkYXRhIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPRklMRV9OQU1FID0gImVjbGlwc2UucDIucHJvZmlsZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ST09UX0lEID0gImVjbGlwc2UucDIucm9vdElkIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUk9PVF9WRVJTSU9OID0gImVjbGlwc2UucDIucm9vdFZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIGFuIGluc3RhbGwgZGVzY3JpcHRpb24gdGhhdCBpcyBzdG9yZWQgaW4gYSBwcm9wZXJ0aWVzIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIGxvYWQgdGhlIGluc3RhbGwgZGVzY3JpcHRpb24gZnJvbS4gVGhlIHN0cmVhbQotCSAqIHdpbGwgYmUgY2xvc2VkIHByaW9yIHRvIHRoaXMgbWV0aG9kIHJldHVybmluZywgd2hldGhlciB0aGUgZGVzY3JpcHRpb24gaXMKLQkgKiByZWFkIHN1Y2Nlc3NmdWxseSBvciBub3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YWxsRGVzY3JpcHRpb24gbG9hZEZyb21Qcm9wZXJ0aWVzKElucHV0U3RyZWFtIHN0cmVhbSwgU3ViTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQoaW4pOwotCQkJSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IEluc3RhbGxEZXNjcmlwdGlvbihwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfUFJPRklMRV9OQU1FKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRBcnRpZmFjdFJlcG9zaXRvcnkobmV3IFVSTChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfQVJUSUZBQ1RfUkVQT1NJVE9SWSkpKTsKLQkJCWRlc2NyaXB0aW9uLnNldE1ldGFkYXRhUmVwb3NpdG9yeShuZXcgVVJMKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9NRVRBREFUQV9SRVBPU0lUT1JZKSkpOwotCQkJZGVzY3JpcHRpb24uc2V0QXV0b1N0YXJ0KEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX0lTX0FVVE9fU1RBUlQpKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMYXVuY2hlck5hbWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX0xBVU5DSEVSX05BTUUpKTsKLQkJCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9JTlNUQUxMX0xPQ0FUSU9OKTsKLQkJCWlmIChsb2NhdGlvblN0cmluZyAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uLnNldEluc3RhbGxMb2NhdGlvbihuZXcgUGF0aChsb2NhdGlvblN0cmluZykpOwotCQkJbG9jYXRpb25TdHJpbmcgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfQUdFTlRfTE9DQVRJT04pOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24uc2V0QWdlbnRMb2NhdGlvbihuZXcgUGF0aChsb2NhdGlvblN0cmluZykpOwotCQkJbG9jYXRpb25TdHJpbmcgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfQlVORExFX0xPQ0FUSU9OKTsKLQkJCWlmIChsb2NhdGlvblN0cmluZyAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uLnNldEJ1bmRsZUxvY2F0aW9uKG5ldyBQYXRoKGxvY2F0aW9uU3RyaW5nKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRSb290SWQocHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX1JPT1RfSUQpKTsKLQkJCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX1JPT1RfVkVSU0lPTik7Ci0JCQlWZXJzaW9uIHZlcnNpb24gPSB2ZXJzaW9uU3RyaW5nID09IG51bGwgPyBudWxsIDogbmV3IFZlcnNpb24odmVyc2lvblN0cmluZyk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRSb290VmVyc2lvbih2ZXJzaW9uKTsKLQotCQkJLy9hbnkgcmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIHByb2ZpbGUgcHJvcGVydGllcwotCQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAocHJvcGVydGllcyk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9QUk9GSUxFX05BTUUpOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucmVtb3ZlKFBST1BfQVJUSUZBQ1RfUkVQT1NJVE9SWSk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9NRVRBREFUQV9SRVBPU0lUT1JZKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX0lTX0FVVE9fU1RBUlQpOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucmVtb3ZlKFBST1BfTEFVTkNIRVJfTkFNRSk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9BR0VOVF9MT0NBVElPTik7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9CVU5ETEVfTE9DQVRJT04pOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucmVtb3ZlKFBST1BfUk9PVF9JRCk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9ST09UX1ZFUlNJT04pOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvZmlsZVByb3BlcnRpZXMocHJvZmlsZVByb3BlcnRpZXMpOwotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJc2FmZUNsb3NlKGluKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKElucHV0U3RyZWFtIGluKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlpbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZSBzZWNvbmRhcnkgZmFpbHVyZSBkdXJpbmcgY2xvc2UKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsVXBkYXRlUHJvZHVjdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZjZDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLklJbnN0YWxsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLkluc3RhbGxEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGlzIG9wZXJhdGlvbiBwZXJmb3JtcyBpbnN0YWxsYXRpb24gb3IgdXBkYXRlIG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSUluc3RhbGxPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRpZmFjdFJlcG9NYW47Ci0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0JcHJpdmF0ZSBJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBJbnN0YWxsRGVzY3JpcHRpb24gaW5zdGFsbERlc2NyaXB0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGwgPSB0cnVlOwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWV0YWRhdGFSZXBvTWFuOwotCXByaXZhdGUgSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnk7Ci0JcHJpdmF0ZSBJU3RhdHVzIHJlc3VsdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHNlcnZpY2VSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEluc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuaW5zdGFsbERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoYXQgdG9wIGxldmVsIGluc3RhbGxhYmxlIHVuaXRzIHNob3VsZCBiZSBpbnN0YWxsZWQgYnkgdGhlIGRpcmVjdG9yCi0JICovCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gY29tcHV0ZVVuaXRzVG9JbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZmluZFVuaXQoaW5zdGFsbERlc2NyaXB0aW9uLmdldFJvb3RJZCgpLCBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0Um9vdFZlcnNpb24oKSl9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgcHJvZmlsZSBpcyBiZWluZyB1cGRhdGVkOyByZXR1cm4gdGhlIHVuaXRzIHRvIHVuaW5zdGFsbCBmcm9tIHRoZSBwcm9maWxlLgotCSAqLwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIGNvbXB1dGVVbml0c1RvVW5pbnN0YWxsKElQcm9maWxlIHApIHsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIHAucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHByb2ZpbGUgaW50byB3aGljaCB1bml0cyB3aWxsIGJlIGluc3RhbGxlZC4KLQkgKi8KLQlwcml2YXRlIElQcm9maWxlIGNyZWF0ZVByb2ZpbGUoKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9maWxlKCk7Ci0JCWlmIChwcm9maWxlID09IG51bGwpIHsKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGluc3RhbGxEZXNjcmlwdGlvbi5nZXRJbnN0YWxsTG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEluc3RhbGxlckFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLCBFbnZpcm9ubWVudEluZm8uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyBlbnYgPSAib3NnaS5vcz0iICsgaW5mby5nZXRPUygpICsgIixvc2dpLndzPSIgKyBpbmZvLmdldFdTKCkgKyAiLG9zZ2kuYXJjaD0iICsgaW5mby5nZXRPU0FyY2goKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfRU5WSVJPTk1FTlRTLCBlbnYpOwotCQkJcHJvcGVydGllcy5wdXRBbGwoaW5zdGFsbERlc2NyaXB0aW9uLmdldFByb2ZpbGVQcm9wZXJ0aWVzKCkpOwotCQkJcHJvZmlsZSA9IHByb2ZpbGVSZWdpc3RyeS5hZGRQcm9maWxlKGdldFByb2ZpbGVJZCgpLCBwcm9wZXJ0aWVzKTsKLQkJfQotCQlyZXR1cm4gcHJvZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgYWN0dWFsIHByb2R1Y3QgaW5zdGFsbCBvciB1cGRhdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvSW5zdGFsbChTdWJNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJlcGFyZU1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCQlwcmVwYXJlQXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JCUlQcm9maWxlIHAgPSBjcmVhdGVQcm9maWxlKCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0b0luc3RhbGwgPSBjb21wdXRlVW5pdHNUb0luc3RhbGwoKTsKLQkJbW9uaXRvci53b3JrZWQoNSk7Ci0KLQkJSVN0YXR1cyBzOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHApOwotCQlpZiAoaXNJbnN0YWxsKSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKE5MUy5iaW5kKE1lc3NhZ2VzLk9wX0luc3RhbGxpbmcsIGluc3RhbGxEZXNjcmlwdGlvbi5nZXRQcm9kdWN0TmFtZSgpKSk7Ci0JCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModG9JbnN0YWxsKTsKLQkJCXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbW9uaXRvci5uZXdDaGlsZCg5MCkpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZChNZXNzYWdlcy5PcF9VcGRhdGluZywgaW5zdGFsbERlc2NyaXB0aW9uLmdldFByb2R1Y3ROYW1lKCkpKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSB0b1VuaW5zdGFsbCA9IGNvbXB1dGVVbml0c1RvVW5pbnN0YWxsKHApOwotCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKHRvVW5pbnN0YWxsKTsKLQkJCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGwpOwotCQkJcyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBtb25pdG9yLm5ld0NoaWxkKDkwKSk7Ci0JCX0KLQkJaWYgKCFzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZXhjZXB0aW9uIG9mIHNldmVyaXR5IGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGZhaWwobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBleGNlcHRpb24gb2Ygc2V2ZXJpdHkgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIENvcmVFeGNlcHRpb24gZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgaW5zdGFsbGFibGUgdW5pdCB3aXRoIHRoZSBnaXZlbiBpZCwgYW5kIG9wdGlvbmFsbHkgdGhlCi0JICogZ2l2ZW4gdmVyc2lvbi4KLQkgKi8KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZmluZFVuaXQoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLk9wX05vSWQpOwotCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCAmJiAhdmVyc2lvbi5lcXVhbHMoVmVyc2lvbi5lbXB0eVZlcnNpb24pKQotCQkJcmFuZ2UgPSBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpOwotCQlRdWVyeSBxdWVyeSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgcmFuZ2UpOwotCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQlJdGVyYXRvciBtYXRjaGVzID0gbWV0YWRhdGFSZXBvTWFuLnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG51bGwpLml0ZXJhdG9yKCk7Ci0JCS8vcGljayB0aGUgbmV3ZXN0IG1hdGNoCi0JCUlJbnN0YWxsYWJsZVVuaXQgbmV3ZXN0ID0gbnVsbDsKLQkJd2hpbGUgKG1hdGNoZXMuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGNhbmRpZGF0ZSA9IChJSW5zdGFsbGFibGVVbml0KSBtYXRjaGVzLm5leHQoKTsKLQkJCWlmIChuZXdlc3QgPT0gbnVsbCB8fCAobmV3ZXN0LmdldFZlcnNpb24oKS5jb21wYXJlVG8oY2FuZGlkYXRlLmdldFZlcnNpb24oKSkgPCAwKSkKLQkJCQluZXdlc3QgPSBjYW5kaWRhdGU7Ci0JCX0KLQkJaWYgKG5ld2VzdCA9PSBudWxsKQotCQkJdGhyb3cgZmFpbChNZXNzYWdlcy5PcF9JVU5vdEZvdW5kICsgaWQpOwotCQlyZXR1cm4gbmV3ZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2ZpbGUgYmVpbmcgaW5zdGFsbGVkIGludG8uCi0JICovCi0JcHJpdmF0ZSBJUHJvZmlsZSBnZXRQcm9maWxlKCkgewotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUoZ2V0UHJvZmlsZUlkKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBwcm9maWxlIHRvIHVzZSBmb3IgaW5zdGFsbC91cGRhdGUgYmFzZWQgb24gdGhpcyBvcGVyYXRpb24ncyBpbnN0YWxsIGRlc2NyaXB0aW9uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb2ZpbGVJZCgpIHsKLQkJSVBhdGggbG9jYXRpb24gPSBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0UHJvZHVjdE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGluc3RhbGwgb3BlcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vIGluc3RhbGwgb3BlcmF0aW9uIGhhcyBiZWVuIHJ1bi4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0U2VydmljZShTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJdGhyb3cgZmFpbChNZXNzYWdlcy5PcF9Ob1NlcnZpY2UgKyBuYW1lKTsKLQkJT2JqZWN0IHNlcnZpY2UgPSBidW5kbGVDb250ZXh0LmdldFNlcnZpY2UocmVmKTsKLQkJaWYgKHNlcnZpY2UgPT0gbnVsbCkKLQkJCXRocm93IGZhaWwoTWVzc2FnZXMuT3BfTm9TZXJ2aWNlSW1wbCArIG5hbWUpOwotCQlzZXJ2aWNlUmVmZXJlbmNlcy5hZGQocmVmKTsKLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSUluc3RhbGxPcGVyYXRpb24jaW5zdGFsbChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpbnN0YWxsKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJU3ViTW9uaXRvciBtb25pdG9yID0gU3ViTW9uaXRvci5jb252ZXJ0KHBtLCBNZXNzYWdlcy5PcF9QcmVwYXJpbmcsIDEwMCk7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXByZUluc3RhbGwoKTsKLQkJCQlpc0luc3RhbGwgPSBnZXRQcm9maWxlKCkgPT0gbnVsbDsKLQkJCQlkb0luc3RhbGwobW9uaXRvcik7Ci0JCQkJcmVzdWx0ID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBpc0luc3RhbGwgPyBNZXNzYWdlcy5PcF9JbnN0YWxsQ29tcGxldGUgOiBNZXNzYWdlcy5PcF9VcGRhdGVDb21wbGV0ZSwgbnVsbCk7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShNZXNzYWdlcy5PcF9DbGVhbnVwKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJcG9zdEluc3RhbGwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBlLmdldFN0YXR1cygpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyB0aGUgcHJvZHVjdCBiZWluZyBpbnN0YWxsZWQKLQkgKiBmb3IgdGhlIGZpcnN0IHRpbWUsIGluIGEgbmV3IHByb2ZpbGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEluc3RhbGwoKSB7Ci0JCXJldHVybiBpc0luc3RhbGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3RJbnN0YWxsKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZVJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU2VydmljZVJlZmVyZW5jZSBzciA9IChTZXJ2aWNlUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlidW5kbGVDb250ZXh0LnVuZ2V0U2VydmljZShzcik7Ci0JCX0KLQkJc2VydmljZVJlZmVyZW5jZXMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlSW5zdGFsbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9vYnRhaW4gcmVxdWlyZWQgc2VydmljZXMKLQkJc2VydmljZVJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZGlyZWN0b3IgPSAoSURpcmVjdG9yKSBnZXRTZXJ2aWNlKElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCQltZXRhZGF0YVJlcG9NYW4gPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIGdldFNlcnZpY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXJ0aWZhY3RSZXBvTWFuID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBnZXRTZXJ2aWNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBnZXRTZXJ2aWNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZUFydGlmYWN0UmVwb3NpdG9yeSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgYXJ0aWZhY3RSZXBvID0gaW5zdGFsbERlc2NyaXB0aW9uLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCQlpZiAoYXJ0aWZhY3RSZXBvICE9IG51bGwpCi0JCQlhcnRpZmFjdFJlcG9NYW4ubG9hZFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZU1ldGFkYXRhUmVwb3NpdG9yeSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgbWV0YWRhdGFSZXBvID0gaW5zdGFsbERlc2NyaXB0aW9uLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCQlpZiAobWV0YWRhdGFSZXBvICE9IG51bGwpCi0JCQltZXRhZGF0YVJlcG9NYW4ubG9hZFJlcG9zaXRvcnkobWV0YWRhdGFSZXBvLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsZXJBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxlckFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2E2NmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxlckFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGVyQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0lOU1RBTExFUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSW5zdGFsbGVyQWN0aXZhdG9yIHBsdWdpbjsKLQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHJpdmF0ZSBQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluID0gbnVsbDsKLQotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWYgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbGxlckFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBJbnN0YWxsZXJBY3RpdmF0b3IoKSB7Ci0JCS8vbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBwYWNrYWdlQWRtaW4uZ2V0QnVuZGxlcyhzeW1ib2xpY05hbWUsIG51bGwpOwotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vUmV0dXJuIHRoZSBmaXJzdCBidW5kbGUgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChidW5kbGVzW2ldLmdldFN0YXRlKCkgJiAoQnVuZGxlLklOU1RBTExFRCB8IEJ1bmRsZS5VTklOU1RBTExFRCkpID09IDApIHsKLQkJCQlyZXR1cm4gYnVuZGxlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBidW5kbGUgY29udGV4dCBmb3IgdGhpcyBidW5kbGUuCi0JICogQHJldHVybiB0aGUgYnVuZGxlIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBhQ29udGV4dDsKLQkJcGx1Z2luID0gdGhpczsKLQkJcGFja2FnZUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udGV4dC51bmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQkJcGFja2FnZUFkbWluID0gbnVsbDsKLQkJcGFja2FnZUFkbWluUmVmID0gbnVsbDsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQ0MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2aXNvcl9DYW5jZWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZpc29yX1ByZXBhcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwX0ZhaWxlZFN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcF9JbnZhbGlkU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBfTGF1bmNoRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcF9MYXVuY2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwX05vSW5zdGFsbExvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcF9Ob1NpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0Jyb3dzZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfQ2FuY2VsQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19DbG9zZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfRXhwbGFpblNoYXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfRXhwbGFpblN0YW5kYWxvbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0luc3RhbGxCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0luc3RhbGxsaW5nUHJvZ3Jlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0xhdW5jaEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfTGF5b3V0R3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0xvY2F0aW9uRmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0xvY2F0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0xvY2F0aW9uUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19Qcm9tcHRTdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfU2VsZWN0TG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX1NoYXJlZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfU2hlbGxUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfU3RhbmRhbG9uZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9DbGVhbnVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX0luc3RhbGxDb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9JbnN0YWxsaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX0lVTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfTm9JZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9Ob1NlcnZpY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfTm9TZXJ2aWNlSW1wbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9QcmVwYXJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfVXBkYXRlQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfVXBkYXRpbmc7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vbm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFjM2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZHZpc29yX0NhbmNlbGVkPUluc3RhbGwgY2FuY2VsZWQKLUFkdmlzb3JfUHJlcGFyaW5nPVByZXBhcmluZyB0byBpbnN0YWxsCi1BcHBfRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGxhdGlvbgotQXBwX0ZhaWxlZFN0YXJ0PVVuYWJsZSB0byBzdGFydCBwcm92aXNpb25pbmcgaW5mcmFzdHJ1Y3R1cmUKLUFwcF9JbnZhbGlkU2l0ZT1JbnZhbGlkIGluc3RhbGwgc2l0ZTogCi1BcHBfTGF1bmNoRmFpbGVkPUZhaWxlZCB0byBsYXVuY2ggdGhlIHByb2R1Y3Q6IAotQXBwX0xhdW5jaGluZz1MYXVuY2hpbmcgezB9Ci1BcHBfTm9JbnN0YWxsTG9jYXRpb249SW5zdGFsbCBmYWlsZWQgYmVjYXVzZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiB3YXMgbm90IHNldAotQXBwX05vU2l0ZT1ObyBpbnN0YWxsIHNpdGUgcHJvdmlkZWQKLURpYWxvZ19Ccm93c2VCdXR0b249JkJyb3dzZS4uLgotRGlhbG9nX0NhbmNlbEJ1dHRvbj0mQ2FuY2VsCi1EaWFsb2dfQ2xvc2VCdXR0b249JkNsb3NlCi1EaWFsb2dfRXhwbGFpblNoYXJlZD1JbiBhIHNoYXJlZCBpbnN0YWxsLCBjb21tb24gY29tcG9uZW50cyBhcmUgc3RvcmVkIHRvZ2V0aGVyLCBhbGxvd2luZyB0aGVtIHRvIGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgcHJvZHVjdHMuCi1EaWFsb2dfRXhwbGFpblN0YW5kYWxvbmU9SW4gYSBzdGFuZC1hbG9uZSBpbnN0YWxsLCBlYWNoIHByb2R1Y3QgaXMgaW5zdGFsbGVkIGluIGl0cyBvd24gZGlyZWN0b3J5IHdpdGhvdXQgYW55IHNoYXJpbmcgYmV0d2VlbiBwcm9kdWN0cwotRGlhbG9nX0luc3RhbGxCdXR0b249Jkluc3RhbGwKLURpYWxvZ19JbnN0YWxsbGluZ1Byb2dyZXNzPUluc3RhbGxpbmcuLi4KLURpYWxvZ19JbnRlcm5hbEVycm9yPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZAotRGlhbG9nX0xhdW5jaEJ1dHRvbj0mTGF1bmNoCi1EaWFsb2dfTGF5b3V0R3JvdXA9TGF5b3V0Ci1EaWFsb2dfTG9jYXRpb25GaWVsZD1Mb2NhdGlvbgotRGlhbG9nX0xvY2F0aW9uTGFiZWw9U2VsZWN0IHRoZSBwcm9kdWN0IGluc3RhbGwgZGlyZWN0b3J5OgotRGlhbG9nX0xvY2F0aW9uUHJvbXB0PVNlbGVjdCB3aGVyZSB5b3Ugd2FudCB7MH0gdG8gYmUgaW5zdGFsbGVkCi1EaWFsb2dfUHJvbXB0U3RhcnQ9SW5zdGFsbCBjb21wbGV0ZS4gRG8geW91IHdhbnQgdG8gc3RhcnQgezB9IGltbWVkaWF0ZWx5PwotRGlhbG9nX1NlbGVjdExvY2F0aW9uPVNlbGVjdCB0aGUgaW5zdGFsbCBsb2NhdGlvbgotRGlhbG9nX1NoYXJlZEJ1dHRvbj0mU2hhcmVkIGluc3RhbGwKLURpYWxvZ19TaGVsbFRpdGxlPUluc3RhbGxlcgotRGlhbG9nX1N0YW5kYWxvbmVCdXR0b249U3RhbmQtJmFsb25lIGluc3RhbGwKLU9wX0NsZWFudXA9U29tZSBmaW5hbCBob3VzZWtlZXBpbmcKLU9wX0luc3RhbGxDb21wbGV0ZT1JbnN0YWxsIGNvbXBsZXRlCi1PcF9JbnN0YWxsaW5nPUluc3RhbGxpbmcgezB9Ci1PcF9JVU5vdEZvdW5kPUluc3RhbGxhYmxlIHVuaXQgbm90IGZvdW5kOiAKLU9wX05vSWQ9SW5zdGFsbGFibGUgdW5pdCBpZCBub3Qgc3BlY2lmaWVkCi1PcF9Ob1NlcnZpY2U9SW5zdGFsbCByZXF1aXJlcyBhIHNlcnZpY2UgdGhhdCBpcyBub3QgYXZhaWxhYmxlOiAKLU9wX05vU2VydmljZUltcGw9SW5zdGFsbCByZXF1aXJlcyBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBub3QgYXZhaWxhYmxlOiAKLU9wX1ByZXBhcmluZz1QcmVwYXJpbmcgdG8gaW5zdGFsbAotT3BfVXBkYXRlQ29tcGxldGU9VXBkYXRlIGNvbXBsZXRlCi1PcF9VcGRhdGluZz1VcGRhdGluZyB7MH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL0luc3RhbGxEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL0luc3RhbGxEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4MDVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci91aS9JbnN0YWxsRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLkluc3RhbGxlckFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci5JSW5zdGFsbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci5JbnN0YWxsRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoZSBpbnN0YWxsIHdpemFyZCB0aGF0IGRyaXZlcyB0aGUgaW5zdGFsbC4gVGhpcyBkaWFsb2cgaXMgdXNlZCBmb3IgdXNlciBpbnB1dAotICogcHJpb3IgdG8gdGhlIGluc3RhbGwsIHByb2dyZXNzIGZlZWRiYWNrIGR1cmluZyB0aGUgaW5zdGFsbCwgYW5kIGRpc3BsYXlpbmcgcmVzdWx0cwotICogYXQgdGhlIGVuZCBvZiB0aGUgaW5zdGFsbC4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxEaWFsb2cgewotCS8qKgotCSAqIEEgcHJvZ3Jlc3MgbW9uaXRvciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFzeW5jaHJvbm91c2x5IHVwZGF0ZXMgdGhlIHByb2dyZXNzIGJhci4KLQkgKi8KLQljbGFzcyBNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0KLQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlLCBydW5uaW5nID0gZmFsc2U7Ci0JCVN0cmluZyBzdWJUYXNrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWRvdWJsZSB0b3RhbFdvcmssIHVzZWRXb3JrOwotCi0JCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IHdvcmspIHsKLQkJCXRvdGFsV29yayA9IHdvcms7Ci0JCQlydW5uaW5nID0gdHJ1ZTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJCXVzZWRXb3JrID0gdG90YWxXb3JrOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotCQkJdXNlZFdvcmsgPSBNYXRoLm1pbih1c2VkV29yayArIHdvcmssIHRvdGFsV29yayk7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQlyZXR1cm4gcmV0dXJuQ29kZSA9PSBDQU5DRUw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCQlyZXR1cm5Db2RlID0gQ0FOQ0VMOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1YlRhc2tOYW1lID0gbmFtZSA9PSBudWxsID8gIiIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXN1YlRhc2tOYW1lID0gbmFtZSA9PSBudWxsID8gIiIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCXZvaWQgdXBkYXRlKCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTaGVsbCB0aGVTaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQkJCWlmICh0aGVTaGVsbCA9PSBudWxsIHx8IHRoZVNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJcHJvZ3Jlc3NTdWJUYXNrLnNldFRleHQoc2hvcnRlbihzdWJUYXNrTmFtZSkpOwotCQkJCQlpZiAocHJvZ3Jlc3NCYXIuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlwcm9ncmVzc0Jhci5zZXRWaXNpYmxlKHJ1bm5pbmcpOwotCQkJCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKDEwMDApOwotCQkJCQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDApOwotCQkJCQlpbnQgdmFsdWUgPSAoaW50KSAodXNlZFdvcmsgLyB0b3RhbFdvcmsgKiAxMDAwKTsKLQkJCQkJaWYgKHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpIDwgdmFsdWUpCi0JCQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQkJCX0KLQotCQkJCXByaXZhdGUgU3RyaW5nIHNob3J0ZW4oU3RyaW5nIHRleHQpIHsKLQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gNjQpCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygwLCAzMCkgKyAiLi4uIiArIHRleHQuc3Vic3RyaW5nKGxlbiAtIDMwLCBsZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLQkJCWludGVybmFsV29ya2VkKHdvcmspOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5jYXBzdWxhdGVzIGEgcmVzdWx0IHBhc3NlZCBmcm9tIGFuIG9wZXJhdGlvbiBydW5uaW5nIGluIGEgYmFja2dyb3VuZAotCSAqIHRocmVhZCB0byB0aGUgVUkgdGhyZWFkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBSZXN1bHQgewotCQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQkJcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBkb25lKCkgewotCQkJZG9uZSA9IHRydWU7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHQpIHsKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlcy5EaWFsb2dfSW50ZXJuYWxFcnJvcjsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW5zdGFsbGVyQWN0aXZhdG9yLlBJX0lOU1RBTExFUiwgbXNnLCB0KTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RvbmUoKSB7Ci0JCQlyZXR1cm4gZG9uZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1dJRFRIID0gMTAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPSyA9IDA7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGVudHM7Ci0JcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247Ci0KLQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQlMYWJlbCBwcm9ncmVzc1N1YlRhc2s7Ci0JTGFiZWwgcHJvZ3Jlc3NUYXNrOwotCi0JaW50IHJldHVybkNvZGUgPSAtMTsKLQotCXByaXZhdGUgQnV0dG9uIHNldHRpbmdzQnJvd3NlOwotCXByaXZhdGUgTGFiZWwgc2V0dGluZ3NFeHBsYWluOwotCXByaXZhdGUgQ29tcG9zaXRlIHNldHRpbmdzR3JvdXA7Ci0JcHJpdmF0ZSBUZXh0IHNldHRpbmdzTG9jYXRpb247Ci0JcHJpdmF0ZSBMYWJlbCBzZXR0aW5nc0xvY2F0aW9uTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gc2V0dGluZ3NTaGFyZWQ7Ci0JcHJpdmF0ZSBCdXR0b24gc2V0dGluZ3NTdGFuZGFsb25lOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB3YWl0aW5nRm9yQ2xvc2UgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIG9wZW5zIGEgcHJvZ3Jlc3MgbW9uaXRvciBkaWFsb2cuCi0JICovCi0JcHVibGljIEluc3RhbGxEaWFsb2coKSB7Ci0JCWNyZWF0ZVNoZWxsKCk7Ci0JCXByb2dyZXNzVGFzayA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULldSQVAgfCBTV1QuTEVGVCk7Ci0JCXByb2dyZXNzVGFzay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3JlYXRlSW5zdGFsbFNldHRpbmdzQ29udHJvbHMoKTsKLQkJY3JlYXRlUHJvZ3Jlc3NDb250cm9scygpOwotCQljcmVhdGVCdXR0b25CYXIoKTsKLQotCQlzaGVsbC5sYXlvdXQoKTsKLQkJc2hlbGwub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJyb3dzZVByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaXJEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsKTsKLQkJZGlyRGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuRGlhbG9nX1NlbGVjdExvY2F0aW9uKTsKLQkJU3RyaW5nIGxvY2F0aW9uID0gZGlyRGlhbG9nLm9wZW4oKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXNldHRpbmdzTG9jYXRpb24uc2V0VGV4dChsb2NhdGlvbik7Ci0JCXZhbGlkYXRlSW5zdGFsbFNldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgY29kZSkgewotCQlyZXR1cm5Db2RlID0gY29kZTsKLQkJaWYgKHdhaXRpbmdGb3JDbG9zZSkKLQkJCWNsb3NlKCk7Ci0JCS8vZ3JleSBvdXQgdGhlIGNhbmNlbCBidXR0b24gdG8gaW5kaWNhdGUgdGhlIHJlcXVlc3Qgd2FzIGhlYXJkCi0JCWlmIChjb2RlID09IENBTkNFTCAmJiAhY2FuY2VsQnV0dG9uLmlzRGlzcG9zZWQoKSkKLQkJCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQlzaGVsbCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkJhcigpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkJhciA9IG5ldyBDb21wb3NpdGUoY29udGVudHMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuUklHSFQ7Ci0JCWJ1dHRvbkJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlidXR0b25CYXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJb2tCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEJVVFRPTl9XSURUSCwgU1dULkRFRkFVTFQpOwotCQlva0J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlva0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19JbnN0YWxsQnV0dG9uKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJ1dHRvblByZXNzZWQoT0spOwotCQkJfQotCQl9KTsKLQotCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEJVVFRPTl9XSURUSCwgU1dULkRFRkFVTFQpOwotCQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0NhbmNlbEJ1dHRvbik7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJ1dHRvblByZXNzZWQoQ0FOQ0VMKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgdG8gcHJvbXB0IGZvciB0aGUgYWdlbnQgYW5kIGluc3RhbGwgbG9jYXRpb25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbnN0YWxsU2V0dGluZ3NDb250cm9scygpIHsKLQkJc2V0dGluZ3NHcm91cCA9IG5ldyBDb21wb3NpdGUoY29udGVudHMsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlzZXR0aW5nc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlzZXR0aW5nc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxpc3RlbmVyIHZhbGlkYXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXZhbGlkYXRlSW5zdGFsbFNldHRpbmdzKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy9UaGUgZ3JvdXAgYXNraW5nIGZvciB0aGUgcHJvZHVjdCBpbnN0YWxsIGRpcmVjdG9yeQotCQlHcm91cCBpbnN0YWxsTG9jYXRpb25Hcm91cCA9IG5ldyBHcm91cChzZXR0aW5nc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWluc3RhbGxMb2NhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaW5zdGFsbExvY2F0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWluc3RhbGxMb2NhdGlvbkdyb3VwLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0xvY2F0aW9uRmllbGQpOwotCQlzZXR0aW5nc0xvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoaW5zdGFsbExvY2F0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJc2V0dGluZ3NMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZXR0aW5nc0xvY2F0aW9uTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfTG9jYXRpb25MYWJlbCk7Ci0KLQkJLy9UaGUgc3ViLWdyb3VwIHdpdGggdGV4dCBlbnRyeSBmaWVsZCBhbmQgYnJvd3NlIGJ1dHRvbgotCQlDb21wb3NpdGUgbG9jYXRpb25GaWVsZEdyb3VwID0gbmV3IENvbXBvc2l0ZShpbnN0YWxsTG9jYXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkZpZWxkR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsb2NhdGlvbkZpZWxkR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldHRpbmdzTG9jYXRpb24gPSBuZXcgVGV4dChsb2NhdGlvbkZpZWxkR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJc2V0dGluZ3NMb2NhdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2V0dGluZ3NMb2NhdGlvbi5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB2YWxpZGF0ZUxpc3RlbmVyKTsKLQkJc2V0dGluZ3NCcm93c2UgPSBuZXcgQnV0dG9uKGxvY2F0aW9uRmllbGRHcm91cCwgU1dULlBVU0gpOwotCQlzZXR0aW5nc0Jyb3dzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShCVVRUT05fV0lEVEgsIFNXVC5ERUZBVUxUKSk7Ci0JCXNldHRpbmdzQnJvd3NlLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0Jyb3dzZUJ1dHRvbik7Ci0JCXNldHRpbmdzQnJvd3NlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3NlUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvL0NyZWF0ZSB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwIGFza2luZyBmb3IgdGhlIGtpbmQgb2YgaW5zdGFsbCAoc2hhcmVkIHZzLiBzdGFuZGFsb25lKQotCQlHcm91cCBpbnN0YWxsS2luZEdyb3VwID0gbmV3IEdyb3VwKHNldHRpbmdzR3JvdXAsIFNXVC5OT05FKTsKLQkJaW5zdGFsbEtpbmRHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19MYXlvdXRHcm91cCk7Ci0JCWluc3RhbGxLaW5kR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWluc3RhbGxLaW5kR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzZXR0aW5nc1N0YW5kYWxvbmUgPSBuZXcgQnV0dG9uKGluc3RhbGxLaW5kR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNldHRpbmdzU3RhbmRhbG9uZS5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19TdGFuZGFsb25lQnV0dG9uKTsKLQkJc2V0dGluZ3NTdGFuZGFsb25lLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHZhbGlkYXRlTGlzdGVuZXIpOwotCQlzZXR0aW5nc1N0YW5kYWxvbmUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzZXR0aW5nc1NoYXJlZCA9IG5ldyBCdXR0b24oaW5zdGFsbEtpbmRHcm91cCwgU1dULlJBRElPKTsKLQkJc2V0dGluZ3NTaGFyZWQuc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfU2hhcmVkQnV0dG9uKTsKLQkJc2V0dGluZ3NTaGFyZWQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdmFsaWRhdGVMaXN0ZW5lcik7Ci0JCXNldHRpbmdzRXhwbGFpbiA9IG5ldyBMYWJlbChpbnN0YWxsS2luZEdyb3VwLCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkRFRkFVTFQsIDQwKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2V0dGluZ3NFeHBsYWluLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNldHRpbmdzRXhwbGFpbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19FeHBsYWluU3RhbmRhbG9uZSk7Ci0KLQkJLy9tYWtlIHRoZSBlbnRpcmUgZ3JvdXAgaW52aXNpYmxlIHVudGlsIHdlIGFjdHVhbGx5IG5lZWQgdG8gcHJvbXB0IGZvciBsb2NhdGlvbnMKLQkJc2V0dGluZ3NHcm91cC5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvZ3Jlc3NDb250cm9scygpIHsKLQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoY29udGVudHMsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNNT09USCk7Ci0JCXByb2dyZXNzQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9ncmVzc0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcHJvZ3Jlc3NTdWJUYXNrID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuV1JBUCB8IFNXVC5MRUZUKTsKLQkJcHJvZ3Jlc3NTdWJUYXNrLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTaGVsbCgpIHsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULk1JTiB8IFNXVC5SRVNJWkUpOwotCQlzaGVsbC5zZXRCb3VuZHMoMzAwLCAyMDAsIDYwMCwgNDAwKTsKLQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfU2hlbGxUaXRsZSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJY29udGVudHMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTU7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxNTsKLQkJY29udGVudHMuc2V0TGF5b3V0KGxheW91dCk7Ci0JfQotCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJU2hlbGwgdGhlU2hlbGwgPSBzaGVsbDsKLQkJaWYgKHRoZVNoZWxsID09IG51bGwgfHwgdGhlU2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGVTaGVsbC5nZXREaXNwbGF5KCk7Ci0JfQotCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQXNrcyB0aGUgdXNlciB0byBjbG9zZSB0aGUgZGlhbG9nLCBhbmQgcmV0dXJucyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByb21wdEZvckNsb3NlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcHJvZ3Jlc3NUYXNrLnNldFRleHQobWVzc2FnZSk7Ci0JCXByb2dyZXNzU3ViVGFzay5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmVzc0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJb2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19DbG9zZUJ1dHRvbik7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl3YWl0aW5nRm9yQ2xvc2UgPSB0cnVlOwotCQl3aGlsZSAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9yTGF1bmNoKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXByb2dyZXNzVGFzay5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLkRpYWxvZ19Qcm9tcHRTdGFydCwgZGVzY3JpcHRpb24uZ2V0UHJvZHVjdE5hbWUoKSkpOwotCQlwcm9ncmVzc1N1YlRhc2suc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCW9rQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0xhdW5jaEJ1dHRvbik7Ci0JCW9rQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19DbG9zZUJ1dHRvbik7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl3YWl0aW5nRm9yQ2xvc2UgPSB0cnVlOwotCQl3aGlsZSAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCXJldHVybiByZXR1cm5Db2RlID09IE9LOwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgZm9yIHRoZSBpbnN0YWxsIGxvY2F0aW9uLCBhbmQgd2hldGhlciB0aGUgaW5zdGFsbCBzaG91bGQKLQkgKiBiZSBzaGFyZWQgb3Igc3RhbmRhbG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9tcHRGb3JMb2NhdGlvbnMoSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXByb2dyZXNzVGFzay5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLkRpYWxvZ19Mb2NhdGlvblByb21wdCwgZGVzY3JpcHRpb24uZ2V0UHJvZHVjdE5hbWUoKSkpOwotCQlva0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19JbnN0YWxsQnV0dG9uKTsKLQkJb2tCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0NhbmNlbEJ1dHRvbik7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlzZXR0aW5nc0dyb3VwLnNldFZpc2libGUodHJ1ZSk7Ci0JCXZhbGlkYXRlSW5zdGFsbFNldHRpbmdzKCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJcmV0dXJuQ29kZSA9IC0xOwotCQl3aGlsZSAocmV0dXJuQ29kZSA9PSAtMSAmJiBzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKHJldHVybkNvZGUgPT0gQ0FOQ0VMKQotCQkJY2xvc2UoKTsKLQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCXNldEluc3RhbGxTZXR0aW5nc0VuYWJsZW1lbnQoZmFsc2UpOwotCQlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgoc2V0dGluZ3NMb2NhdGlvbi5nZXRUZXh0KCkpOwotCQlkZXNjcmlwdGlvbi5zZXRJbnN0YWxsTG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAoc2V0dGluZ3NTdGFuZGFsb25lLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvL2ZvcmNlIGV2ZXJ5dGhpbmcgdG8gYmUgY28tbG9jYXRlZCByZWdhcmRsZXNzIG9mIHdoYXQgdmFsdWVzIHdlcmUgc2V0IGluIHRoZSBpbnN0YWxsIGRlc2NyaXB0aW9uCi0JCQlkZXNjcmlwdGlvbi5zZXRBZ2VudExvY2F0aW9uKGxvY2F0aW9uLmFwcGVuZCgicDIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlc2NyaXB0aW9uLnNldEJ1bmRsZUxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZXNjcmlwdGlvbi5nZXRBZ2VudExvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbi5zZXRBZ2VudExvY2F0aW9uKG5ldyBQYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikpLmFwcGVuZCgiLnAyLyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvL3VzZSBidW5kbGUgcG9vbCBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gaW5zdGFsbCBkZXNjcmlwdGlvbgotCQkJLy9ieSBkZWZhdWx0IHRoaXMgd2lsbCBiZSBudWxsLCBjYXVzaW5nIHRoZSBidW5kbGUgcG9vbCB0byBiZSBuZXN0ZWQgaW4gdGhlIGFnZW50IGxvY2F0aW9uCi0JCX0KLQkJb2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcnVucyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGluIHRoZSBjb250ZXh0IG9mIGEgcHJvZ3Jlc3MgZGlhbG9nLgotCSAqIFRoZSBkaWFsb2cgaXMgb3BlbmVkIGF1dG9tYXRpY2FsbHkgcHJpb3IgdG8gc3RhcnRpbmcgdGhlIG9wZXJhdGlvbiwgYW5kIGNsb3NlZAotCSAqIGF1dG9tYXRpY2FsbHkgdXBvbiBjb21wbGV0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4gVGhlIG9wZXJhdGlvbiB3aWxsIGJlCi0JICogZXhlY3V0ZWQgb3V0c2lkZSB0aGUgVUkgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiB0byBydW4KLQkgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihmaW5hbCBJSW5zdGFsbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJZmluYWwgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0LnNldFN0YXR1cyhvcGVyYXRpb24uaW5zdGFsbChuZXcgTW9uaXRvcigpKSk7Ci0JCQkJfSBjYXRjaCAoVGhyZWFkRGVhdGggdCkgewotCQkJCQkvL211c3QgcmV0aHJvdyBvciB0aGUgdGhyZWFkIHdvbid0IGRpZQotCQkJCQl0aHJvdyB0OwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkgewotCQkJCQlyZXN1bHQuZmFpbGVkKHQpOwotCQkJCX0gY2F0Y2ggKEVycm9yIHQpIHsKLQkJCQkJcmVzdWx0LmZhaWxlZCh0KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQkJCS8vZW5zdXJlIGFsbCBldmVudHMgZnJvbSB0aGUgb3BlcmF0aW9uIGhhdmUgcnVuCi0JCQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0LmRvbmUoKTsKLQkJCQkJLy93YWtlIHRoZSBldmVudCBsb29wCi0JCQkJCWlmIChkaXNwbGF5ICE9IG51bGwpCi0JCQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXdhaXRpbmdGb3JDbG9zZSA9IGZhbHNlOwotCQlwcm9ncmVzc1Rhc2suc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfSW5zdGFsbGxpbmdQcm9ncmVzcyk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19DYW5jZWxCdXR0b24pOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQl3aGlsZSAoIXJlc3VsdC5pc0RvbmUoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LmdldFN0YXR1cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnN0YWxsU2V0dGluZ3NFbmFibGVtZW50KGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0dGluZ3NMb2NhdGlvbi5zZXRFbmFibGVkKHZhbHVlKTsKLQkJc2V0dGluZ3NTaGFyZWQuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCXNldHRpbmdzU3RhbmRhbG9uZS5zZXRFbmFibGVkKHZhbHVlKTsKLQkJc2V0dGluZ3NHcm91cC5zZXRFbmFibGVkKHZhbHVlKTsKLQkJc2V0dGluZ3NFeHBsYWluLnNldEVuYWJsZWQodmFsdWUpOwotCQlzZXR0aW5nc0Jyb3dzZS5zZXRFbmFibGVkKHZhbHVlKTsKLQkJc2V0dGluZ3NMb2NhdGlvbkxhYmVsLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKHByb2dyZXNzVGFzayAhPSBudWxsICYmICFwcm9ncmVzc1Rhc2suaXNEaXNwb3NlZCgpKQotCQkJcHJvZ3Jlc3NUYXNrLnNldFRleHQobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoYXQgdGhlIHVzZXIgaGFzIGNvcnJlY3RseSBlbnRlcmVkIGFsbCByZXF1aXJlZCBpbnN0YWxsIHNldHRpbmdzLgotCSAqLwotCXZvaWQgdmFsaWRhdGVJbnN0YWxsU2V0dGluZ3MoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IHNldHRpbmdzU3RhbmRhbG9uZS5nZXRTZWxlY3Rpb24oKSB8fCBzZXR0aW5nc1NoYXJlZC5nZXRTZWxlY3Rpb24oKTsKLQkJZW5hYmxlZCAmPSBQYXRoLlJPT1QuaXNWYWxpZFBhdGgoc2V0dGluZ3NMb2NhdGlvbi5nZXRUZXh0KCkpOwotCQlpZiAoZW5hYmxlZCkgewotCQkJLy9tYWtlIHN1cmUgdGhlIGluc3RhbGwgbG9jYXRpb24gaXMgYW4gYWJzb2x1dGUgcGF0aAotCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzZXR0aW5nc0xvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQllbmFibGVkICY9IGxvY2F0aW9uLmlzQWJzb2x1dGUoKTsKLQkJfQotCQlva0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCWlmIChzZXR0aW5nc1N0YW5kYWxvbmUuZ2V0U2VsZWN0aW9uKCkpCi0JCQlzZXR0aW5nc0V4cGxhaW4uc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfRXhwbGFpblN0YW5kYWxvbmUpOwotCQllbHNlCi0JCQlzZXR0aW5nc0V4cGxhaW4uc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfRXhwbGFpblNoYXJlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL1NXVEluc3RhbGxBZHZpc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci91aS9TV1RJbnN0YWxsQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzYwNjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL1NXVEluc3RhbGxBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogSW5zdGFsbCBjb250ZXh0IHRoYXQgY3JlYXRlcyBhIHNpbXBsZSBTV1QtYmFzZWQgVUkgYW5kIGludGVyYWN0cyB3aXRoIGEgdXNlci4KLSAqLwotcHVibGljIGNsYXNzIFNXVEluc3RhbGxBZHZpc29yIGV4dGVuZHMgSW5zdGFsbEFkdmlzb3IgewotCXByaXZhdGUgSW5zdGFsbERpYWxvZyBkaWFsb2c7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOwotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybUluc3RhbGwoSUluc3RhbGxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBkaWFsb2cucnVuKG9wZXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEluc3RhbGxEZXNjcmlwdGlvbiBwcmVwYXJlSW5zdGFsbERlc2NyaXB0aW9uKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlpZiAoZGVzY3JpcHRpb24uZ2V0SW5zdGFsbExvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCWRpYWxvZy5wcm9tcHRGb3JMb2NhdGlvbnMoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9yTGF1bmNoKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlyZXR1cm4gZGlhbG9nLnByb21wdEZvckxhdW5jaChkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCW1lc3NhZ2UgPSBNZXNzYWdlcy5BZHZpc29yX0NhbmNlbGVkOwotCQl9IGVsc2UgewotCQkJbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZGlhbG9nLnByb21wdEZvckNsb3NlKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHN0b3BwZWQgfHwgc3RhcnRlZCkKLQkJCXJldHVybjsKLQkJc3RhcnRlZCA9IHRydWU7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWRpYWxvZyA9IG5ldyBJbnN0YWxsRGlhbG9nKCk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkFkdmlzb3JfUHJlcGFyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHN0b3BwZWQgfHwgIXN0YXJ0ZWQpCi0JCQlyZXR1cm47Ci0JCXN0b3BwZWQgPSB0cnVlOwotCQlmaW5hbCBJbnN0YWxsRGlhbG9nIGFjdGl2ZURpYWxvZyA9IGRpYWxvZzsKLQkJaWYgKGFjdGl2ZURpYWxvZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL2NsZWFyIHRoZSB3aW5kb3cgbm93LCBzbyB0aGUgcmVmZXJlbmNlIGlzIGdvbmUgbm8gbWF0dGVyIHdoYXQgaGFwcGVucyBkdXJpbmcgY2xlYW51cAotCQlkaWFsb2cgPSBudWxsOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBhY3RpdmVEaWFsb2cuZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhY3RpdmVEaWFsb2cuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSUluc3RhbGxPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvaW5zdGFsbGVyL0lJbnN0YWxsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZGQ5YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSUluc3RhbGxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBpbnN0YWxsLiBUaGlzIGludGVyZmFjZSBleGlzdHMgdG8gYWxsb3cKLSAqIHRoZSBpbnN0YWxsIGFkdmlzb3IgdG8gYWN0IGFzIHRoZSBydW5uYWJsZSBjb250ZXh0IGZvciB0aGUgaW5zdGFsbCwgaGFuZGxpbmcKLSAqIHByb2dyZXNzIG1vbml0b3JpbmcgYW5kIGNhbmNlbGF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbE9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGluc3RhbGwuCi0JICogPHA+Ci0JICogVGhlIHByb3ZpZGVkIG1vbml0b3IgY2FuIGJlIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCByZXNwb25kIHRvIAotCSAqIGNhbmNlbGxhdGlvbi4gIElmIHRoZSBwcm9ncmVzcyBtb25pdG9yIGhhcyBiZWVuIGNhbmNlbGVkLCB0aGUgam9iCi0JICogc2hvdWxkIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGF0IHRoZSBlYXJsaWVzdCBjb252ZW5pZW5jZSBhbmQgcmV0dXJuIGEgcmVzdWx0Ci0JICogc3RhdHVzIG9mIHNldmVyaXR5IHtAbGluayBJU3RhdHVzI0NBTkNFTH0uICBUaGUgc2luZ2xldG9uCi0JICogY2FuY2VsIHN0YXR1cyB7QGxpbmsgU3RhdHVzI0NBTkNFTF9TVEFUVVN9IGNhbiBiZSB1c2VkIGZvcgotCSAqIHRoaXMgcHVycG9zZS4gIFRoZSBtb25pdG9yIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW52b2NhdGlvbgotCSAqIG9mIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRvIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBhbmQKLQkgKiByZXNwb25kaW5nIHRvIGNhbmNlbGF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcKLQkgKiBhbmQgY2FuY2VsYXRpb24gYXJlIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gcmVzdWx0aW5nIHN0YXR1cyBvZiB0aGUgcnVuLiBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElTdGF0dXMgaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZWFjYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFRoZSBpbnN0YWxsIGFkdmlzb3IgaGVscHMgdG8gbWFrZSBkZWNpc2lvbnMgZHVyaW5nIGluc3RhbGwsIGFuZCBpcyB0aGUgY29uZHVpdAotICogZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBhbmQgcmVzdWx0cyBiYWNrIHRvIGFuIGVuZCB1c2VyIG9yIGxvZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEluc3RhbGxBZHZpc29yIHsKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgYWN0dWFsIGluc3RhbGwuIFRoZSBhZHZpc29yIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBwcm9ncmVzcwotCSAqIG1vbml0b3JpbmcgYW5kIGNhbmNlbGF0aW9uLiBUaGUgYWR2aXNvciBtYXkgcGVyZm9ybSB0aGUgaW5zdGFsbCBpbgotCSAqIGFub3RoZXIgdGhyZWFkLCBidXQgbXVzdCBibG9jayB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgdGhlIGluc3RhbGwKLQkgKiBjb21wbGV0ZXMuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgaW5zdGFsbCBvcGVyYXRpb24gdG8gcnVuCi0JICogQHJldHVybiBJU3RhdHVzIFRoZSByZXN1bHQgb2YgdGhlIGluc3RhbGwgb3BlcmF0aW9uLiBUaGlzIGlzIHR5cGljYWxseQotCSAqIGp1c3QgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgSUluc3RhbGxPcGVyYXRpb24jaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yKX0sCi0JICogYnV0IHRoZSBhZHZpc29yIG1heSBhbHRlciB0aGUgcmVzdWx0IHN0YXR1cyBpZiBkZXNpcmVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHBlcmZvcm1JbnN0YWxsKElJbnN0YWxsT3BlcmF0aW9uIG9wZXJhdGlvbik7Ci0KLQkvKioKLQkgKiBBbGxvd3MgdGhlIGFkdmlzb3IgdG8gbW9kaWZ5IG9yIGZpbGwgaW4gbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24uICAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgaW5zdGFsbCBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gVGhlIGluc3RhbGwgZGVzY3JpcHRpb24gdG8gYmUgdXNlZCBmb3IgdGhlIGluc3RhbGwuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBzaG91bGQgYmUgY2FuY2VsZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEluc3RhbGxEZXNjcmlwdGlvbiBwcmVwYXJlSW5zdGFsbERlc2NyaXB0aW9uKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBQcm9tcHRzIGZvciB3aGV0aGVyIHRoZSBpbnN0YWxsZWQgYXBwbGljYXRpb24gc2hvdWxkIGJlIGxhdW5jaGVkIGltbWVkaWF0ZWx5LgotCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBpbnN0YWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCBpbnN0YWxsIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvZHVjdCBzaG91bGQgYmUgbGF1bmNoZWQsIGFuZCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHByb21wdEZvckxhdW5jaChJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogUmVwb3J0cyBzb21lIHJlc3VsdCBpbmZvcm1hdGlvbiB0byB0aGUgY29udGV4dC4gIFRoZSBzdGF0dXMgbWF5IGJlCi0JICogaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGFuIGVycm9yLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlc3VsdChJU3RhdHVzIHN0YXR1cyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgaW5zdGFsbCBhZHZpc29yLiAgVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IAotCSAqIG90aGVyIG1ldGhvZHMgb24gdGhlIGFkdmlzb3IgYXJlIGNhbGxlZC4gIFN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgdGhpcwotCSAqIG1ldGhvZCBhcmUgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydCgpOwotCi0JLyoqCi0JICogU3RvcHMgdGhlIGluc3RhbGwgYWR2aXNvci4gVGhlIGFkdmlzb3IgYmVjb21lcyBpbnZhbGlkIGFmdGVyIGl0IGhhcyBiZWVuCi0JICogc3RvcHBlZDsgYSBzdG9wcGVkIGFkdmlzb3IgY2Fubm90IGJlIHJlc3RhcnRlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2luc3RhbGxlci9JbnN0YWxsRGVzY3JpcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTlmZTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBBbiBpbnN0YWxsIGluZm9ybWF0aW9uIGNhcHR1cmVzIGFsbCB0aGUgZGF0YSBuZWVkZWQgdG8gcGVyZm9ybSBhIHByb2R1Y3QgaW5zdGFsbC4KLSAqIFRoaXMgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gd2hlcmUgdGhlIGluc3RhbGxlZCBwcm9kdWN0IGNvbWVzIGZyb20sIHdoYXQgd2lsbAotICogYmUgaW5zdGFsbGVkLCBhbmQgd2hlcmUgaXQgd2lsbCBiZSBpbnN0YWxsZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsRGVzY3JpcHRpb24gewotCXByaXZhdGUgVVJMIGFydGlmYWN0UmVwbzsKLQlwcml2YXRlIElQYXRoIGluc3RhbGxMb2NhdGlvbiwgYWdlbnRMb2NhdGlvbiwgYnVuZGxlTG9jYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGlzQXV0b1N0YXJ0OwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyTmFtZTsKLQlwcml2YXRlIFVSTCBtZXRhZGF0YVJlcG87Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdElkOwotCXByaXZhdGUgVmVyc2lvbiByb290VmVyc2lvbjsKLQlwcml2YXRlIGZpbmFsIE1hcCBwcm9maWxlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgSW5zdGFsbERlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMucHJvZHVjdE5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHAyIGFnZW50IGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZQotCSAqIHRoZSBkZWZhdWx0IGFnZW50IGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRBZ2VudExvY2F0aW9uKCkgewotCQlyZXR1cm4gYWdlbnRMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byBpbnN0YWxsIGZyb20KLQkgKiBAcmV0dXJuIGFuIGFydGlmYWN0IHJlcG9zaXRvcnkgVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVuZGxlIHBvb2wgbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogaW5kaWNhdGUgdGhlIGRlZmF1bHQgYnVuZGxlIHBvb2wgbG9jYXRpb24uCi0JICovCi0JcHVibGljIElQYXRoIGdldEJ1bmRsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gYnVuZGxlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gbG9jYXRpb24gdG8gaW5zdGFsbCBpbnRvLgotCSAqIEByZXR1cm4gYSBsb2NhbCBmaWxlIHN5c3RlbSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXJldHVybiBpbnN0YWxsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCdzIGxhdW5jaGVyIGV4ZWN1dGFibGUKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBsYXVuY2hlciBleGVjdXRhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hlck5hbWUoKSB7Ci0JCXJldHVybiBsYXVuY2hlck5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgdG8gaW5zdGFsbCBmcm9tCi0JICogQHJldHVybiBhIG1ldGFkYXRhIHJlcG9zaXRvcnkgVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNZXRhZGF0YVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBtZXRhZGF0YVJlcG87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvZmlsZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGluc3RhbGwuCi0JICovCi0JcHVibGljIE1hcCBnZXRQcm9maWxlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHByb2ZpbGVQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGlzIGluc3RhbGwuCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9kdWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgcm9vdCBpbnN0YWxsYWJsZSB1bml0Ci0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJvb3QgaW5zdGFsbGFibGUgdW5pdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkKCkgewotCQlyZXR1cm4gcm9vdElkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHJvb3QgaW5zdGFsbGFibGUgdW5pdAotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHJvb3QgaW5zdGFsbGFibGUgdW5pdAotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFJvb3RWZXJzaW9uKCkgewotCQlyZXR1cm4gcm9vdFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnN0YWxsZWQgcHJvZHVjdCBzaG91bGQgYmUgc3RhcnRlZCB1cG9uIHN1Y2Nlc3NmdWwKLQkgKiBpbnN0YWxsLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2R1Y3Qgc2hvdWxkIGJlIHN0YXJ0ZWQgdXBvbiBzdWNjZXNzZnVsCi0JICogaW5zdGFsbCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9TdGFydCgpIHsKLQkJcmV0dXJuIGlzQXV0b1N0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFnZW50TG9jYXRpb24oSVBhdGggYWdlbnRMb2NhdGlvbikgewotCQl0aGlzLmFnZW50TG9jYXRpb24gPSBhZ2VudExvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0UmVwb3NpdG9yeShVUkwgcmVwb3NpdG9yeSkgewotCQl0aGlzLmFydGlmYWN0UmVwbyA9IHJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXV0b1N0YXJ0KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5pc0F1dG9TdGFydCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZUxvY2F0aW9uKElQYXRoIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCXRoaXMuYnVuZGxlTG9jYXRpb24gPSBidW5kbGVMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsTG9jYXRpb24oSVBhdGggbG9jYXRpb24pIHsKLQkJdGhpcy5pbnN0YWxsTG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hlck5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5sYXVuY2hlck5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVwb3NpdG9yeShVUkwgcmVwb3NpdG9yeSkgewotCQl0aGlzLm1ldGFkYXRhUmVwbyA9IHJlcG9zaXRvcnk7Ci0JfQotCi0JLyoqCi0JICogU3VwcGxpZXMgYSBzZXQgb2YgcHJvZmlsZSBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHdoZW4gdGhlIHByb2ZpbGUgaXMgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvZmlsZSBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZVByb3BlcnRpZXMoTWFwIHByb3BlcnRpZXMpIHsKLQkJcHJvZmlsZVByb3BlcnRpZXMucHV0QWxsKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RJZChTdHJpbmcgcm9vdCkgewotCQl0aGlzLnJvb3RJZCA9IHJvb3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdFZlcnNpb24oVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXRoaXMucm9vdFZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2EzZTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNjNTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLSNXZWQgQXVnIDI5IDAwOjQ1OjMyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzQwNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jV2VkIEF1ZyAyOSAwMDo0NTozMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhMjcxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBBdWcgMjggMTE6MTk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYmUwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3I7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLnZlcmlmaWVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4OTlhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBKQVIgUHJvY2Vzc29yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvQ29tbWFuZFN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL0NvbW1hbmRTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjUyYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvQ29tbWFuZFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXA7Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tYW5kU3RlcCBpbXBsZW1lbnRzIElQcm9jZXNzU3RlcCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21tYW5kID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSAgUHJvcGVydGllcyBvcHRpb25zID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCi0JcHVibGljIENvbW1hbmRTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBleHRlbnNpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLQkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBleGVjdXRlKFN0cmluZ1tdIGNtZCkgewotCQlyZXR1cm4gZXhlY3V0ZShjbWQsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZXhlY3V0ZShTdHJpbmdbXSBjbWQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJUHJvY2VzcyBwcm9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb2MgPSBydW50aW1lLmV4ZWMoY21kKTsKLQkJCVN0cmVhbVByb2Nlc3NvciBlcnJvclN0cmVhbVByb2Nlc3NvciA9IG5ldyBTdHJlYW1Qcm9jZXNzb3IocHJvYy5nZXRFcnJvclN0cmVhbSgpLCBTdHJlYW1Qcm9jZXNzb3IuU1RERVJSLCB2ZXJib3NlKTsgCi0JCQlTdHJlYW1Qcm9jZXNzb3Igb3V0cHV0U3RyZWFtUHJvY2Vzc29yID0gbmV3IFN0cmVhbVByb2Nlc3Nvcihwcm9jLmdldElucHV0U3RyZWFtKCksIFN0cmVhbVByb2Nlc3Nvci5TVERPVVQsIHZlcmJvc2UpOyAKLQkJCWVycm9yU3RyZWFtUHJvY2Vzc29yLnN0YXJ0KCk7Ci0JCQlvdXRwdXRTdHJlYW1Qcm9jZXNzb3Iuc3RhcnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKHZlcmJvc2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGV4ZWN1dGluZyBjb21tYW5kICIgKyBVdGlscy5jb25jYXQoY21kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgcmVzdWx0ID0gcHJvYy53YWl0Rm9yKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZih2ZXJib3NlKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydGllcyBnZXRPcHRpb25zKCkgewotCQlpZihvcHRpb25zID09IG51bGwpCi0JCQlvcHRpb25zID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB7Ci0JCS8vbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL01haW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkZjcwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3JFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1haW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlstb3B0aW9uIC4uLl0uLi4gaW5wdXQiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXByb2Nlc3NBbGwgICAgIHByb2Nlc3MgYWxsIGphcnMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHdlcmUgcHJldmlvdXNseSBub3JtYWxpemVkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBvbmx5IG5vcm1hbGl6ZWQgamFycyB3aWxsIGJlIHByb2Nlc3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1yZXBhY2sgICAgICAgICBub3JtYWxpemUgamFycyAiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1zaWduIDxjb21tYW5kPiBzaWduIGphcnMgdXNpbmcgPGNvbW1hbmQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItcGFjayAgICAgICAgICAgcGFjayB0aGUgamFycy4gIHBhY2sgYW5kIHJlcGFjayBhcmUgcmVkdW5kYW50IHVubGVzcyIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgIHNpZ24gaXMgYWxzbyBzcGVjaWZpZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItdW5wYWNrICAgICAgICAgdW5wYWNrIHBhY2suZ3ogZmlsZXMuIFVucGFjayBpcyBtdXR1YWxseSBleGNsdXNpdmUiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICB3aXRoIHJlcGFjaywgc2lnbiBhbmQgcGFjay4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItb3V0cHV0RGlyIDxkaXI+ICB0aGUgb3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXZlcmJvc2UgICAgICAgIHZlcmJvc2UgbW9kZSAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucyBwcm9jZXNzQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucyBvcHRpb25zID0gbmV3IEphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1wYWNrIikpIHsvLyROT04tTkxTLTEkCi0JCQkJb3B0aW9ucy5wYWNrID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi11bnBhY2siKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJb3B0aW9ucy51bnBhY2sgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXNpZ24iKSAmJiBpIDwgYXJncy5sZW5ndGggLSAyKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRVc2FnZSgpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJb3B0aW9ucy5zaWduQ29tbWFuZCA9IGFyZ3NbKytpXTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1yZXBhY2siKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJb3B0aW9ucy5yZXBhY2sgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW91dHB1dERpciIpICYmIGkgPCBhcmdzLmxlbmd0aCAtIDIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlvcHRpb25zLm91dHB1dERpciA9IGFyZ3NbKytpXTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi12ZXJib3NlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wdGlvbnMudmVyYm9zZSA9IHRydWU7Ci0JCQl9ICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXByb2Nlc3NBbGwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJb3B0aW9ucy5wcm9jZXNzQWxsID0gdHJ1ZTsKLQkJCX0gCi0JCX0KLQotCQlvcHRpb25zLmlucHV0ID0gbmV3IEZpbGUoYXJnc1tpXSk7Ci0KLQkJU3RyaW5nIHByb2JsZW1NZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIGlucHV0TmFtZSA9IG9wdGlvbnMuaW5wdXQuZ2V0TmFtZSgpOwotCQlpZiAob3B0aW9ucy51bnBhY2spIHsKLQkJCWlmICghSmFyUHJvY2Vzc29yLmNhblBlcmZvcm1VbnBhY2soKSkgewotCQkJCXByb2JsZW1NZXNzYWdlID0gIlRoZSB1bnBhY2syMDAgY29tbWFuZCBjYW5ub3QgYmUgZm91bmQuIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIAlpZiAob3B0aW9ucy5pbnB1dC5pc0ZpbGUoKSAmJiAhaW5wdXROYW1lLmVuZHNXaXRoKCIuemlwIikgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLnBhY2suZ3oiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwcm9ibGVtTWVzc2FnZSA9ICJJbnB1dCBmaWxlIGlzIG5vdCBhIHBhY2suZ3ogZmlsZS4iOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgCWlmIChvcHRpb25zLnBhY2sgfHwgb3B0aW9ucy5yZXBhY2sgfHwgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbU1lc3NhZ2UgPSAiUGFjaywgcmVwYWNrIG9yIHNpZ24gY2Fubm90IGJlIHNwZWNpZmllZCB3aXRoIHVucGFjay4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob3B0aW9ucy5pbnB1dC5pc0ZpbGUoKSAmJiAhaW5wdXROYW1lLmVuZHNXaXRoKCIuemlwIikgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXByb2JsZW1NZXNzYWdlID0gIklucHV0IGZpbGUgaXMgbm90IGEgamFyIGZpbGUuIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlCWlmICgob3B0aW9ucy5wYWNrIHx8IG9wdGlvbnMucmVwYWNrKSAmJiAhSmFyUHJvY2Vzc29yLmNhblBlcmZvcm1QYWNrKCkpIHsKLQkJCQlwcm9ibGVtTWVzc2FnZSA9ICJUaGUgcGFjazIwMCBjb21tYW5kIGNhbiBub3QgYmUgZm91bmQuIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmKHByb2JsZW1NZXNzYWdlICE9IG51bGwpewotCQkJU3lzdGVtLm91dC5wcmludGxuKHByb2JsZW1NZXNzYWdlKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJcHJpbnRVc2FnZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMgb3B0aW9ucyA9IHByb2Nlc3NBcmd1bWVudHMoYXJncyk7Ci0JCWlmIChvcHRpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW5ldyBKYXJQcm9jZXNzb3JFeGVjdXRvcigpLnJ1bkphclByb2Nlc3NvcihvcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1BhY2tTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9QYWNrU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA2ZGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1BhY2tTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUGFja1N0ZXAgZXh0ZW5kcyBDb21tYW5kU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwYWNrQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjYW5QYWNrID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGFyZ3VtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgZXhjbHVzaW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5QYWNrKCkgewotCQlpZiAoY2FuUGFjayAhPSBudWxsKQotCQkJcmV0dXJuIGNhblBhY2suYm9vbGVhblZhbHVlKCk7Ci0KLQkJU3RyaW5nW10gbG9jYXRpb25zID0gVXRpbHMuZ2V0UGFjazIwMENvbW1hbmRzKCJwYWNrMjAwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvY2F0aW9ucyA9PSBudWxsKSB7Ci0JCQljYW5QYWNrID0gQm9vbGVhbi5GQUxTRTsKLQkJCXBhY2tDb21tYW5kID0gbnVsbDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWludCByZXN1bHQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYXRpb25zW2ldID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlyZXN1bHQgPSBleGVjdXRlKG5ldyBTdHJpbmdbXSB7bG9jYXRpb25zW2ldLCAiLVYifSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCXBhY2tDb21tYW5kID0gbG9jYXRpb25zW2ldOwotCQkJCWNhblBhY2sgPSBCb29sZWFuLlRSVUU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQljYW5QYWNrID0gQm9vbGVhbi5GQUxTRTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBQYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKLQkJc3VwZXIob3B0aW9ucywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMob3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIFBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIHZlcmJvc2UpOwotCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMob3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZWN1cnNpb25FZmZlY3QoU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoY2FuUGFjaygpICYmIGVudHJ5TmFtZS5lbmRzV2l0aCgiLmphciIpICYmICFleGNsdXNpb25zLmNvbnRhaW5zKGVudHJ5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGVudHJ5TmFtZSArIFV0aWxzLlBBQ0tFRF9TVUZGSVg7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlpZiAoY2FuUGFjaygpICYmIHBhY2tDb21tYW5kICE9IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgaW5mID0gVXRpbHMuZ2V0RWNsaXBzZUluZihpbnB1dCwgdmVyYm9zZSk7Ci0JCQlpZiAoIXNob3VsZFBhY2soaW5wdXQsIGNvbnRhaW5lcnMsIGluZikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBpbnB1dC5nZXROYW1lKCkgKyBVdGlscy5QQUNLRURfU1VGRklYKTsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gY21kID0gZ2V0Q29tbWFuZChpbnB1dCwgb3V0cHV0RmlsZSwgaW5mLCBjb250YWluZXJzKTsKLQkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHZlcmJvc2UpOwotCQkJCWlmIChyZXN1bHQgIT0gMCAmJiB2ZXJib3NlKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBvdXRwdXRGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFBhY2soRmlsZSBpbnB1dCwgTGlzdCBjb250YWluZXJzLCBQcm9wZXJ0aWVzIGluZikgewotCQkvLzE6IGV4Y2x1ZGUgYnkgY29udGFpbmVycwotCQkvLyBpbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0LCBpdCBjYW4gb3ZlcnJpZGUgb3V0ZXIgamFycwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9wZXJ0aWVzIGNvbnRhaW5lciA9IChQcm9wZXJ0aWVzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoY29udGFpbmVyLmNvbnRhaW5zS2V5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLKSkgewotCQkJCWlmIChCb29sZWFuLnZhbHVlT2YoY29udGFpbmVyLmdldFByb3BlcnR5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQuZ2V0TmFtZSgpICsgIiBpcyBleGNsdWRlZCBmcm9tIHBhY2syMDAgYnkgaXRzIGNvbnRhaW5lcnMuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLzI6IGV4Y2x1ZGVkIGJ5IHNlbGYKLQkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBnZXRTdGVwTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZChGaWxlIGlucHV0LCBGaWxlIG91dHB1dEZpbGUsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGNtZCA9IG51bGw7Ci0JCVN0cmluZyBhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoaW5wdXQsIGluZiwgY29udGFpbmVycyk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBhcmdzID0gVXRpbHMudG9TdHJpbmdBcnJheShhcmd1bWVudHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNtZCA9IG5ldyBTdHJpbmdbMyArIGFyZ3MubGVuZ3RoXTsKLQkJCWNtZFswXSA9IHBhY2tDb21tYW5kOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBjbWQsIDEsIGFyZ3MubGVuZ3RoKTsKLQkJCWNtZFtjbWQubGVuZ3RoIC0gMl0gPSBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCWNtZFtjbWQubGVuZ3RoIC0gMV0gPSBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSBuZXcgU3RyaW5nW10ge3BhY2tDb21tYW5kLCBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKSwgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJndW1lbnRzKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQotCQkJcmV0dXJuIGFyZ3VtZW50czsKLQkJLy8xOiBFeHBsaWNpdGx5IG1hcmtlZCBpbiBvdXIgLmluZiBmaWxlCi0JCWlmIChpbmYgIT0gbnVsbCAmJiBpbmYuY29udGFpbnNLZXkoVXRpbHMuUEFDS19BUkdTKSkgewotCQkJYXJndW1lbnRzID0gaW5mLmdldFByb3BlcnR5KFV0aWxzLlBBQ0tfQVJHUyk7Ci0JCQlyZXR1cm4gYXJndW1lbnRzOwotCQl9Ci0KLQkJLy8yOiBEZWZhdWx0cyBzZXQgaW4gb25lIG9mIG91ciBjb250YWluaW5nIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydGllcyBjb250YWluZXIgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNvbnRhaW5lci5jb250YWluc0tleShVdGlscy5ERUZBVUxUX1BBQ0tfQVJHUykpIHsKLQkJCQlhcmd1bWVudHMgPSBjb250YWluZXIuZ2V0UHJvcGVydHkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpOwotCQkJCXJldHVybiBhcmd1bWVudHM7Ci0JCQl9Ci0JCX0KLQotCQkvLzM6IFNldCBieSBuYW1lIGluIG91dHNpZGUgcGFjay5wcm9wZXJ0aWVzIGZpbGUKLQkJUHJvcGVydGllcyBvcHRpb25zID0gZ2V0T3B0aW9ucygpOwotCQlTdHJpbmcgYXJnc0tleSA9IGlucHV0LmdldE5hbWUoKSArIFV0aWxzLlBBQ0tfQVJHU19TVUZGSVg7Ci0JCWlmIChvcHRpb25zLmNvbnRhaW5zS2V5KGFyZ3NLZXkpKSB7Ci0JCQlhcmd1bWVudHMgPSBvcHRpb25zLmdldFByb3BlcnR5KGFyZ3NLZXkpOwotCQkJcmV0dXJuIGFyZ3VtZW50czsKLQkJfQotCi0JCS8vNDogU2V0IGJ5IGRlZmF1bHQgaW4gb3V0c2lkZSBwYWNrLnByb3BlcnRpZXMgZmlsZQotCQlpZiAob3B0aW9ucy5jb250YWluc0tleShVdGlscy5ERUZBVUxUX1BBQ0tfQVJHUykpIHsKLQkJCWFyZ3VtZW50cyA9IG9wdGlvbnMuZ2V0UHJvcGVydHkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpOwotCQkJcmV0dXJuIGFyZ3VtZW50czsKLQkJfQotCi0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkKLQkJCWFyZ3VtZW50cyA9ICIiOwotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7Ci0JCXJldHVybiAiUGFjayI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RJbmYoRmlsZSBpbnB1dCwgUHJvcGVydGllcyBpbmYsIExpc3QgY29udGFpbmVycykgewotCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbmYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvL2Rvbid0IGJlIHZlcmJvc2UgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIG1hcmsgdGhlIGluZgotCQlib29sZWFuIHYgPSB2ZXJib3NlOwotCQl2ZXJib3NlID0gZmFsc2U7Ci0JCWlmICghc2hvdWxkUGFjayhpbnB1dCwgY29udGFpbmVycywgaW5mKSkgewotCQkJdmVyYm9zZSA9IHY7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdmVyYm9zZSA9IHY7Ci0KLQkJLy9tYXJrIGFzIGNvbmRpdGlvbmVkCi0JCWluZi5wdXQoVXRpbHMuTUFSS19QUk9QRVJUWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vcmVjb3JkIGFyZ3VtZW50cyB1c2VkCi0JCVN0cmluZyBhcmd1bWVudHMgPSBpbmYuZ2V0UHJvcGVydHkoVXRpbHMuUEFDS19BUkdTKTsKLQkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCQlhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoaW5wdXQsIGluZiwgY29udGFpbmVycyk7Ci0JCQlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCgpID4gMCkKLQkJCQlpbmYucHV0KFV0aWxzLlBBQ0tfQVJHUywgYXJndW1lbnRzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1BhY2tVbnBhY2tTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9QYWNrVW5wYWNrU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTcwN2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1BhY2tVbnBhY2tTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIFBhY2tVbnBhY2tTdGVwIGV4dGVuZHMgUGFja1N0ZXAgewotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBudWxsOwotCi0JcHVibGljIFBhY2tVbnBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucykgewotCQlzdXBlcihvcHRpb25zKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBQYWNrVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCB2ZXJib3NlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlbnRyeU5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5QYWNrU3RlcCNwb3N0UHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSwgamF2YS51dGlsLkxpbmtlZExpc3QpCi0JICovCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBwYWNrQ29tbWFuZCAhPSBudWxsICYmIGlucHV0ICE9IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgaW5mID0gVXRpbHMuZ2V0RWNsaXBzZUluZihpbnB1dCwgdmVyYm9zZSk7Ci0JCQlpZiAoIXNob3VsZFBhY2soaW5wdXQsIGNvbnRhaW5lcnMsIGluZikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgInRlbXBfIiArIGlucHV0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gdG1wID0gZ2V0Q29tbWFuZChpbnB1dCwgdGVtcEZpbGUsIGluZiwgY29udGFpbmVycyk7Ci0JCQkJU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1t0bXAubGVuZ3RoICsgMV07Ci0JCQkJY21kWzBdID0gdG1wWzBdOwotCQkJCWNtZFsxXSA9ICItciI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRtcCwgMSwgY21kLCAyLCB0bXAubGVuZ3RoIC0gMSk7Ci0KLQkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHZlcmJvc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gMCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkgewotCQkJCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnksIGlucHV0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaW5hbEZpbGUuZGVsZXRlKCk7Ci0JCQkJCXRlbXBGaWxlLnJlbmFtZVRvKGZpbmFsRmlsZSk7Ci0JCQkJCXJldHVybiBmaW5hbEZpbGU7Ci0JCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyByZXN1bHQgKyAiIHdhcyByZXR1cm5lZCBmcm9tIGNvbW1hbmQ6ICIgKyBVdGlscy5jb25jYXQoY21kKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yLlBhY2tTdGVwI3ByZVByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUsIGphdmEudXRpbC5MaW5rZWRMaXN0KQotCSAqLwotCXB1YmxpYyBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJSZXBhY2siOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvU2lnbkNvbW1hbmRTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9TaWduQ29tbWFuZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0ODgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9TaWduQ29tbWFuZFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU2lnbkNvbW1hbmRTdGVwIGV4dGVuZHMgQ29tbWFuZFN0ZXAgewotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBudWxsOwotCi0JcHVibGljIFNpZ25Db21tYW5kU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIFN0cmluZyBjb21tYW5kKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGNvbW1hbmQsICIuamFyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgU2lnbkNvbW1hbmRTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgU3RyaW5nIGNvbW1hbmQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBjb21tYW5kLCAiLmphciIsIHZlcmJvc2UpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNyZWN1cnNpb25FZmZlY3QoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChlbnRyeU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKQotCQkJcmV0dXJuIGVudHJ5TmFtZTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcHJlUHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3Bvc3RQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChjb21tYW5kICE9IG51bGwgJiYgaW5wdXQgIT0gbnVsbCAmJiBzaG91bGRTaWduKGlucHV0LCBjb250YWluZXJzKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdbXSBjbWQgPSBuZXcgU3RyaW5nW10ge2NvbW1hbmQsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKX07Ci0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIGlucHV0OwotCQkJCX0gZWxzZSBpZiAodmVyYm9zZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2lnbihGaWxlIGlucHV0LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJUHJvcGVydGllcyBpbmYgPSBudWxsOwotCi0JCS8vMTogQXJlIHdlIGV4Y2x1ZGVkIGZyb20gc2lnbmluZyBieSBvdXIgcGFyZW50cz8KLQkJLy9pbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0LCBpdCBvdmVycmlkZXMgb3V0ZXIgamFycwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpbmYgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fU0lHTikpewotCQkJCWlmKEJvb2xlYW4udmFsdWVPZihpbmYuZ2V0UHJvcGVydHkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOX1NJR04pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnB1dC5nZXROYW1lKCkgKyAiaXMgZXhjbHVkZWQgZnJvbSBzaWduaW5nIGJ5IGl0cyBjb250YWluZXJzLiIpOyAvLyROT04tTkxTLTEkIAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8yOiBJcyB0aGlzIGphciBpdHNlbGYgbWFya2VkIGFzIGV4Y2x1ZGU/Ci0JCWluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOwotCQlpZiAoaW5mICE9IG51bGwgJiYgaW5mLmNvbnRhaW5zS2V5KFV0aWxzLk1BUktfRVhDTFVERV9TSUdOKSAmJiBCb29sZWFuLnZhbHVlT2YoaW5mLmdldFByb3BlcnR5KFV0aWxzLk1BUktfRVhDTFVERV9TSUdOKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCWlmICh2ZXJib3NlKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjbHVkaW5nICIgKyBpbnB1dC5nZXROYW1lKCkgKyAiIGZyb20gc2lnbmluZy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJTaWduIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1N0cmVhbVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWI4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgU3RyZWFtUHJvY2Vzc29yIGV4dGVuZHMgVGhyZWFkIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERFUlIgPSAiU1RERVJSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURE9VVCA9ICJTVERPVVQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7Ci0KLQlwdWJsaWMgU3RyZWFtUHJvY2Vzc29yKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXRoaXMuaW5wdXRTdHJlYW0gPSBpczsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pOwotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOwotCQkJCWlmIChzID09IG51bGwpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCWlmIChTVERFUlIuZXF1YWxzKG5hbWUpKQotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG5hbWUgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1VucGFja1N0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1VucGFja1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjODRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9VbnBhY2tTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW5wYWNrU3RlcCBleHRlbmRzIENvbW1hbmRTdGVwIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlBBQ0tFUl9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLlVucGFja2VyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gY2FuVW5wYWNrID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5wYWNrQ29tbWFuZCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuVW5wYWNrKCkgewotCQlpZiAoY2FuVW5wYWNrICE9IG51bGwpCi0JCQlyZXR1cm4gY2FuVW5wYWNrLmJvb2xlYW5WYWx1ZSgpOwotCi0JCVN0cmluZ1tdIGxvY2F0aW9ucyA9IFV0aWxzLmdldFBhY2syMDBDb21tYW5kcygidW5wYWNrMjAwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvY2F0aW9ucyA9PSBudWxsKSB7Ci0JCQljYW5VbnBhY2sgPSBCb29sZWFuLkZBTFNFOwotCQkJdW5wYWNrQ29tbWFuZCA9IG51bGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgcmVzdWx0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2F0aW9uc1tpXSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJcmVzdWx0ID0gZXhlY3V0ZShuZXcgU3RyaW5nW10ge2xvY2F0aW9uc1tpXSwgIi1WIn0pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQl1bnBhY2tDb21tYW5kID0gbG9jYXRpb25zW2ldOwotCQkJCWNhblVucGFjayA9IEJvb2xlYW4uVFJVRTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWNhblVucGFjayA9IEJvb2xlYW4uRkFMU0U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKLQkJc3VwZXIob3B0aW9ucywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBVbnBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIHZlcmJvc2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3JlY3Vyc2lvbkVmZmVjdChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJaWYgKGNhblVucGFjaygpICYmIGVudHJ5TmFtZS5lbmRzV2l0aChVdGlscy5QQUNLRURfU1VGRklYKSkgewotCQkJcmV0dXJuIGVudHJ5TmFtZS5zdWJzdHJpbmcoMCwgZW50cnlOYW1lLmxlbmd0aCgpIC0gVXRpbHMuUEFDS0VEX1NVRkZJWC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcHJlUHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChjYW5VbnBhY2soKSAmJiB1bnBhY2tDb21tYW5kICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZW5kc1dpdGgoVXRpbHMuUEFDS0VEX1NVRkZJWCkpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIFV0aWxzLlBBQ0tFRF9TVUZGSVgubGVuZ3RoKCkpOwotCi0JCQkJRmlsZSB1bnBhY2tlZCA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnksIG5hbWUpOwotCQkJCUZpbGUgcGFyZW50ID0gdW5wYWNrZWQuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmICghcGFyZW50LmV4aXN0cygpKQotCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIG9wdGlvbnMgPSBnZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoaW5wdXQuZ2V0TmFtZSgpICsgIi51bnBhY2suYXJncyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIGNtZCA9IG51bGw7Ci0JCQkJCWlmIChvcHRpb25zICE9IG51bGwpIHsKLQkJCQkJCWNtZCA9IG5ldyBTdHJpbmdbXSB7dW5wYWNrQ29tbWFuZCwgb3B0aW9ucywgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpLCB1bnBhY2tlZC5nZXRDYW5vbmljYWxQYXRoKCl9OwotCQkJCQl9IGVsc2UgewotCQkJCQkJY21kID0gbmV3IFN0cmluZ1tdIHt1bnBhY2tDb21tYW5kLCBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCksIHVucGFja2VkLmdldENhbm9uaWNhbFBhdGgoKX07Ci0JCQkJCX0KLQkJCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwICYmIHZlcmJvc2UpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICh2ZXJib3NlKQotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB1bnBhY2tlZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNwb3N0UHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0ZXBOYW1lKCkgewotCQlyZXR1cm4gIlVucGFjayI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmMjJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIFV0aWxzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0ZJTEVfTkFNRSA9ICJNRVRBLUlORi9lY2xpcHNlLmluZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogUHJvcGVydGllcyBmb3VuZCBpbiBvdXRlciBwYWNrLnByb3BlcnRpZXMgZmlsZQotCSAqLwotCS8vY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgamFycyB0byBleGNsdWRlIGZyb20gc2lnaW5pbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOX0VYQ0xVREVTID0gInNpZ24uZXhjbHVkZXMiOyAvLyROT04tTkxTLTEkCi0JLy9jb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBqYXJzIHRvIGV4bGNsdWRlIGZyb20gcGFja2luZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tfRVhDTFVERVMgPSAicGFjay5leGNsdWRlcyI7IC8vJE5PTi1OTFMtMSQKLQkvL1N1ZmZpeCB1c2VkIHdoZW4gc3BlY2lmeWluZyBhcmd1bWVudHMgdG8gdXNlIHdoZW4gcnVubmluZyBwYWNrMjAwIG9uIGEgamFyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS19BUkdTX1NVRkZJWCA9ICIucGFjay5hcmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIGJvdGggcGFjay5wcm9wZXJ0aWVzIGFuZCBlY2xpcHNlLmluZgotCSAqLwotCS8vCURlZmF1bHQgYXJndW1lbnRzIHRvIHVzZSB3aGVuIHJ1bm5pbmcgcGFjazIwMC4KLQkvLyBBZmZlY3RzIGFsbCBqYXJzIHdoZW4gc3BlY2lmaWVkIGluIHBhY2sucHJvcGVydGllcywgYWZmZWN0cyBjaGlsZHJlbiB3aGVuIHNwZWNpZmllZCBpbiBlY2xpcHNlLmluZgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS19BUkdTID0gInBhY2syMDAuZGVmYXVsdC5hcmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIGVjbGlwc2UuaW5mIGZpbGUKLQkgKi8KLQkvL1RoaXMgamFyIGhhcyBiZWVuIGNvbmRpdGlvbmVkIHdpdGggcGFjazIwMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfUFJPUEVSVFkgPSAicGFjazIwMC5jb25kaXRpb25lZCI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBwcm9jZXNzaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFID0gImphcnByb2Nlc3Nvci5leGNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCS8vRXhjbHVkZSB0aGlzIGphciBmcm9tIHBhY2syMDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfUEFDSyA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZS5wYWNrIjsgLy8kTk9OLU5MUy0xJAotCS8vRXhjbHVkZSB0aGlzIGphciBmcm9tIHNpZ25pbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfU0lHTiA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZS5zaWduIjsgLy8kTk9OLU5MUy0xJAotCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gcHJvY2Vzc2luZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTiA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZS5jaGlsZHJlbiI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIncyBjaGlsZHJlbiBmcm9tIHBhY2syMDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfQ0hJTERSRU5fUEFDSyA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZS5jaGlsZHJlbi5wYWNrIjsgLy8kTk9OLU5MUy0xJAotCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gc2lnbmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTl9TSUdOID0gImphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnNpZ24iOyAvLyROT04tTkxTLTEkCi0JLy9Bcmd1bWVudHMgdXNlZCBpbiBwYWNrMjAwIGZvciB0aGlzIGphcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tfQVJHUyA9ICJwYWNrMjAwLmFyZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLMjAwX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IucGFjazIwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUkUgPSAiQGpyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gIkBwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiQG5vbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLRURfU1VGRklYID0gIi5wYWNrLmd6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9TVUZGSVggPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZUZpbHRlciBKQVJfRklMVEVSID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQlyZXR1cm4gcGF0aG5hbWUuaXNGaWxlKCkgJiYgcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVGaWx0ZXIgUEFDS19HWl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCXJldHVybiBwYXRobmFtZS5pc0ZpbGUoKSAmJiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoSmFyUHJvY2Vzc29yLlBBQ0tFRF9TVUZGSVgpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShPYmplY3Qgc3RyZWFtKSB7Ci0JCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoc3RyZWFtIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pCi0JCQkJCSgoSW5wdXRTdHJlYW0pIHN0cmVhbSkuY2xvc2UoKTsKLQkJCQllbHNlIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBPdXRwdXRTdHJlYW0pCi0JCQkJCSgoT3V0cHV0U3RyZWFtKSBzdHJlYW0pLmNsb3NlKCk7Ci0JCQkJZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgSmFyRmlsZSkKLQkJCQkJKChKYXJGaWxlKSBzdHJlYW0pLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc2V0IG9mIGNvbW1hbmRzIHRvIHRyeSB0byBleGVjdXRlIHBhY2svdW5wYWNrIAotCSAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQsIGVpdGhlciAicGFjazIwMCIgb3IgInVucGFjazIwMCIKLQkgKiBAcmV0dXJuIFN0cmluZyBbXSBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYWNrMjAwQ29tbWFuZHMoU3RyaW5nIGNtZCkgewotCQlTdHJpbmdbXSBsb2NhdGlvbnMgPSBudWxsOwotCQlTdHJpbmcgcHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQQUNLMjAwX1BST1BFUlRZKTsKLQkJU3RyaW5nIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTk9ORS5lcXVhbHMocHJvcCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKEpSRS5lcXVhbHMocHJvcCkpIHsKLQkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7amF2YUhvbWUgKyAiL2Jpbi8iICsgY21kfTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKFBBVEguZXF1YWxzKHByb3ApKSB7Ci0JCQlsb2NhdGlvbnMgPSBuZXcgU3RyaW5nW10ge2NtZH07Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlsb2NhdGlvbnMgPSBuZXcgU3RyaW5nW10ge2phdmFIb21lICsgIi9iaW4vIiArIGNtZCwgY21kfTsgLy8kTk9OLU5MUy0xJCAKLQkJfSBlbHNlIHsKLQkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7cHJvcCArICIvIiArIGNtZH07IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbG9jYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZmVycyBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0byB0aGUgZ2l2ZW4KLQkgKiBvdXRwdXQgc3RyZWFtLiBDbG9zZXMgYm90aCBzdHJlYW1zIGlmIGNsb3NlID09IHRydWUsIHJlZ2FyZGxlc3Mgb2YgZmFpbHVyZS4gCi0JICogRmx1c2hlcyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGlmIGNsb3NlID09IGZhbHNlCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqIEBwYXJhbSBjbG9zZSAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZmVyU3RyZWFtcyhJbnB1dFN0cmVhbSBzb3VyY2UsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgYm9vbGVhbiBjbG9zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc291cmNlID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJZGVzdGluYXRpb24gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pOwotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gLTE7Ci0JCQkJaWYgKChieXRlc1JlYWQgPSBzb3VyY2UucmVhZChidWZmZXIpKSA9PSAtMSkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsb3NlKSB7Ci0JCQkJY2xvc2Uoc291cmNlKTsKLQkJCQljbG9zZShkZXN0aW5hdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3RpbmF0aW9uLmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGFsbCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGZyb20gdGhlIGdpdmVuIHJvb3QgZG93biAoaW5jbHVzaXZlKS4KLQkgKiBSZXR1cm5zIGZhbHNlIGlmIHdlIGNvdWxkIG5vdCBkZWxldGUgc29tZSBmaWxlIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZAotCSAqIGF0IGFueSBwb2ludCBpbiB0aGUgZGVsZXRpb24uCi0JICogRXZlbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGJlc3QgZWZmb3J0IGlzIG1hZGUgdG8gY29udGludWUgZGVsZXRpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyKGphdmEuaW8uRmlsZSByb290KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gY2xlYXJDaGlsZHJlbihyb290KTsKLQkJdHJ5IHsKLQkJCWlmIChyb290LmV4aXN0cygpKQotCQkJCXJlc3VsdCAmPSByb290LmRlbGV0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGFsbCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGZyb20gdGhlIGdpdmVuIHJvb3QgZG93biwgZXhjZXB0IGZvciAKLQkgKiB0aGUgcm9vdCBpdHNlbGYuCi0JICogUmV0dXJucyBmYWxzZSBpZiB3ZSBjb3VsZCBub3QgZGVsZXRlIHNvbWUgZmlsZSBvciBhbiBleGNlcHRpb24gb2NjdXJyZWQKLQkgKiBhdCBhbnkgcG9pbnQgaW4gdGhlIGRlbGV0aW9uLgotCSAqIEV2ZW4gaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBiZXN0IGVmZm9ydCBpcyBtYWRlIHRvIGNvbnRpbnVlIGRlbGV0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGVhckNoaWxkcmVuKGphdmEuaW8uRmlsZSByb290KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaWYgKHJvb3QuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gbGlzdCA9IHJvb3QubGlzdCgpOwotCQkJLy8gZm9yIHNvbWUgdW5rbm93biByZWFzb24sIGxpc3QoKSBjYW4gcmV0dXJuIG51bGwuICAKLQkJCS8vIEp1c3Qgc2tpcCB0aGUgY2hpbGRyZW4gSWYgaXQgZG9lcy4KLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJCQlyZXN1bHQgJj0gY2xlYXIobmV3IGphdmEuaW8uRmlsZShyb290LCBsaXN0W2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRQYWNrRXhjbHVzaW9ucyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0KLQkJU3RyaW5nIHBhY2tFeGNsdWRlcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUEFDS19FWENMVURFUyk7Ci0JCWlmIChwYWNrRXhjbHVkZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gZXhjbHVkZXMgPSB0b1N0cmluZ0FycmF5KHBhY2tFeGNsdWRlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU2V0IHBhY2tFeGNsdXNpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYWNrRXhjbHVzaW9ucy5hZGQoZXhjbHVkZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIHBhY2tFeGNsdXNpb25zOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0U2lnbkV4Y2x1c2lvbnMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQlTdHJpbmcgc2lnbkV4Y2x1ZGVzID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShTSUdOX0VYQ0xVREVTKTsKLQkJaWYgKHNpZ25FeGNsdWRlcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBleGNsdWRlcyA9IHRvU3RyaW5nQXJyYXkoc2lnbkV4Y2x1ZGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlTZXQgc2lnbkV4Y2x1c2lvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCXNpZ25FeGNsdXNpb25zLmFkZChleGNsdWRlc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2lnbkV4Y2x1c2lvbnM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jYXQoU3RyaW5nW10gYXJyYXkpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoYXJyYXlbaV0pOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRvU3RyaW5nQXJyYXkoU3RyaW5nIGlucHV0LCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGlucHV0LCBzZXBhcmF0b3IpOwotCQlpbnQgY291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJcmVzdWx0W2ldID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBlY2xpcHNlLmluZiBmaWxlIGZyb20gdGhlIGdpdmVuIGphci4gIElmIHRoZSBmaWxlIGlzIG5vdCBhIGphciwgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhIGphciwgYnV0IGRvZXMgbm90IGNvbnRhaW4gYW4gZWNsaXBzZS5pbmYgZmlsZSwgYW4gZW1wdHkgUHJvcGVydGllcyBvYmplY3QgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIGphckZpbGUKLQkgKiBAcmV0dXJuIFRoZSBlY2xpcHNlLmluZiBwcm9wZXJ0aWVzIGZvciB0aGUgZ2l2ZW4gamFyIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0RWNsaXBzZUluZihGaWxlIGphckZpbGUsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZiAoamFyRmlsZSA9PSBudWxsIHx8ICFqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBvYnRhaW4gZWNsaXBzZS5pbmYgZHVlIHRvIG1pc3NpbmcgamFyIGZpbGU6ICIgKyBqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmFyRmlsZSBqYXIgPSBudWxsOwotCQl0cnkgewotCQkJamFyID0gbmV3IEphckZpbGUoamFyRmlsZSwgZmFsc2UpOwotCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJLy9ub3QgYSBqYXIsIGRvbid0IGJvdGhlciBsb2dnaW5nIHRoaXMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBvYnRhaW4gZWNsaXBzZS5pbmYgZHVlIHRvIElPRXhjZXB0aW9uOiAiICsgamFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCUphckVudHJ5IG1hcmsgPSBqYXIuZ2V0SmFyRW50cnkoTUFSS19GSUxFX05BTUUpOwotCQkJaWYgKG1hcmsgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGluID0gamFyLmdldElucHV0U3RyZWFtKG1hcmspOwotCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCXByb3BzLmxvYWQoaW4pOwotCQkJCWluLmNsb3NlKCk7Ci0JCQkJcmV0dXJuIHByb3BzOwotCQkJfQotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGYWlsZWQgdG8gb2J0YWluIGVjbGlwc2UuaW5mIGR1ZSB0byBJT0V4Y2VwdGlvbjogIiArIGphckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJY2xvc2UoamFyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRTa2lwSmFyKEZpbGUgaW5wdXQsIGJvb2xlYW4gcHJvY2Vzc0FsbCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCVByb3BlcnRpZXMgaW5mID0gZ2V0RWNsaXBzZUluZihpbnB1dCwgdmVyYm9zZSk7Ci0JCWlmIChpbmYgPT0gbnVsbCkgewotCQkJLy9ub3QgYSBqYXIsIGNvdWxkIGJlIGEgcGFjay5negotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBleGNsdWRlID0gaW5mLmdldFByb3BlcnR5KE1BUktfRVhDTFVERSk7Ci0KLQkJLy93YXMgbWFya2VkIGFzIGV4Y2x1ZGUsIHdlIHNob3VsZCBza2lwCi0JCWlmIChleGNsdWRlICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGUpLmJvb2xlYW5WYWx1ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy9wcm9jZXNzIGFsbCB3YXMgc2V0LCBkb24ndCBza2lwCi0JCWlmIChwcm9jZXNzQWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vb3RoZXJ3aXNlLCB3ZSBza2lwIGlmIG5vdCBtYXJrZWQgbWFya2VkCi0JCVN0cmluZyBtYXJrZWQgPSBpbmYuZ2V0UHJvcGVydHkoTUFSS19QUk9QRVJUWSk7Ci0JCXJldHVybiAhQm9vbGVhbi52YWx1ZU9mKG1hcmtlZCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIGluIHRoZSBvdXRwdXQgc3RyZWFtLiAgV2Ugc3RvcmUgdGhlIHByb3BlcnRpZXMgCi0JICogaW4gc29ydGVkIG9yZGVyIHNvIHRoYXQgdGhlIHNpZ25pbmcgaGFzaCBkb2Vzbid0IGNoYW5nZSBpZiB0aGUgcHJvcGVydGllcyBkaWRuJ3QgY2hhbmdlLiAKLQkgKiBAcGFyYW0gcHJvcHMKLQkgKiBAcGFyYW0gc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzLCBPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCVByaW50U3RyZWFtIHByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKHN0cmVhbSk7Ci0JCXByaW50U3RyZWFtLnByaW50KCIjUHJvY2Vzc2VkIHVzaW5nIEphcnByb2Nlc3NvclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJU29ydGVkTWFwIHNvcnRlZCA9IG5ldyBUcmVlTWFwKHByb3BzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc29ydGVkLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJcHJpbnRTdHJlYW0ucHJpbnQoa2V5KTsKLQkJCXByaW50U3RyZWFtLnByaW50KCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJpbnRTdHJlYW0ucHJpbnQoc29ydGVkLmdldChrZXkpKTsKLQkJCXByaW50U3RyZWFtLnByaW50KCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlwcmludFN0cmVhbS5mbHVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1ppcFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvWmlwUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTFjZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvWmlwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOwotCi0vKioKLSAqIEBhdXRob3IgYW5pZWZlckBjYS5pYm0uY29tCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWmlwUHJvY2Vzc29yIHsKLQotCXByaXZhdGUgSVByb2Nlc3NTdGVwIHNpZ25TdGVwID0gbnVsbDsKLQlwcml2YXRlIElQcm9jZXNzU3RlcCBwYWNrU3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvY2Vzc1N0ZXAgcGFja1VucGFja1N0ZXAgPSBudWxsOwotCXByaXZhdGUgSVByb2Nlc3NTdGVwIHVucGFja1N0ZXAgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOwotCXByaXZhdGUgU2V0IHBhY2tFeGNsdXNpb25zID0gbnVsbDsKLQlwcml2YXRlIFNldCBzaWduRXhjbHVzaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHBhY2tpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc2lnbmluZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiByZXBhY2tpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdW5wYWNraW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0FsbCA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgZGlyKSB7Ci0JCXdvcmtpbmdEaXJlY3RvcnkgPSBkaXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlpZiAod29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKQotCQkJd29ya2luZ0RpcmVjdG9yeSA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaWduQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLnNpZ25pbmcgPSAoY29tbWFuZCAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWNrKGJvb2xlYW4gcGFjaykgewotCQl0aGlzLnBhY2tpbmcgPSBwYWNrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcGFjayhib29sZWFuIHJlcGFjaykgewotCQl0aGlzLnJlcGFja2luZyA9IHJlcGFjazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbnBhY2soYm9vbGVhbiB1bnBhY2spIHsKLQkJdGhpcy51bnBhY2tpbmcgPSB1bnBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKLQkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzQWxsKGJvb2xlYW4gYWxsKSB7Ci0JCXRoaXMucHJvY2Vzc0FsbCA9IGFsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzWmlwKEZpbGUgemlwRmlsZSkgdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodmVyYm9zZSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyAiICsgemlwRmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoemlwRmlsZSk7Ci0JCWluaXRpYWxpemUoemlwKTsKLQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gdW5wYWNraW5nID8gInBhY2suZ3oiIDogIi5qYXIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJRmlsZSB0ZW1wRGlyID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCAidGVtcF8iICsgemlwRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5zZXRWZXJib3NlKHZlcmJvc2UpOwotCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChwcm9jZXNzQWxsKTsKLQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkodGVtcERpci5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQlpZiAodW5wYWNraW5nKSB7Ci0JCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAodW5wYWNrU3RlcCk7Ci0JCX0KLQotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShnZXRXb3JraW5nRGlyZWN0b3J5KCksIHppcEZpbGUuZ2V0TmFtZSgpICsgIi50ZW1wIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBwYXJlbnQgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBPdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcC5lbnRyaWVzKCk7Ci0JCWlmIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmb3IgKFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCi0JCQkJSW5wdXRTdHJlYW0gZW50cnlTdHJlYW0gPSB6aXAuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCi0JCQkJYm9vbGVhbiBwYWNrID0gcGFja2luZyAmJiAhcGFja0V4Y2x1c2lvbnMuY29udGFpbnMobmFtZSk7Ci0JCQkJYm9vbGVhbiBzaWduID0gc2lnbmluZyAmJiAhc2lnbkV4Y2x1c2lvbnMuY29udGFpbnMobmFtZSk7Ci0JCQkJYm9vbGVhbiByZXBhY2sgPSByZXBhY2tpbmcgJiYgIXBhY2tFeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOwotCi0JCQkJRmlsZSBleHRyYWN0ZWRGaWxlID0gbnVsbDsKLQotCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSAmJiAocGFjayB8fCBzaWduIHx8IHJlcGFjayB8fCB1bnBhY2tpbmcpKSB7Ci0JCQkJCWV4dHJhY3RlZEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCBuYW1lKTsKLQkJCQkJcGFyZW50ID0gZXh0cmFjdGVkRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCWlmICghcGFyZW50LmV4aXN0cygpKQotCQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXh0cmFjdGluZyAiICsgZW50cnkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGV4dHJhY3RlZCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOwotCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIGV4dHJhY3RlZCwgdHJ1ZSk7IC8vIHRoaXMgd2lsbCBjbG9zZSB0aGUgc3RyZWFtCi0JCQkJCWVudHJ5U3RyZWFtID0gbnVsbDsKLQotCQkJCQlib29sZWFuIHNraXAgPSBVdGlscy5zaG91bGRTa2lwSmFyKGV4dHJhY3RlZEZpbGUsIHByb2Nlc3NBbGwsIHZlcmJvc2UpOwotCQkJCQlpZiAoc2tpcCkgewotCQkJCQkJLy9za2lwcGluZyB0aGlzIGZpbGUgCi0JCQkJCQllbnRyeVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50cnkuZ2V0TmFtZSgpICsgIiBpcyBub3QgbWFya2VkLCBza2lwcGluZy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHVucGFja2luZykgewotCQkJCQkJCUZpbGUgcmVzdWx0ID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBleHRyYWN0ZWRGaWxlLmdldE5hbWUoKS5sZW5ndGgoKSkgKyByZXN1bHQuZ2V0TmFtZSgpOwotCQkJCQkJCWV4dHJhY3RlZEZpbGUgPSByZXN1bHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChyZXBhY2sgfHwgc2lnbikgewotCQkJCQkJCQlwcm9jZXNzb3IuY2xlYXJQcm9jZXNzU3RlcHMoKTsKLQkJCQkJCQkJaWYgKHJlcGFjaykKLQkJCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChwYWNrVW5wYWNrU3RlcCk7Ci0JCQkJCQkJCWlmIChzaWduKQotCQkJCQkJCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHNpZ25TdGVwKTsKLQkJCQkJCQkJZXh0cmFjdGVkRmlsZSA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAocGFjaykgewotCQkJCQkJCQlwcm9jZXNzb3IuY2xlYXJQcm9jZXNzU3RlcHMoKTsKLQkJCQkJCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHBhY2tTdGVwKTsKLQkJCQkJCQkJRmlsZSBtb2RpZmllZEZpbGUgPSBwcm9jZXNzb3IucHJvY2Vzc0phcihleHRyYWN0ZWRGaWxlKTsKLQkJCQkJCQkJaWYgKG1vZGlmaWVkRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBleHRyYWN0ZWRGaWxlLmdldE5hbWUoKS5sZW5ndGgoKSkgKyBtb2RpZmllZEZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBuZXdOYW1lICsgIiB0byAiICsgb3V0cHV0RmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gbmV3IFppcEVudHJ5KG5ld05hbWUpOwotCQkJCQkJCQkJCWVudHJ5U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtb2RpZmllZEZpbGUpOwotCQkJCQkJCQkJCXppcE91dC5wdXROZXh0RW50cnkoemlwRW50cnkpOwotCQkJCQkJCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhlbnRyeVN0cmVhbSwgemlwT3V0LCBmYWxzZSk7IC8vd2Ugd2FudCB0byBrZWVwIHppcE91dCBvcGVuCi0JCQkJCQkJCQkJZW50cnlTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJCQlVdGlscy5jbGVhcihtb2RpZmllZEZpbGUpOwotCQkJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCVV0aWxzLmNsb3NlKGVudHJ5U3RyZWFtKTsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFByb2JsZW0gcmVhZGluZyAiICsgbW9kaWZpZWRGaWxlLmdldFBhdGgoKSArICIuIik7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJZW50cnlTdHJlYW0gPSBudWxsOwotCQkJCQkJCQl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogIiArIG1vZGlmaWVkRmlsZS5nZXRQYXRoKCkgKyAiIG5vdCBmb3VuZC4iKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChleHRyYWN0ZWRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJZW50cnlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFByb2JsZW0gcmVhZGluZyAiICsgZXh0cmFjdGVkRmlsZS5nZXRQYXRoKCkgKyAiLiIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAodmVyYm9zZSAmJiBlbnRyeVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgIiArIG5hbWUgKyAiIHRvICIgKyBvdXRwdXRGaWxlLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbnRyeVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCVppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KG5hbWUpOwotCQkJCQl0cnkgewotCQkJCQkJemlwT3V0LnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIHppcE91dCwgZmFsc2UpOwotCQkJCQkJemlwT3V0LmNsb3NlRW50cnkoKTsKLQkJCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmKHZlcmJvc2UpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyBuYW1lICsgIiBhbHJlYWR5IGV4aXN0cyBpbiAiICsgb3V0cHV0RmlsZS5nZXROYW1lKCkgKyAiLiAgU2tpcHBpbmcuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZW50cnlTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXh0cmFjdGVkRmlsZSAhPSBudWxsKQotCQkJCQlVdGlscy5jbGVhcihleHRyYWN0ZWRGaWxlKTsKLQkJCQkKLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nICIgKyB6aXBGaWxlLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJemlwT3V0LmNsb3NlKCk7Ci0JCXppcC5jbG9zZSgpOwotCi0JCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCB6aXBGaWxlLmdldE5hbWUoKSk7Ci0JCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCi0JCQlmaW5hbEZpbGUuZGVsZXRlKCk7Ci0JCW91dHB1dEZpbGUucmVuYW1lVG8oZmluYWxGaWxlKTsKLQkJVXRpbHMuY2xlYXIodGVtcERpcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoWmlwRmlsZSB6aXApIHsKLQkJWmlwRW50cnkgZW50cnkgPSB6aXAuZ2V0RW50cnkoInBhY2sucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQlwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJVXRpbHMuY2xvc2Uoc3RyZWFtKTsKLQkJCX0KLQkJfQotCi0JCXBhY2tFeGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMocHJvcGVydGllcyk7Ci0JCXNpZ25FeGNsdXNpb25zID0gVXRpbHMuZ2V0U2lnbkV4Y2x1c2lvbnMocHJvcGVydGllcyk7Ci0KLQkJcGFja1VucGFja1N0ZXAgPSBuZXcgUGFja1VucGFja1N0ZXAocHJvcGVydGllcywgdmVyYm9zZSk7Ci0JCXBhY2tTdGVwID0gbmV3IFBhY2tTdGVwKHByb3BlcnRpZXMsIHZlcmJvc2UpOwotCQlzaWduU3RlcCA9IG5ldyBTaWduQ29tbWFuZFN0ZXAocHJvcGVydGllcywgY29tbWFuZCwgdmVyYm9zZSk7Ci0JCXVucGFja1N0ZXAgPSBuZXcgVW5wYWNrU3RlcChwcm9wZXJ0aWVzLCB2ZXJib3NlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9wYWNrLXJlYWRtZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ZmU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9wYWNrLXJlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICA8dGl0bGU+RWNsaXBzZSB1cGRhdGUgcGFja2luZyB0b29sIHJlYWRtZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5FY2xpcHNlIHVwZGF0ZSBwYWNraW5nIHRvb2w8L2gxPgotCi08aDM+T3ZlcnZpZXc8L2gzPgotVGhlIHVwZGF0ZSBwYWNraW5nIHRvb2wgcHJvY2Vzc2VzIGEgaGllcmFyY2h5IG9mIGFyYml0cmFyaWx5IG5lc3RlZAotSkFScyBhbmQgWklQIGZpbGVzLiAgSXQgaXMgYSBnZW5lcmljIHV0aWxpdHkgdGhhdCBwZXJmb3JtcyBhIGRlcHRoIGZpcnN0IHRyYXZlcnNhbCBvZiAKLWEgbmVzdGVkIGhpZXJhcmNoeSBvZiBaSVBzIGFuZCBKQVJzLCBwZXJmb3JtcyB2YXJpb3VzIGNvbW1hbmRzIG9uCi1lYWNoIG9mIHRoZSBKQVJzIGluIHRoZSBoaWVyYXJjaHksIGFuZCB0aGVuIHJlYnVpbGRzIHRoZSBzYW1lIGhpZXJhcmNoeQotb2YgWklQcyBhbmQgSkFScyBhZ2Fpbi4gIEN1cnJlbnRseSBpdHMgbWFpbiBmdW5jdGlvbnMgYXJlOgotPHVsPgotCTxsaT5QYWNraW5nIEpBUnMgdXNpbmcgdGhlIEphdmEgMS41IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL3Rvb2xkb2NzL3NoYXJlL3BhY2syMDAuaHRtbCI+cGFjazIwMDwvYT4KLQkgY29tbWFuZC48L2xpPgotCSA8bGk+VW5wYWNraW5nIFBBQ0suR1pzIHVzaW5nIHRoZSBKYXZhIDEuNSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy90b29sZG9jcy9zaGFyZS91bnBhY2syMDAuaHRtbCI+dW5wYWNrMjAwPC9hPgotCSBjb21tYW5kLjwvbGk+Ci0JIDxsaT5Ob3JtYWxpemluZyBKQVJzIGZvciBmdXR1cmUgY29tcHJlc3Npb24gYnkgcGFjazIwMC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQKLQkgYnkgcnVubmluZyB0aGUgcGFjazIwMCBjb21tYW5kIHdpdGggdGhlIDx0dD4tLXJlcGFjazwvdHQ+IGNvbW1hbmQgbGluZSBhcmd1bWVudC48L2xpPgotCSA8bGk+U2lnbmluZyBKQVJzIHRvIGFsbG93IGZvciBhdXRoZW50aWNhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIEpBUnMuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5Ci0JIHJ1bm5pbmcgYSBzdXBwbGllZCBjb21tYW5kICh0eXBpY2FsbHkgdGhlIGNvbW1hbmQgd2lsbCBqdXN0IGJlIGEgd3JhcHBlciBhcm91bmQKLQkgdGhlIEphdmEgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL3Rvb2xkb2NzL3dpbjMyL2phcnNpZ25lci5odG1sIj5qYXJzaWduZXI8L2E+IHRvb2wpLjwvbGk+Ci08L3VsPgotVGhlIHBhY2tpbmcgdG9vbCBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgY29udGV4dHM6Ci08dWw+Ci0JPGxpPkR1cmluZyBhIFBERSBidWlsZCwgdG8gcHJlcGFyZSBKQVJzIGZvciB1cGxvYWRpbmcgdG8gYW4gRWNsaXBzZQotCXVwZGF0ZSBzaXRlLiAgSW4gdGhpcyB1c2FnZSwgaXQgaXMgdXNlZCB0byBib3RoIG5vbWFsaXplIEpBUiBjb250ZW50cwotCShwYWNrMjAwIC1yZXBhY2spLCBhbmQgc2lnbiBKQVJzLjwvbGk+Ci0JPGxpPk9uIGFuIHVwZGF0ZSBzaXRlLCB0byBjb252ZXJ0IHRyYWRpdGlvbmFsIEpBUiBjb250ZW50IGludG8gdGhlIAotCWNvbXByZXNzZWQgcGFjazIwMCBmb3JtYXQuPC9saT4KLQk8bGk+RnJvbSBhbiBFY2xpcHNlIGNsaWVudCBhcHBsaWNhdGlvbiBkdXJpbmcgdXBkYXRlLCB0byBjb252ZXJ0Ci0JY29tcHJlc3NlZCBwYWNrMjAwIGZvcm1hdCBjb250ZW50IGludG8gZXhlY3V0YWJsZSBKQVIgZmlsZXMuPC9saT4KLTwvdWw+Ci08aDM+VG9vbCB1c2FnZTwvaDM+Ci1UbyBydW4gdGhlIHBhY2tpbmcgdG9vbCwgeW91IG5lZWQgYSAxLjUgSlJFIGluc3RhbGxlZC4gVGhlIHRvb2wgaXMgcnVuCi1ieSBpbnZva2luZyBKYXZhIGFzIGZvbGxvd3M6Ci0KLTxwcmU+Ci0JamF2YSBqYXJwcm9jZXNzb3IuamFyIFtvcHRpb25zXSBpbnB1dAotPC9wcmU+Ci0KLVdoZXJlIDx0dD5pbnB1dDwvdHQ+IGlzIGVpdGhlciBhIHppcCBmaWxlLCBhIGRpcmVjdG9yeSwgb3IgYSBKQVIgKG9yIGEgcGFjay5neiBmaWxlKS4gQWxsIGZpbGVzIGVuZGluZyAKLWluICIuamFyIiBvciAiLnBhY2suZ3oiIGluIHRoZSBwcm92aWRlZCB6aXAgb3IgZGlyZWN0b3J5IGhpZXJhcmNoeQotd2lsbCBiZSBwcm9jZXNzZWQuIAotVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZDoKLTx1bD4KLTxsaT4tcmVwYWNrIDogTm9ybWFsaXplIHRoZSBqYXJzIHVzaW5nIHBhY2syMDAgPHR0Pi0tcmVwYWNrPC90dD48L2xpPgotPGxpPi1zaWduICZsdDtjbWQmZ3Q7IDogc2lnbnMgdGhlIGphcnMgYnkgZXhlY3V0aW5nIHRoZSBwcm92aWRlZCBjb21tYW5kLiAgCi1UaGUgY29tbWFuZCB3aWxsIGJlIHByb3ZpZGVkIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgd2lsbCBiZSB0aGUgZnVsbCBwYXRoIG9mIHRoZSBKQVIgdG8gcHJvY2Vzcy4KLTwvbGk+Ci08bGk+LXBhY2sgOiBmb3IgZWFjaCBpbnB1dCBpbiBKQVIgZm9ybSwgcHJvZHVjZSBhIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci1pbiBwYWNrZWQgZm9ybS4gIEZvciBhbiBpbnB1dCAiYS5qYXIiLCB0aGUgb3V0cHV0IGlzIGEuamFyLnBhY2suZ3ouICAKLTwvbGk+Ci08bGk+LXVucGFjayA6IGZvciBlYWNoIGlucHV0IGluIHBhY2tlZCBmb3JtLCBwcm9kdWNlIGEgY29ycmVzcG9uZGluZyBvdXRwdXQKLWluIHVucGFja2VkIGZvcm0uICBGb3IgYW4gaW5wdXQgImEuamFyLnBhY2suZ3oiLCB0aGUgb3V0cHV0IGlzICJhLmphciIuIC11bnBhY2sgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggLXJlcGFjaywgLXBhY2sgYW5kIC1zaWduLjwvbGk+Ci08bGk+LW91dHB1dERpciAmbHQ7ZGlyJmd0OyA6IFRoZSBkaXJlY3RvcnkgdG8gcHV0IHRoZSB0b29sJ3Mgb3V0cHV0IGludG8uICBJZiB0aGUgaW5wdXQgd2FzIGEgemlwIGZpbGUsIHRoZW4gYW4gb3V0cHV0IHppcCBmaWxlIHdpbGwgYmUKLWNyZWF0ZWQgY29udGFpbmcgYWxsIHRoZSBvdXRwdXQgZmlsZXMuICBJZiB0aGUgaW5wdXQgd2FzIGEgZGlyZWN0b3J5LCBmb3IgZWFjaCBpbnB1dCBmaWxlIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBvdXRwdXQgZmlsZSBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gQnkgZGVmYXVsdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1c2VkLiAgSWYgdGhlIGlucHV0IGlzIGluIHRoZSBzYW1lCi1kaXJlY3RvcnkgYXMgdGhlIG91dHB1dCwgdGhlIGlucHV0IGZpbGVzIG1heSBiZSBvdmVyd3JpdHRlbi48L2xpPgotPC91bD4KLQotQWRkaXRpb25hbGx5LCB3aGVuIHRoZSBpbnB1dCBpcyBhIHppcCBmaWxlLCBpdCBtYXkgY29udGFpbiBhIGZpbGUgY2FsbGVkCi08dHQ+cGFjay5wcm9wZXJ0aWVzPC90dD4uICBUaGUgcGFjay5wcm9wZXJ0aWVzIGZpbGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci08dWw+Ci08bGk+cGFjay5leGNsdWRlcyA9ICBqYXJOYW1lWywgamFyTmFtZV0qIDogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBKQVJzIHRoYXQgc2hvdWxkIG5vdCBiZSBwYWNrZWQgb3IgcmVwYWNrZWQuCi08L2xpPgotPGxpPnNpZ24uZXhjbHVkZXMgPSAgamFyTmFtZVssIGphck5hbWVdKiA6IEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgSkFScyB0aGF0IHNob3VsZCBub3QgYmUgc2lnbmVkLgotPC9saT4KLTxsaT4mbHQ7amFybmFtZSZndDsucGFjay5hcmdzID0gb3B0aW9uWywgb3B0aW9uXSogOiBBIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgc2hvdWxkCi1iZSBwYXNzZWQgdG8gcGFjazIwMCB3aGVuIHBhY2tpbmcgYW55IGphciB3aXRoIG5hbWUgJmx0O2phcm5hbWUmZ3Q7LgotPC91bD4KLTwvcD4KLTxwPgotPGZvbnQgc2l6ZT0tMT4KLUNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwNi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wPC9hPi4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL3ZlcmlmaWVyL1ZlcmlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzVkODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL3ZlcmlmaWVyL1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IudmVyaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvci5VbnBhY2tTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3JFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIFZlcmlmaWVyIGV4dGVuZHMgSmFyUHJvY2Vzc29yRXhlY3V0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoaXMgdG9vbCB2ZXJpZmllcyB0aGF0IHVucGFja2luZyBhIHBhY2suZ3ogZmlsZSB3aXRoIHRoZSBqYXJwcm9jZXNzb3IgcmVzdWx0cyBpbiBhIHZhbGlkIGphciBmaWxlLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgLWNwIGphcnByb2Nlc3Nvci5qYXIgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci52ZXJpZmllci5WZXJpZmllciAtZGlyIDx3b3JraW5nRGlyZWN0b3J5PiBpbnB1dCBbaW5wdXRdIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1kaXIgOiBzcGVjaWZpZXMgYSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSBwYWNrLmd6IGZpbGVzIGNhbiBiZSB0ZW1wb3JhcmlseSB1bnBhY2tlZCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiaW5wdXQgOiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYW5kL29yIHBhY2suZ3ogZmlsZXMgdG8gdmVyaWZ5LiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmICghVmVyaWZ5U3RlcC5jYW5WZXJpZnkoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBmaW5kIGphcnNpZ25lci4gIFBsZWFzZSBhZGp1c3QgeW91ciBzeXN0ZW0gcGF0aCBvciB1c2UgYSBqZGsuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByaW50VXNhZ2UoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKLQkJU3RyaW5nIFtdIGlucHV0OwotCQkKLQkJaWYoYXJncy5sZW5ndGggPT0gMCkgewotCQkJd29ya2luZ0RpcmVjdG9yeSA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5wdXQgPSBuZXcgU3RyaW5nW10geyIuIn07IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgewotCQkJaW50IGlkeCA9IDA7Ci0JCQlpZihhcmdzWzBdID09ICItaGVscCIpeyAvLyROT04tTkxTLTEkCi0JCQkJcHJpbnRVc2FnZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChhcmdzW2lkeF0gPT0gIi1kaXIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl3b3JraW5nRGlyZWN0b3J5ID0gYXJnc1srK2lkeF07Ci0JCQkJaWR4Kys7Ci0JCQl9IGVsc2UgewotCQkJCXdvcmtpbmdEaXJlY3RvcnkgPSAidGVtcCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaW5wdXQgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoIC0gaWR4XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJncywgaWR4LCBpbnB1dCwgMCwgYXJncy5sZW5ndGggLSBpZHgpOwotCQl9Ci0JCQotCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5KTsKLQkJYm9vbGVhbiBjbGVhciA9IGZhbHNlOwotCQlpZiggd29ya2luZ0Rpci5leGlzdHMoKSkgewotCQkJd29ya2luZ0RpciA9IG5ldyBGaWxlKCB3b3JraW5nRGlyLCAiamFycHJvY2Vzc29yLnZlcmlmaWVyLnRlbXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXIgPSB0cnVlOwotCQl9Ci0JCQotCQlWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcigpOwotCQl2ZXJpZmllci52ZXJpZnkod29ya2luZ0RpciwgaW5wdXQpOwotCQkKLQkJaWYoY2xlYXIpCi0JCQl3b3JraW5nRGlyLmRlbGV0ZU9uRXhpdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZlcmlmeShmaW5hbCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIFN0cmluZ1tdIGlucHV0KSB7Ci0JCVByb3BlcnRpZXMgb3B0aW9ucyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQkJSmFyUHJvY2Vzc29yIHVucGFja2VyID0gbmV3IEphclByb2Nlc3NvcigpOwotCQl1bnBhY2tlci5hZGRQcm9jZXNzU3RlcChuZXcgVW5wYWNrU3RlcChvcHRpb25zLCBmYWxzZSkpOwotCQl1bnBhY2tlci5zZXRXb3JraW5nRGlyZWN0b3J5KHdvcmtpbmdEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCS8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGEgZnVsbCBwcm9jZXNzb3IgdG8gZG8gdGhlIHZlcmlmaWNhdGlvbiB1bmxlc3Mgd2Ugd2FudCB0byB2ZXJpZnkgbmVzdGVkIGphcnMgYXMgd2VsbC4KLQkJICogU28gZm9yIG5vdywgdXNlIGEgY3VzdG9tIHByb2Nlc3NvciB0byBqdXN0IGNhbGwgdGhlIHZlcmlmeSBzdGVwIGRpcmVjdGx5LgotCQkgKi8KLQkJZmluYWwgVmVyaWZ5U3RlcCB2ZXJpZnlTdGVwID0gbmV3IFZlcmlmeVN0ZXAob3B0aW9ucywgZmFsc2UpOwotCQlKYXJQcm9jZXNzb3IgdmVyaWZpZXIgPSBuZXcgSmFyUHJvY2Vzc29yKCkgewotCQkJcHVibGljIEZpbGUgcHJvY2Vzc0phcihGaWxlIGlucHV0RmlsZSkgewotCQkJCXJldHVybiB2ZXJpZnlTdGVwLnBvc3RQcm9jZXNzKGlucHV0RmlsZSwgd29ya2luZ0RpcmVjdG9yeSwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShpbnB1dFtpXSk7Ci0JCQlpZiAoaW5wdXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvY2VzcyhpbnB1dEZpbGUsIFV0aWxzLlBBQ0tfR1pfRklMVEVSLCB0cnVlLCB1bnBhY2tlciwgdmVyaWZpZXIpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVV0aWxzLmNsZWFyKHdvcmtpbmdEaXJlY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL3ZlcmlmaWVyL1ZlcmlmeVN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL3ZlcmlmaWVyL1ZlcmlmeVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2MzY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZnlTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvci52ZXJpZmllcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IuQ29tbWFuZFN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBWZXJpZnlTdGVwIGV4dGVuZHMgQ29tbWFuZFN0ZXAgewotCi0Jc3RhdGljIFN0cmluZyB2ZXJpZnlDb21tYW5kID0gImphcnNpZ25lciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgQm9vbGVhbiBjYW5WZXJpZnkgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblZlcmlmeSgpIHsKLQkJaWYgKGNhblZlcmlmeSAhPSBudWxsKQotCQkJcmV0dXJuIGNhblZlcmlmeS5ib29sZWFuVmFsdWUoKTsKLQotCQlTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb21tYW5kID0gamF2YUhvbWUgKyAiLy4uL2Jpbi9qYXJzaWduZXIiOyAvLyROT04tTkxTLTEkCi0JCWludCByZXN1bHQgPSBleGVjdXRlKG5ldyBTdHJpbmdbXSB7Y29tbWFuZH0pOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJY29tbWFuZCA9ICJqYXJzaWduZXIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBleGVjdXRlKG5ldyBTdHJpbmdbXSB7Y29tbWFuZH0pOwotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQljYW5WZXJpZnkgPSBCb29sZWFuLkZBTFNFOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQl2ZXJpZnlDb21tYW5kID0gY29tbWFuZDsKLQkJY2FuVmVyaWZ5ID0gQm9vbGVhbi5UUlVFOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgVmVyaWZ5U3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCB2ZXJpZnlDb21tYW5kLCAiLmphciIsIHZlcmJvc2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJWZXJpZnkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGNhblZlcmlmeSgpICYmIHZlcmlmeUNvbW1hbmQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCJWZXJpZnlpbmcgIiArIGlucHV0LmdldE5hbWUoKSArICI6ICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1tdIHt2ZXJpZnlDb21tYW5kLCAiLXZlcmlmeSIsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKX07IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHRydWUpOwotCQkJCWlmIChyZXN1bHQgIT0gMCAmJiB2ZXJib3NlKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0lQcm9jZXNzU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc5YzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0lQcm9jZXNzU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgYW5pZWZlckBjYS5pYm0uY29tCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzU3RlcCB7Ci0KLQkvKioKLQkgKiBUaGUgZWZmZWN0IG9mIHRoaXMgcHJvY2Vzc2luZyBzdGVwIGlmIHRoZSBKYXJQcm9jZXNzb3Igd2FzIHRvIHJlY3Vyc2Ugb24gdGhpcyBlbnRyeS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGlzIHN0ZXAgd2lsbCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGVudHJ5LgotCSAqIFJldHVybiB0aGUgbmV3IGVudHJ5TmFtZSBpZiB0aGlzIHN0ZXAgd2lsbCBtb2RpZnkgdGhpcyBlbnRyeSBvbiByZWN1cnNpb24uCi0JICogQHBhcmFtIGVudHJ5TmFtZQotCSAqIEByZXR1cm4gVGhlIG5ldyBlbnRyeSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpOwotCi0JLyoqCi0JICogUGVyZm9ybSBzb21lIHByb2Nlc3Npbmcgb24gdGhlIGlucHV0IGZpbGUgYmVmb3JlIHRoZSBKYXJQcm9jZXNzb3IgY29uc2lkZXJzIHRoZSBlbnRyaWVzIGZvciByZWN1cnNpb24uCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29udGFpbmVycyBpbmYgcHJvcGVydGllcyBmb3IgY29udGFpbmluZyBqYXJzLCBpbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0Ci0JICogQHJldHVybiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIHByb2Nlc3NpbmcKLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCBmaWxlIGFmdGVyIHRoZSBKYXJQcm9jZXNzb3IgcmV0dXJucyBmcm9tIHJlY3Vyc2lvbi4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSB3b3JraW5nRGlyZWN0b3J5Ci0JICogQHBhcmFtIGNvbnRhaW5lcnMgaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqIEByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCi0JICovCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2VzcyBzdGVwCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3Mgc3RlcAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKTsKLQotCS8qKgotCSAqIEFkanVzdCBhbnkgcHJvcGVydGllcyBpbiB0aGUgZWNsaXBzZS5pbmYgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgc3RlcAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSBpbmYKLQkgKiBAcGFyYW0gY29udGFpbmVycyBpbmYgcHJvcGVydGllcyBmb3IgY29udGFpbmluZyBqYXJzLCBpbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0SW5mKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhZGVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLio7Ci0KLXB1YmxpYyBjbGFzcyBKYXJQcm9jZXNzb3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tFRF9TVUZGSVggPSAicGFjay5neiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIExpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnQgZGVwdGggPSAtMTsKLQlwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0IGNvbnRhaW5pbmdJbmZzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCXN0YXRpYyBwdWJsaWMgSmFyUHJvY2Vzc29yIGdldFVucGFja1Byb2Nlc3NvcihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKCFjYW5QZXJmb3JtVW5wYWNrKCkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKLQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBVbnBhY2tTdGVwKHByb3BlcnRpZXMpKTsKLQkJcmV0dXJuIHByb2Nlc3NvcjsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIEphclByb2Nlc3NvciBnZXRQYWNrUHJvY2Vzc29yKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlpZiAoIWNhblBlcmZvcm1QYWNrKCkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKLQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBQYWNrU3RlcChwcm9wZXJ0aWVzKSk7Ci0JCXJldHVybiBwcm9jZXNzb3I7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhblBlcmZvcm1QYWNrKCkgewotCQlyZXR1cm4gUGFja1N0ZXAuY2FuUGFjaygpOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5QZXJmb3JtVW5wYWNrKCkgewotCQlyZXR1cm4gVW5wYWNrU3RlcC5jYW5VbnBhY2soKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB3b3JraW5nRGlyZWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIGRpcikgewotCQlpZihkaXIgIT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJlY3RvcnkgPSBkaXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NBbGwoYm9vbGVhbiBhbGwpewotCQl0aGlzLnByb2Nlc3NBbGwgPSBhbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc1N0ZXAoSVByb2Nlc3NTdGVwIHN0ZXApIHsKLQkJc3RlcHMuYWRkKHN0ZXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUHJvY2Vzc1N0ZXBzKCkgewotCQlzdGVwcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJlY3JlYXRlIGEgamFyIGZpbGUuICBUaGUgcmVwbGFjZW1lbnRzIG1hcCBzcGVjaWZpZXMgZW50cnkgbmFtZXMgdG8gYmUgcmVwbGFjZWQsIHRoZSByZXBsYWNlbWVudHMgYXJlCi0JICogZXhwZWN0ZWQgdG8gYmUgZm91bmQgaW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBqYXIgLSBUaGUgaW5wdXQgamFyCi0JICogQHBhcmFtIG91dHB1dEphciAtIHRoZSBvdXRwdXQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRzIC0gbWFwIG9mIGVudHJ5TmFtZSAtPiBuZXcgZW50cnlOYW1lCi0JICogQHBhcmFtIGRpcmVjdG9yeSAtIGxvY2F0aW9uIHRvIGZpbmQgZmlsZSBmb3IgbmV3IGVudHJ5TmFtZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjcmVhdGVKYXIoSmFyRmlsZSBqYXIsIEphck91dHB1dFN0cmVhbSBvdXRwdXRKYXIsIE1hcCByZXBsYWNlbWVudHMsIEZpbGUgZGlyZWN0b3J5LCBQcm9wZXJ0aWVzIGluZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlib29sZWFuIG1hcmtlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphci5lbnRyaWVzKCk7Ci0JCQlmb3IgKEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgewotCQkJCUZpbGUgcmVwbGFjZW1lbnQgPSBudWxsOwotCQkJCUphckVudHJ5IG5ld0VudHJ5ID0gbnVsbDsKLQkJCQlpZiAocmVwbGFjZW1lbnRzLmNvbnRhaW5zS2V5KGVudHJ5LmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSByZXBsYWNlbWVudHMuZ2V0KGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJCXJlcGxhY2VtZW50ID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBuYW1lKTsKLQkJCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKHJlcGxhY2VtZW50LmV4aXN0cygpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQkJCW5ld0VudHJ5ID0gbmV3IEphckVudHJ5KG5hbWUpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArcmVwbGFjZW1lbnQuZ2V0UGF0aCgpICsgIiwgdXNpbmcgIiArIGphci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGVudHJ5LmdldE5hbWUoKSAgKyAiIGluc3RlYWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyByZXBsYWNlbWVudC5nZXRQYXRoKCkgKyAiIG5vdCBmb3VuZCwgdXNpbmcgIiArIGphci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGVudHJ5LmdldE5hbWUoKSArICIgaW5zdGVhZC4iKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5ld0VudHJ5ID09IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oamFyLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQkJCQluZXdFbnRyeSA9IG5ldyBKYXJFbnRyeShlbnRyeS5nZXROYW1lKCkpOwotCQkJCQl9IGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLQkJCQkJCWlmKHZlcmJvc2UpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRVJST1I6IHByb2JsZW0gcmVhZGluZyAiICsgZW50cnkuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBqYXIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdFbnRyeS5zZXRUaW1lKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJb3V0cHV0SmFyLnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCQkJaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoVXRpbHMuTUFSS19GSUxFX05BTUUpKSB7Ci0JCQkJCS8vVGhlIGVjbGlwc2UuaW5mIGZpbGUgd2FzIHJlYWQgaW4gZWFybGllciwgZG9uJ3QgbmVlZCB0byByZXJlYWQgaXQsIGp1c3Qgd3JpdGUgaXQgb3V0IG5vdwotCQkJCQlVdGlscy5zdG9yZVByb3BlcnRpZXMoaW5mLCBvdXRwdXRKYXIpOwotCQkJCQltYXJrZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhpbiwgb3V0cHV0SmFyLCBmYWxzZSk7Ci0JCQkJfQotCQkJCW91dHB1dEphci5jbG9zZUVudHJ5KCk7Ci0JCQkJaW4uY2xvc2UoKTsKLQotCQkJCS8vZGVsZXRlIHRoZSBuZXN0ZWQgamFyIGZpbGUKLQkJCQlpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlbWVudC5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hcmtlZCkgewotCQkJCUphckVudHJ5IGVudHJ5ID0gbmV3IEphckVudHJ5KFV0aWxzLk1BUktfRklMRV9OQU1FKTsKLQkJCQlvdXRwdXRKYXIucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCQlVdGlscy5zdG9yZVByb3BlcnRpZXMoaW5mLCBvdXRwdXRKYXIpOwotCQkJCW91dHB1dEphci5jbG9zZUVudHJ5KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlVdGlscy5jbG9zZShvdXRwdXRKYXIpOwotCQkJVXRpbHMuY2xvc2UoamFyKTsKLQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0KLQkJCXJlc3VsdCA9IHN0ZXAucmVjdXJzaW9uRWZmZWN0KGVudHJ5TmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJZW50cnlOYW1lID0gcmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RFbnRyaWVzKEphckZpbGUgamFyLCBGaWxlIHRlbXBEaXIsIE1hcCBkYXRhLCBQcm9wZXJ0aWVzIGluZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoaW5mICE9IG51bGwgKSB7Ci0JCQkvL3NraXAgaWYgZXhjbHVkaW5nIGNoaWxkcmVuCi0JCQlpZihpbmYuY29udGFpbnNLZXkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOKSl7Ci0JCQkJU3RyaW5nIGV4Y2x1ZGVDaGlsZHJlbiA9IGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU4pOwotCQkJCWlmKCBCb29sZWFuLnZhbHVlT2YoZXhjbHVkZUNoaWxkcmVuKS5ib29sZWFuVmFsdWUoKSApCi0JCQkJCWlmKHZlcmJvc2UpewotCQkJCQkJZm9yKGludCBpID0gMDsgaSA8PSBkZXB0aDsgaSsrKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRyZW4gb2YgIiArIGphci5nZXROYW1lKCkgKyAiYXJlIGV4Y2x1ZGVkIGZyb20gcHJvY2Vzc2luZy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKLQkJaWYgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWZvciAoSmFyRW50cnkgZW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpID8gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCkgOiBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSByZWN1cnNpb25FZmZlY3QobmFtZSk7Ci0JCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCQlpZih2ZXJib3NlKXsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPD0gZGVwdGg7IGkrKykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgbmVzdGVkIGZpbGU6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vZXh0cmFjdCBlbnRyeSB0byB0ZW1wIGRpcmVjdG9yeQotCQkJCQlGaWxlIGV4dHJhY3RlZCA9IG5ldyBGaWxlKHRlbXBEaXIsIG5hbWUpOwotCQkJCQlGaWxlIHBhcmVudERpciA9IGV4dHJhY3RlZC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCWlmICghcGFyZW50RGlyLmV4aXN0cygpKQotCQkJCQkJcGFyZW50RGlyLm1rZGlycygpOwotCi0JCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbiA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJCQlvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZXh0cmFjdGVkKSk7Ci0JCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoaW4sIG91dCwgdHJ1ZSk7IC8vdGhpcyB3aWxsIGNsb3NlIGJvdGggc3RyZWFtcwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJVXRpbHMuY2xvc2UoaW4pOwotCQkJCQkJVXRpbHMuY2xvc2Uob3V0KTsKLQkJCQkJfQotCQkJCQlleHRyYWN0ZWQuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0KLQkJCQkJLy9yZWN1cnNlCi0JCQkJCWNvbnRhaW5pbmdJbmZzLmFkZEZpcnN0KGluZik7Ci0JCQkJCVN0cmluZyBkaXIgPSBnZXRXb3JraW5nRGlyZWN0b3J5KCk7Ci0JCQkJCXNldFdvcmtpbmdEaXJlY3RvcnkocGFyZW50RGlyLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQkJCUZpbGUgcmVzdWx0ID0gcHJvY2Vzc0phcihleHRyYWN0ZWQpOwotCi0JCQkJCW5ld05hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gZXh0cmFjdGVkLmdldE5hbWUoKS5sZW5ndGgoKSkgKyByZXN1bHQuZ2V0TmFtZSgpOwotCQkJCQlkYXRhLnB1dChuYW1lLCBuZXdOYW1lKTsKLQotCQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KGRpcik7Ci0JCQkJCWNvbnRhaW5pbmdJbmZzLnJlbW92ZUZpcnN0KCk7Ci0KLQkJCQkJLy9kZWxldGUgdGhlIGV4dHJhY3RlZCBpdGVtIGxlYXZpbmcgdGhlIHJlY3Vyc2lvbiByZXN1bHQKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhuZXdOYW1lKSkKLQkJCQkJCWV4dHJhY3RlZC5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHRlbXBEaXIpIHsKLQkJRmlsZSByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQgPSBzdGVwLnByZVByb2Nlc3MoaW5wdXQsIHRlbXBEaXIsIGNvbnRhaW5pbmdJbmZzKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlpbnB1dCA9IHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgdGVtcERpcikgewotCQlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2Nlc3NTdGVwIHN0ZXAgPSAoSVByb2Nlc3NTdGVwKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdCA9IHN0ZXAucG9zdFByb2Nlc3MoaW5wdXQsIHRlbXBEaXIsIGNvbnRhaW5pbmdJbmZzKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlpbnB1dCA9IHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0JCQlzdGVwLmFkanVzdEluZihpbnB1dCwgaW5mLCBjb250YWluaW5nSW5mcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRmlsZSBwcm9jZXNzSmFyKEZpbGUgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCSsrZGVwdGg7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkID0gaW5wdXQubGFzdE1vZGlmaWVkKCk7Ci0JCUZpbGUgd29ya2luZ0RpciA9IG5ldyBGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSk7Ci0JCWlmICghd29ya2luZ0Rpci5leGlzdHMoKSkKLQkJCXdvcmtpbmdEaXIubWtkaXJzKCk7Ci0KLQkJYm9vbGVhbiBza2lwID0gVXRpbHMuc2hvdWxkU2tpcEphcihpbnB1dCwgcHJvY2Vzc0FsbCwgdmVyYm9zZSk7Ci0JCWlmIChkZXB0aCA9PSAwICYmIHZlcmJvc2UpIHsKLQkJCWlmIChza2lwKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgIiArIGlucHV0LmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoIlJ1bm5pbmcgIik7IC8vJE5PTi1OTFMtMSQgCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoc3RlcC5nZXRTdGVwTmFtZSgpICsgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9uICIgKyBpbnB1dC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoc2tpcCkgewotCQkJLy9UaGlzIGphciB3YXMgbm90IG1hcmtlZCBhcyBjb25kaXRpb25lZCwgYW5kIHdlIGFyZSBvbmx5IHByb2Nlc3NpbmcgY29uZGl0aW9uZWQgamFycywgc28gZG8gbm90aGluZwotCQkJLS1kZXB0aDsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCi0JCS8vcHJlCi0JCUZpbGUgd29ya2luZ0ZpbGUgPSBwcmVQcm9jZXNzKGlucHV0LCB3b3JraW5nRGlyKTsKLQotCQkvL0V4dHJhY3QgZW50cmllcyBmcm9tIGphciBhbmQgcmVjdXJzZSBvbiB0aGVtCi0JCUZpbGUgdGVtcERpciA9IG51bGw7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQl0ZW1wRGlyID0gbmV3IEZpbGUod29ya2luZ0RpciwgInRlbXAuIiArIHdvcmtpbmdGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCUZpbGUgcGFyZW50ID0gd29ya2luZ0Rpci5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl0ZW1wRGlyID0gbmV3IEZpbGUocGFyZW50LCAidGVtcF8iICsgZGVwdGggKyAnXycgKyB3b3JraW5nRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKHdvcmtpbmdGaWxlLCBmYWxzZSk7Ci0JCU1hcCByZXBsYWNlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQlQcm9wZXJ0aWVzIGluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYod29ya2luZ0ZpbGUsIHZlcmJvc2UpOwotCQlleHRyYWN0RW50cmllcyhqYXIsIHRlbXBEaXIsIHJlcGxhY2VtZW50cywgaW5mKTsKLQotCQlpZiAoaW5mICE9IG51bGwpCi0JCQlhZGp1c3RJbmYod29ya2luZ0ZpbGUsIGluZik7Ci0KLQkJLy9SZWNyZWF0ZSB0aGUgamFyIHdpdGggcmVwbGFjZW1lbnRzLiAKLQkJLy9UT0RPOiBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgaWYgd2UgZGlkbid0IGNoYW5nZSB0aGUgaW5mIGZpbGUgYW5kIGRpZG4ndCBjaGFuZ2UgYW55IGNvbnRlbnQKLQkJRmlsZSB0ZW1wSmFyID0gbnVsbDsKLQkJdGVtcEphciA9IG5ldyBGaWxlKHRlbXBEaXIsIHdvcmtpbmdGaWxlLmdldE5hbWUoKSk7Ci0JCUZpbGUgcGFyZW50ID0gdGVtcEphci5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghcGFyZW50LmV4aXN0cygpKQotCQkJcGFyZW50Lm1rZGlycygpOwotCQlKYXJPdXRwdXRTdHJlYW0gamFyT3V0ID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEphcikpKTsKLQkJcmVjcmVhdGVKYXIoamFyLCBqYXJPdXQsIHJlcGxhY2VtZW50cywgdGVtcERpciwgaW5mKTsKLQotCQlqYXIuY2xvc2UoKTsKLQkJaWYgKHRlbXBKYXIgIT0gbnVsbCkgewotCQkJaWYgKCF3b3JraW5nRmlsZS5lcXVhbHMoaW5wdXQpKSB7Ci0JCQkJd29ya2luZ0ZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCQl3b3JraW5nRmlsZSA9IHRlbXBKYXI7Ci0JCX0KLQotCQkvL3Bvc3QKLQkJRmlsZSByZXN1bHQgPSBwb3N0UHJvY2Vzcyh3b3JraW5nRmlsZSwgd29ya2luZ0Rpcik7Ci0JCQotCQkvL2hhdmUgdG8gbm9ybWFsaXplIGFmdGVyIHRoZSBwb3N0IHN0ZXBzCi0JCW5vcm1hbGl6ZShyZXN1bHQsIHdvcmtpbmdEaXIpOwotCQkKLQkJaWYgKCFyZXN1bHQuZXF1YWxzKHdvcmtpbmdGaWxlKSAmJiAhd29ya2luZ0ZpbGUuZXF1YWxzKGlucHV0KSkKLQkJCXdvcmtpbmdGaWxlLmRlbGV0ZSgpOwotCQlpZiAoIXJlc3VsdC5nZXRQYXJlbnRGaWxlKCkuZXF1YWxzKHdvcmtpbmdEaXIpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsIHJlc3VsdC5nZXROYW1lKCkpOwotCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkKLQkJCQlmaW5hbEZpbGUuZGVsZXRlKCk7Ci0JCQlyZXN1bHQucmVuYW1lVG8oZmluYWxGaWxlKTsKLQkJCXJlc3VsdCA9IGZpbmFsRmlsZTsKLQkJfQotCi0JCWlmICh0ZW1wRGlyLmV4aXN0cygpKQotCQkJVXRpbHMuY2xlYXIodGVtcERpcik7Ci0KLQkJcmVzdWx0LnNldExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpOwotCQktLWRlcHRoOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm9ybWFsaXplKEZpbGUgaW5wdXQsIEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWlmKGlucHV0LmdldE5hbWUoKS5lbmRzV2l0aChKYXJQcm9jZXNzb3IuUEFDS0VEX1NVRkZJWCkpIHsKLQkJCS8vbm90IGEgamFyCi0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUZpbGUgdGVtcEphciA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgInRlbXBfIiArIGlucHV0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUphckZpbGUgamFyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJamFyID0gbmV3IEphckZpbGUoaW5wdXQsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKEphckV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9ub3QgYSBqYXIKLQkJCQlyZXR1cm4gOwotCQkJfQotCQkJSmFyT3V0cHV0U3RyZWFtIGphck91dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBKYXIpKSk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCQkJCWZvciAoSmFyRW50cnkgZW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpID8gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCkgOiBudWxsKSB7Ci0JCQkJCUphckVudHJ5IG5ld0VudHJ5ID0gbmV3IEphckVudHJ5KGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJCW5ld0VudHJ5LnNldFRpbWUoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCQkJamFyT3V0LnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhpbiwgamFyT3V0LCBmYWxzZSk7Ci0JCQkJCWphck91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlVdGlscy5jbG9zZShqYXJPdXQpOwotCQkJCVV0aWxzLmNsb3NlKGphcik7Ci0JCQkJVXRpbHMuY2xvc2UoaW4pOwotCQkJfQotCQkJdGVtcEphci5zZXRMYXN0TW9kaWZpZWQoaW5wdXQubGFzdE1vZGlmaWVkKCkpOwotCQkJaW5wdXQuZGVsZXRlKCk7Ci0JCQl0ZW1wSmFyLnJlbmFtZVRvKGlucHV0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG5vcm1hbGl6aW5nIGphciAiICsgaW5wdXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhNTYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLio7Ci0KLXB1YmxpYyBjbGFzcyBKYXJQcm9jZXNzb3JFeGVjdXRvciB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zIHsKLQkJcHVibGljIFN0cmluZyBvdXRwdXREaXIgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIFN0cmluZyBzaWduQ29tbWFuZCA9IG51bGw7Ci0JCXB1YmxpYyBib29sZWFuIHBhY2sgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gcmVwYWNrID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIHVucGFjayA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIHByb2Nlc3NBbGwgPSBmYWxzZTsKLQkJcHVibGljIEZpbGUgaW5wdXQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bkphclByb2Nlc3NvcihPcHRpb25zIG9wdGlvbnMpIHsKLQkJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgb3B0aW9ucy5pbnB1dC5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlaaXBQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFppcFByb2Nlc3NvcigpOwotCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpOwotCQkJcHJvY2Vzc29yLnNldFNpZ25Db21tYW5kKG9wdGlvbnMuc2lnbkNvbW1hbmQpOwotCQkJcHJvY2Vzc29yLnNldFBhY2sob3B0aW9ucy5wYWNrKTsKLQkJCXByb2Nlc3Nvci5zZXRSZXBhY2sob3B0aW9ucy5yZXBhY2sgfHwgKG9wdGlvbnMucGFjayAmJiBvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpKTsKLQkJCXByb2Nlc3Nvci5zZXRVbnBhY2sob3B0aW9ucy51bnBhY2spOwotCQkJcHJvY2Vzc29yLnNldFZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKTsKLQkJCXByb2Nlc3Nvci5zZXRQcm9jZXNzQWxsKG9wdGlvbnMucHJvY2Vzc0FsbCk7Ci0JCQl0cnkgewotCQkJCXByb2Nlc3Nvci5wcm9jZXNzWmlwKG9wdGlvbnMuaW5wdXQpOwotCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXJQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQkJSmFyUHJvY2Vzc29yIHBhY2tQcm9jZXNzb3IgPSBudWxsOwotCi0JCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShvcHRpb25zLm91dHB1dERpcik7Ci0JCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChvcHRpb25zLnByb2Nlc3NBbGwpOwotCQkJcHJvY2Vzc29yLnNldFZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKTsKLQotCQkJLy9sb2FkIG9wdGlvbnMgZmlsZQotCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWlmIChvcHRpb25zLmlucHV0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlIHBhY2tQcm9wZXJ0aWVzID0gbmV3IEZpbGUob3B0aW9ucy5pbnB1dCwgInBhY2sucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhY2tQcm9wZXJ0aWVzLmV4aXN0cygpICYmIHBhY2tQcm9wZXJ0aWVzLmlzRmlsZSgpKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrUHJvcGVydGllcykpOwotCQkJCQkJcHJvcGVydGllcy5sb2FkKGluKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJVXRpbHMuY2xvc2UoaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob3B0aW9ucy51bnBhY2spCi0JCQkJYWRkVW5wYWNrU3RlcChwcm9jZXNzb3IsIHByb3BlcnRpZXMsIG9wdGlvbnMpOwotCi0JCQlpZiAob3B0aW9ucy5yZXBhY2sgfHwgKG9wdGlvbnMucGFjayAmJiBvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpKQotCQkJCWFkZFBhY2tVbnBhY2tTdGVwKHByb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7Ci0KLQkJCWlmIChvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpCi0JCQkJYWRkU2lnblN0ZXAocHJvY2Vzc29yLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTsKLQotCQkJaWYgKG9wdGlvbnMucGFjaykgewotCQkJCXBhY2tQcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCQkJcGFja1Byb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KG9wdGlvbnMub3V0cHV0RGlyKTsKLQkJCQlwYWNrUHJvY2Vzc29yLnNldFByb2Nlc3NBbGwob3B0aW9ucy5wcm9jZXNzQWxsKTsKLQkJCQlwYWNrUHJvY2Vzc29yLnNldFZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKTsKLQkJCQlhZGRQYWNrU3RlcChwYWNrUHJvY2Vzc29yLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlwcm9jZXNzKG9wdGlvbnMuaW5wdXQsIG9wdGlvbnMudW5wYWNrID8gVXRpbHMuUEFDS19HWl9GSUxURVIgOiBVdGlscy5KQVJfRklMVEVSLCBvcHRpb25zLnZlcmJvc2UsIHByb2Nlc3NvciwgcGFja1Byb2Nlc3Nvcik7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIHZlcmJvc2UsIEphclByb2Nlc3NvciBwcm9jZXNzb3IsIEphclByb2Nlc3NvciBwYWNrUHJvY2Vzc29yKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKCFpbnB1dC5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQotCQlGaWxlW10gZmlsZXMgPSBudWxsOwotCQlpZiAoaW5wdXQuaXNEaXJlY3RvcnkoKSkgewotCQkJZmlsZXMgPSBpbnB1dC5saXN0RmlsZXMoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIuYWNjZXB0KGlucHV0KSkgewotCQkJZmlsZXMgPSBuZXcgRmlsZVtdIHtpbnB1dH07Ci0JCX0gZWxzZQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZyBkaXIgPSBwcm9jZXNzb3IuZ2V0V29ya2luZ0RpcmVjdG9yeSgpOwotCQkJCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KGRpciArICIvIiArIGZpbGVzW2ldLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsKQotCQkJCQlwYWNrUHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyICsgIi8iICsgZmlsZXNbaV0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByb2Nlc3MoZmlsZXNbaV0sIGZpbHRlciwgdmVyYm9zZSwgcHJvY2Vzc29yLCBwYWNrUHJvY2Vzc29yKTsKLQkJCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotCQkJCWlmIChwYWNrUHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCXBhY2tQcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIuYWNjZXB0KGZpbGVzW2ldKSkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgcmVzdWx0ID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZXNbaV0pOwotCQkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsICYmIHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5leGlzdHMoKSkgewotCQkJCQkJcGFja1Byb2Nlc3Nvci5wcm9jZXNzSmFyKHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICh2ZXJib3NlKQotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWNrVW5wYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFBhY2tVbnBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNpZ25TdGVwKEphclByb2Nlc3NvciBwcm9jZXNzb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywgSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgU2lnbkNvbW1hbmRTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMuc2lnbkNvbW1hbmQsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhY2tTdGVwKEphclByb2Nlc3NvciBwcm9jZXNzb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywgSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgUGFja1N0ZXAocHJvcGVydGllcywgb3B0aW9ucy52ZXJib3NlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVW5wYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFVucGFja1N0ZXAocHJvcGVydGllcywgb3B0aW9ucy52ZXJib3NlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM3OTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYmluX2FudCIgcGF0aD0ic3JjX2FudCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxN2Q4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIKLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuamFyCi1iaW4KLWFudF90YXNrcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIE1ldGFkYXRhIEdlbmVyYXRvciBBbnQgVGFza3MubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgTWV0YWRhdGEgR2VuZXJhdG9yIEFudCBUYXNrcy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOWMzZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgTWV0YWRhdGEgR2VuZXJhdG9yIEFudCBUYXNrcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSI0Ii8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuREVGQVVMVF9DTEFTU1BBVEgiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfUlVOX0JVSUxEX0tJTkRTIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODNjYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIE1ldGFkYXRhIEdlbmVyYXRvciBBbnQgVGFza3MubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4NTEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0jVGh1IEZlYiAyMSAxNToyMToyMyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODczODY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNUaHUgSmFuIDI0IDEyOjEzOjQwIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPXRydWUKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9DREMtMS4wX0ZvdW5kYXRpb24tMS4wLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0NEQy0xLjBfRm91bmRhdGlvbi0xLjAucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1N2EyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0NEQy0xLjBfRm91bmRhdGlvbi0xLjAucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5pbwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5pbwotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIENEQy0xLjAvRm91bmRhdGlvbi0xLjAKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBDREMtMS4wL0ZvdW5kYXRpb24tMS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0NEQy0xLjFfRm91bmRhdGlvbi0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvQ0RDLTEuMV9Gb3VuZGF0aW9uLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQzMDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvQ0RDLTEuMV9Gb3VuZGF0aW9uLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXgubWljcm9lZGl0aW9uLmlvLFwKLSBqYXZheC5taWNyb2VkaXRpb24ucGtpLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC5taWNyb2VkaXRpb24uaW8sXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5wa2ksXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMAotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIENEQy0xLjAvRm91bmRhdGlvbi0xLjAsXAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS4yLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS4yLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Zjk3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KMlNFLTEuMi5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXguc3dpbmcsXAotIGphdmF4LnN3aW5nLmJvcmRlcixcCi0gamF2YXguc3dpbmcuY29sb3JjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5ldmVudCxcCi0gamF2YXguc3dpbmcuZmlsZWNob29zZXIsXAotIGphdmF4LnN3aW5nLnBsYWYsXAotIGphdmF4LnN3aW5nLnBsYWYuYmFzaWMsXAotIGphdmF4LnN3aW5nLnBsYWYubWV0YWwsXAotIGphdmF4LnN3aW5nLnBsYWYubXVsdGksXAotIGphdmF4LnN3aW5nLnRhYmxlLFwKLSBqYXZheC5zd2luZy50ZXh0LFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIsXAotIGphdmF4LnN3aW5nLnRleHQucnRmLFwKLSBqYXZheC5zd2luZy50cmVlLFwKLSBqYXZheC5zd2luZy51bmRvLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBLkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEuT1JCUGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5UeXBlQ29kZVBhY2thZ2UsXAotIG9yZy5vbWcuQ29zTmFtaW5nLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZQotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMgotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS4yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS4zLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS4zLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZGJkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KMlNFLTEuMy5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5ybWksXAotIGphdmF4LnJtaS5DT1JCQSxcCi0gamF2YXguc291bmQubWlkaSxcCi0gamF2YXguc291bmQubWlkaS5zcGksXAotIGphdmF4LnNvdW5kLnNhbXBsZWQsXAotIGphdmF4LnNvdW5kLnNhbXBsZWQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLFwKLSBvcmcub21nLlNlbmRpbmdDb250ZXh0LFwKLSBvcmcub21nLnN0dWIuamF2YS5ybWkKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC4qLFwKLSBvcmcub21nLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBKMlNFLTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KMlNFLTEuNC5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KMlNFLTEuNC5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA3Yzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvSjJTRS0xLjQucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5hY2Nlc3NpYmlsaXR5LFwKLSBqYXZheC5jcnlwdG8sXAotIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLFwKLSBqYXZheC5jcnlwdG8uc3BlYyxcCi0gamF2YXguaW1hZ2VpbyxcCi0gamF2YXguaW1hZ2Vpby5ldmVudCxcCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YSxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcsXAotIGphdmF4LmltYWdlaW8uc3BpLFwKLSBqYXZheC5pbWFnZWlvLnN0cmVhbSxcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5uZXQsXAotIGphdmF4Lm5ldC5zc2wsXAotIGphdmF4LnByaW50LFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCxcCi0gamF2YXgucHJpbnQuZXZlbnQsXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLFwKLSBqYXZheC5zZWN1cml0eS5jZXJ0LFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3dpbmcsXAotIGphdmF4LnN3aW5nLmJvcmRlcixcCi0gamF2YXguc3dpbmcuY29sb3JjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5ldmVudCxcCi0gamF2YXguc3dpbmcuZmlsZWNob29zZXIsXAotIGphdmF4LnN3aW5nLnBsYWYsXAotIGphdmF4LnN3aW5nLnBsYWYuYmFzaWMsXAotIGphdmF4LnN3aW5nLnBsYWYubWV0YWwsXAotIGphdmF4LnN3aW5nLnBsYWYubXVsdGksXAotIGphdmF4LnN3aW5nLnRhYmxlLFwKLSBqYXZheC5zd2luZy50ZXh0LFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIsXAotIGphdmF4LnN3aW5nLnRleHQucnRmLFwKLSBqYXZheC5zd2luZy50cmVlLFwKLSBqYXZheC5zd2luZy51bmRvLFwKLSBqYXZheC50cmFuc2FjdGlvbixcCi0gamF2YXgudHJhbnNhY3Rpb24ueGEsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy54bWwuc2F4LFwKLSBvcmcueG1sLnNheC5leHQsXAotIG9yZy54bWwuc2F4LmhlbHBlcnMKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC4qLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLiosXAotIG9yZy53M2MuKixcCi0gb3JnLnhtbC4qLFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMSxcCi0gSlJFLTEuMSxcCi0gSjJTRS0xLjIsXAotIEoyU0UtMS4zLFwKLSBKMlNFLTEuNAotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS41LnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0oyU0UtMS41LnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2Q2Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KMlNFLTEuNS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gXAotIGphdmF4LmFjY2Vzc2liaWxpdHksXAotIGphdmF4LmFjdGl2aXR5LFwKLSBqYXZheC5jcnlwdG8sXAotIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLFwKLSBqYXZheC5jcnlwdG8uc3BlYyxcCi0gamF2YXguaW1hZ2VpbyxcCi0gamF2YXguaW1hZ2Vpby5ldmVudCxcCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YSxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcCxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcsXAotIGphdmF4LmltYWdlaW8uc3BpLFwKLSBqYXZheC5pbWFnZWlvLnN0cmVhbSxcCi0gamF2YXgubWFuYWdlbWVudCxcCi0gamF2YXgubWFuYWdlbWVudC5sb2FkaW5nLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4sXAotIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvcixcCi0gamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4sXAotIGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24sXAotIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWksXAotIGphdmF4Lm1hbmFnZW1lbnQudGltZXIsXAotIGphdmF4Lm5hbWluZyxcCi0gamF2YXgubmFtaW5nLmRpcmVjdG9yeSxcCi0gamF2YXgubmFtaW5nLmV2ZW50LFwKLSBqYXZheC5uYW1pbmcubGRhcCxcCi0gamF2YXgubmFtaW5nLnNwaSxcCi0gamF2YXgubmV0LFwKLSBqYXZheC5uZXQuc3NsLFwKLSBqYXZheC5wcmludCxcCi0gamF2YXgucHJpbnQuYXR0cmlidXRlLFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUuc3RhbmRhcmQsXAotIGphdmF4LnByaW50LmV2ZW50LFwKLSBqYXZheC5ybWksXAotIGphdmF4LnJtaS5DT1JCQSxcCi0gamF2YXgucm1pLnNzbCxcCi0gamF2YXguc2VjdXJpdHkuYXV0aCxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjayxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcyxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbixcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5zcGksXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMCxcCi0gamF2YXguc2VjdXJpdHkuY2VydCxcCi0gamF2YXguc2VjdXJpdHkuc2FzbCxcCi0gamF2YXguc2VydmxldCxcCi0gamF2YXguc2VydmxldC5odHRwLFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3FsLnJvd3NldCxcCi0gamF2YXguc3FsLnJvd3NldC5zZXJpYWwsXAotIGphdmF4LnNxbC5yb3dzZXQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcucGxhZi5zeW50aCxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBqYXZheC50cmFuc2FjdGlvbi54YSxcCi0gamF2YXgueG1sLFwKLSBqYXZheC54bWwuZGF0YXR5cGUsXAotIGphdmF4LnhtbC5uYW1lc3BhY2UsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBqYXZheC54bWwudmFsaWRhdGlvbixcCi0gamF2YXgueG1sLnhwYXRoLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy53M2MuZG9tLmJvb3RzdHJhcCxcCi0gb3JnLnczYy5kb20uZXZlbnRzLFwKLSBvcmcudzNjLmRvbS5scyxcCi0gb3JnLnhtbC5zYXgsXAotIG9yZy54bWwuc2F4LmV4dCxcCi0gb3JnLnhtbC5zYXguaGVscGVycwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuKixcCi0gb3JnLnczYy4qLFwKLSBvcmcueG1sLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMsXAotIEoyU0UtMS40LFwKLSBKMlNFLTEuNQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL0pSRS0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvSlJFLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThkOGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvSlJFLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gSlJFLTEuMQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEpSRS0xLjEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvSmF2YVNFLTEuNi5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KYXZhU0UtMS42LnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2FiY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9KYXZhU0UtMS42LnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXguYWN0aXZpdHksXAotIGphdmF4LmNyeXB0byxcCi0gamF2YXguY3J5cHRvLmludGVyZmFjZXMsXAotIGphdmF4LmNyeXB0by5zcGVjLFwKLSBqYXZheC5pbWFnZWlvLFwKLSBqYXZheC5pbWFnZWlvLmV2ZW50LFwKLSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuYm1wLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZyxcCi0gamF2YXguaW1hZ2Vpby5zcGksXAotIGphdmF4LmltYWdlaW8uc3RyZWFtLFwKLSBqYXZheC5tYW5hZ2VtZW50LFwKLSBqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmcsXAotIGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5tb25pdG9yLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbixcCi0gamF2YXgubWFuYWdlbWVudC5yZW1vdGUsXAotIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaSxcCi0gamF2YXgubWFuYWdlbWVudC50aW1lcixcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5uZXQsXAotIGphdmF4Lm5ldC5zc2wsXAotIGphdmF4LnByaW50LFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCxcCi0gamF2YXgucHJpbnQuZXZlbnQsXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5ybWkuc3NsLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLFwKLSBqYXZheC5zZWN1cml0eS5jZXJ0LFwKLSBqYXZheC5zZWN1cml0eS5zYXNsLFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3FsLnJvd3NldCxcCi0gamF2YXguc3FsLnJvd3NldC5zZXJpYWwsXAotIGphdmF4LnNxbC5yb3dzZXQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcucGxhZi5zeW50aCxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBqYXZheC50cmFuc2FjdGlvbi54YSxcCi0gamF2YXgueG1sLFwKLSBqYXZheC54bWwuZGF0YXR5cGUsXAotIGphdmF4LnhtbC5uYW1lc3BhY2UsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBqYXZheC54bWwudmFsaWRhdGlvbixcCi0gamF2YXgueG1sLnhwYXRoLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy53M2MuZG9tLmJvb3RzdHJhcCxcCi0gb3JnLnczYy5kb20uZXZlbnRzLFwKLSBvcmcudzNjLmRvbS5scyxcCi0gb3JnLnhtbC5zYXgsXAotIG9yZy54bWwuc2F4LmV4dCxcCi0gb3JnLnhtbC5zYXguaGVscGVycwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuKixcCi0gb3JnLnczYy4qLFwKLSBvcmcueG1sLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMsXAotIEoyU0UtMS40LFwKLSBKMlNFLTEuNSxcCi0gSmF2YVNFLTEuNgotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEphdmFTRS0xLjYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGZjODQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUsCi0gb3JnLmVjbGlwc2Uub3NnaSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5wYXJzZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLnczYy5kb20sCi0gb3JnLnhtbC5zYXgsCi0gb3JnLnhtbC5zYXguaGVscGVycwotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuQWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFNESy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL01ldGFkYXRhIEdlbmVyYXRvciBTREsubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQxOTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFNESy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9NZXRhZGF0YSBHZW5lcmF0b3IgU0RLIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL2oyc2RrMS40LjJfMDgiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpDOi9lcXVpbm94LnAyL3NlcnZlcnMvJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpDOi9lcXVpbm94LnAyL3NlcnZlcnMvJiMxMzsmIzEwOy1zb3VyY2UgYzpcZWNsaXBzZVxsYXRlc3RcZWNsaXBzZSYjMTM7JiMxMDstcm9vdCBzZGsmIzEzOyYjMTA7LXJvb3RWZXJzaW9uIDMuNC4wLkkyMDA4MDIxMndpdGhjb3B5cmlnaHRsaWNlbnNlY2hhbmdlcyYjMTM7JiMxMDstZmxhdm9yIHRvb2xpbmcmIzEzOyYjMTA7LXB1Ymxpc2hBcnRpZmFjdHMmIzEzOyYjMTA7LWFwcGVuZCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0iY29tLmlibS5pY3VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmFudC5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUubmV0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGhAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvckBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5hcGFjaGUueGVyY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9PU0dpX01pbmltdW0tMS4wLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL09TR2lfTWluaW11bS0xLjAucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMmQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL09TR2lfTWluaW11bS0xLjAucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBPU0dpL01pbmltdW0tMS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL09TR2lfTWluaW11bS0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvT1NHaV9NaW5pbXVtLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDhiNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvT1NHaV9NaW5pbXVtLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IE9TR2kvTWluaW11bS0xLjEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTU2Y2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotc291cmNlLmFudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphcj1zcmNfYW50Lwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE9TR2lfTWluaW11bS0xLjEucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBPU0dpX01pbmltdW0tMS4wLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgSmF2YVNFLTEuNi5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIEpSRS0xLjEucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBKMlNFLTEuNS5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIEoyU0UtMS40LnByb2ZpbGUsXAotICAgICAgICAgICAgICAgSjJTRS0xLjMucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBKMlNFLTEuMi5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIENEQy0xLjFfRm91bmRhdGlvbi0xLjEucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBDREMtMS4wX0ZvdW5kYXRpb24tMS4wLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlcj0uLGFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphcgotZXh0cmEuYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyID0gcGxhdGZvcm06L3BsdWdpbi9vcmcuYXBhY2hlLmFudAotamFycy5leHRyYS5jbGFzc3BhdGggPSBwbGF0Zm9ybTovcGx1Z2luL29yZy5hcGFjaGUuYW50L2xpYi9hbnQuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL2NvbmZpZy5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTMyOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBFY2xpcHNlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBmaWxlCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgbWVyZ2VkIGludG8gdGhlIAotIyBTeXN0ZW0gcHJvcGVydGllcyBvbiBzeXN0ZW0gc3RhcnR1cC4gIFRoZSB2YWx1ZXMgY29udHJvbCB0aGUgd2F5IHRoZSAKLSMgcnVudGltZSBpcyBzdHJ1Y3R1cmVkIGFuZCBydW5zLgotCi0jIE5vdGU6ICBPbmx5IHBsYXRmb3JtOi9iYXNlLyBhbmQgZmlsZTogVVJMcyBhcmUgc3VwcG9ydGVkLiAgSW4gZ2VuZXJhbCB0aGUgCi0jIFVSTHMgZ2l2ZW4gbWF5IGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciAoZS5nLiwgLi4uL2xvY2F0aW9uXzEuMi4zKS4gIAotIyBJZiBhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBiaW5kcwotIyB0byB0aGUgbG9jYXRpb24gd2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9yIHRvIHRoZSB2ZXJzaW9uZWQgbG9jYXRpb24gd2l0aCB0aGUKLSMgbGF0ZXN0IHZlcnNpb24gbnVtYmVyLiAgSWYgYSB2ZXJzaW9uIG51bWJlciBpcyBnaXZlbiB0aGVuIG9ubHkgZXhhY3QgbWF0Y2hlcwotIyBhcmUgY29uc2lkZXJlZC4KLQotIyBUaGUgVVJMIGZvciB0aGUgcnVudGltZSBlbnRyeSBwb2ludC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0jIHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSAKLSNvc2dpLmZyYW1ld29yaz1wbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kKLQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGNvbnRhaW5zIGVpdGhlciBVUkxzIG9yIHNpbXBsZSBlbGVtZW50IG5hbWVzLiAgU2ltcGxlCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIAotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0jIFZlcnNpb24gbWF0Y2ggc2VhcmNoaW5nIGlzIG5vdCBkb25lIGZvciBVUkxzIGxpc3RlZCBoZXJlLgotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb25zIHRvIHNlYXJjaCBmb3IgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZSAoc3BsYXNoLmJtcCkuCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotI29zZ2kuc3BsYXNoUGF0aD0KLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgCi0jIGluIGZhdm91ciBvZiB0aGUgb3NnaS5zcGxhc2hQYXRoIHNlYXJjaGluZyBvdXRsaW5lZCBhYm92ZS4gIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IAotIyB0aGUgc2VhcmNoaW5nIGlzIGRvbmUgYW5kIHRoaXMga2V5IGlzIGJvdW5kIHRvIHRoZSByZXN1bHQgb2YgdGhlIHNlYXJjaC4KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYnVuZGxlcyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgYW5kIG9wdGlvbmFsbHkgc3RhcnRlZAotIyBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAgYW5kIHJ1bm5pbmcuICBFYWNoIGVudHJ5IGlmIG9mIHRoZSBmb3JtCi0jICAgICA8VVJMIHwgc2ltcGxlIGJ1bmRsZSBsb2NhdGlvbj5bQCBbPHN0YXJ0bGV2ZWw+XSBbIjpzdGFydCJdXQotIyBJZiB0aGUgc3RhcnRsZXZlbCBpcyBvbWl0dGVkIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgZGVmYXVsdCBzdGFydCBsZXZlbCBmb3IgdGhlIGJ1bmRsZS4KLSMgSWYgdGhlICJzdGFydCIgdGFnIGlzIGFkZGVkIHRoZW4gdGhlIGJ1bmRsZSB3aWxsIGJlIG1hcmtlZCBhcyBzdGFydGVkIGFmdGVyIGJlaW5nIGluc3RhbGxlZC4KLSMgU2ltcGxlIGJ1bmRsZSBsb2NhdGlvbnMgYXJlIGludGVyZXByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgcGFyZW50IGRpcmVjdG9yeS4KLSMgVGhlIHN0YXJ0bGV2ZWwgaW5kaWNhdGVzIHRoZSBPU0dpIHN0YXJ0IGxldmVsIGF0IHdoaWNoIHRoZSBidW5kbGUgc2hvdWxkIHJ1bi4KLW9zZ2kuYnVuZGxlcz1vcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkAyOnN0YXJ0LCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yQDM6c3RhcnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZUBzdGFydCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3hAc3RhcnQKLQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLgotIyBUaGUgcHJvZHVjdCBpZGVudGlmaWVkIHdpbGwgc3VwcGx5IHRoZSBicmFuZGluZyAod2luZG93IGljb25zLCB0aXRsZSBiYXIgdGV4dCkgZXRjIAotIyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uICAKLSNlY2xpcHNlLnByb2R1Y3Q9Ci0KLSMgVGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4gIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaGVyZSBpcyB0aGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbgotIyB0aGUgcnVudGltZSB3aWxsIGZpbmQsIGluc3RhbnRpYXRlIGFuZCBleGVjdXRlIG9uY2UgdGhlIHN5c3RlbSBpcyB1cC4gIE5vdGUgdGhhdCB0eXBpY2FsbHkgCi0jIHRoZSBpZGVudGlmaWVkIGVjbGlwc2UucHJvZHVjdCBkZWZpbmVzIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4KLSNlY2xpcHNlLmFwcGxpY2F0aW9uPQotCi0jIFRoZSBidWlsZCBpZGVudGlmaWVyCi1lY2xpcHNlLmJ1aWxkSWQ9QGJ1aWxkQAotCi0jIEVuZCBvZiBmaWxlIG1hcmtlciAtIG11c3QgYmUgaGVyZQotZW9mPWVvZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvZ2VuZXJhdG9yLnByb2R1Y3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL2dlbmVyYXRvci5wcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMxM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvZ2VuZXJhdG9yLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVxdWlub3ggUHJvdmlzaW9uaW5nIE1ldGFkYXRhIEdlbmVyYXRvciIgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yIiB1c2VGZWF0dXJlcz0idHJ1ZSI+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJjdXN0b20iIHBhdGg9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9jb25maWcuaW5pIi8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzTWFjPi1Yc3RhcnRPbkZpcnN0VGhyZWFkIC1Eb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5zbWFsbEZvbnRzPC92bUFyZ3NNYWM+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPGxhdW5jaGVyIG5hbWU9ImVjbGlwc2UiPgotICAgICAgPHNvbGFyaXMvPgotICAgICAgPHdpbiB1c2VJY289ImZhbHNlIj4KLSAgICAgICAgIDxibXAvPgotICAgICAgPC93aW4+Ci0gICA8L2xhdW5jaGVyPgotCi0gICA8dm0+Ci0gICA8L3ZtPgotCi0gICA8cGx1Z2lucz4KLSAgIDwvcGx1Z2lucz4KLQotICAgPGZlYXR1cmVzPgotICAgICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUiIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucmNwIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPC9mZWF0dXJlcz4KLQotPC9wcm9kdWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9wMi1pemVyIHVwZGF0ZSBzaXRlLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvcDItaXplciB1cGRhdGUgc2l0ZS5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDU1ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9wMi1pemVyIHVwZGF0ZSBzaXRlLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wMi1pemVyIHVwZGF0ZSBzaXRlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpkOi9nYW55bWVkZU01LyYjMTM7JiMxMDstYXJ0aWZhY3RSZXBvc2l0b3J5IGZpbGU6ZDovZ2FueW1lZGVNNS8mIzEzOyYjMTA7LXVwZGF0ZVNpdGUgZDovZ2FueW1lZGVNNS8mIzEzOyYjMTA7LXNpdGUgZmlsZTpkOi9nYW55bWVkZU01L3NpdGUueG1sJiMxMzsmIzEwOy1mbGF2b3IgdG9vbGluZyYjMTM7JiMxMDstYXBwZW5kJiMxMzsmIzEwOy1yZXVzZVBhY2syMDBGaWxlcyYjMTM7JiMxMDstY29tcHJlc3MiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yKjMuMi4yMDAudjIwMDgwMTA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSozLjIuMjAwLnYyMDA3MDcxN0BkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjMuMTAwLnYyMDA4MDIyNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYqMS4wLjEwMC52MjAwODAyMDFhQGRlZmF1bHQ6ZmFsc2UsY29tLmlibS5pY3UqMy44LjEudjIwMDgwMTAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMqMy4xLjIwMC52MjAwNzEyMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwMzA0QDosb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYqMS4wLjEwMC52MjAwODAyMDFhQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUqMy4zLjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjQuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSoxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYmQ3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBNZXRhZGF0YSBHZW5lcmF0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJFY2xpcHNlR2VuZXJhdG9yIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBjYXJkaW5hbGl0eT0iMSIKLSAgICAgICAgICAgIHRocmVhZD0ibWFpbiIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJwcm9kdWN0IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcm9kdWN0cyI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VHZW5lcmF0b3IiCi0gICAgICAgICAgICBuYW1lPSJFcXVpbm94IFByb3Zpc2lvbmluZyBNZXRhZGF0YSBHZW5lcmF0b3IiPgotICAgICAgPC9wcm9kdWN0PgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcyI+Ci0JCTxhbnRUYXNrCi0JCQlsaWJyYXJ5PSJhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiCi0JCQluYW1lPSJwMi5nZW5lcmF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50LkdlbmVyYXRvclRhc2siPgotCQk8L2FudFRhc2s+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiPgotCQk8ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PSJhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjA2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLCBhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmFwcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9hbnRfdGFza3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzMuMS4wIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphciI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIiBmYWlsb25lcnJvcj0idHJ1ZSIgdmVyYm9zZT0idHJ1ZSIgZGVidWc9Im9uIj4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGRpcnNldCBkaXI9IiR7YmFzZWRpcn0vLi4iPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9iaW4iLz4KLQkJCQkJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uub3NnaS9iaW4iLz4KLQkJCQk8L2RpcnNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS5ob21lfSI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9InBsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqLmphciIvPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJwbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kqLmphciIvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQkJPHNyYyBwYXRoPSJzcmNfYW50LyIvPgotCQk8L2phdmFjPgotCQk8IS0tIGNvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iPgotCQkJPGZpbGVzZXQgZGlyPSJzcmNfYW50LyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgotCQk8L2NvcHk+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2dlbmVyYXRvci1hbnQuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9nZW5lcmF0b3ItYW50LmphciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJjYjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0VjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjMxZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5Qcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVnaXN0cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCS8vIFRoZSBtYXBwaW5nIHJ1bGVzIGZvciBpbi1wbGFjZSBnZW5lcmF0aW9uIG5lZWQgdG8gY29uc3RydWN0IHBhdGhzIGludG8gdGhlIHN0cnVjdHVyZQotCS8vIG9mIGFuIGVjbGlwc2UgaW5zdGFsbGF0aW9uOyBpbiB0aGUgZnV0dXJlIHRoZSBkZWZhdWx0IGFydGlmYWN0IG1hcHBpbmcgZGVjbGFyZWQgaW4KLQkvLyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgbWF5IGNoYW5nZSwgZm9yIGV4YW1wbGUsIHRvIG5vdCBoYXZlIGEgJ2J1bmRsZXMnIGRpcmVjdG9yeQotCS8vIGluc3RlYWQgb2YgYSAncGx1Z2lucycgZGlyZWN0b3J5LCBzbyBhIHNlcGFyYXRlIGNvbnN0YW50IGlzIGRlZmluZWQgYW5kIHVzZWQgaGVyZS4KLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmdbXVtdIElOUExBQ0VfTUFQUElOR19SVUxFUyA9IHsgeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkgKGZvcm1hdD1wYWNrZWQpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIucGFjay5neiJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifSwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXsiKCYgKGNsYXNzaWZpZXI9b3NnaS5idW5kbGUpKSIsICIke3JlcG9Vcmx9L3BsdWdpbnMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifSwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXsiKCYgKGNsYXNzaWZpZXI9YmluYXJ5KSkiLCAiJHtyZXBvVXJsfS9iaW5hcnkvJHtpZH1fJHt2ZXJzaW9ufSJ9fTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUyA9ICJwdWJsaXNoUGFja0ZpbGVzQXNTaWJsaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBkZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25EZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyOwotCXByaXZhdGUgTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBkZWZhdWx0TWV0YWRhdGFNYW5hZ2VyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25EZWZhdWx0TWV0YWRhdGFNYW5hZ2VyOwotCXByaXZhdGUgSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1czsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uQnVzOwotCXByaXZhdGUgR2VuZXJhdG9yLkdlbmVyYXRvclJlc3VsdCBpbmNyZW1lbnRhbFJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUm9vdElVID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBtZXRhZGF0YUxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIG1ldGFkYXRhUmVwb05hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFJlcG9OYW1lOwotCXByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBhcmd1bWVudDsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlczsKLQlwcml2YXRlIFN0cmluZyBidW5kbGVzOwotCXByaXZhdGUgU3RyaW5nIGJhc2U7Ci0JLy93aGV0aGVyIHJlcG9zaXRvcnkgeG1sIGZpbGVzIHNob3VsZCBiZSBjb21wcmVzc2VkCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHJlc3MgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGUgZ2V0RXhlY3V0YWJsZU5hbWUoU3RyaW5nIGJhc2UsIEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUZpbGUgbG9jYXRpb24gPSBwcm92aWRlci5nZXRFeGVjdXRhYmxlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEZpbGUoYmFzZSwgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIuZ2V0RGVmYXVsdEV4ZWN1dGFibGVOYW1lKG51bGwpKTsKLQkJaWYgKGxvY2F0aW9uLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJcmV0dXJuIG5ldyBGaWxlKGJhc2UsIGxvY2F0aW9uLmdldFBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoIi1zb3VyY2UiLmVxdWFsc0lnbm9yZUNhc2Uob3BlcmF0aW9uKSkgLy8kTk9OLU5MUy0xJAotCQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShuZXcgRmlsZShhcmd1bWVudCkpOwotCQllbHNlIGlmICgiLWlucGxhY2UiLmVxdWFsc0lnbm9yZUNhc2Uob3BlcmF0aW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm92aWRlci5pbml0aWFsaXplKG5ldyBGaWxlKGFyZ3VtZW50KSk7Ci0JCQlpbml0aWFsaXplRm9ySW5wbGFjZShwcm92aWRlcik7Ci0JCX0gZWxzZSBpZiAoIi1jb25maWciLmVxdWFsc0lnbm9yZUNhc2Uob3BlcmF0aW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm92aWRlci5pbml0aWFsaXplKG5ldyBGaWxlKGFyZ3VtZW50KSwgbmV3IEZpbGUoYXJndW1lbnQsICJjb25maWd1cmF0aW9uIiksIGdldEV4ZWN1dGFibGVOYW1lKGFyZ3VtZW50LCBwcm92aWRlciksIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIi11cGRhdGVTaXRlIi5lcXVhbHNJZ25vcmVDYXNlKG9wZXJhdGlvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdmlkZXIuc2V0QWRkRGVmYXVsdElVcyhmYWxzZSk7Ci0JCQlwcm92aWRlci5pbml0aWFsaXplKG5ldyBGaWxlKGFyZ3VtZW50KSwgbnVsbCwgbnVsbCwgbmV3IEZpbGVbXSB7bmV3IEZpbGUoYXJndW1lbnQsICJwbHVnaW5zIil9LCBuZXcgRmlsZShhcmd1bWVudCwgImZlYXR1cmVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWluaXRpYWxpemVGb3JJbnBsYWNlKHByb3ZpZGVyKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChiYXNlICE9IG51bGwgJiYgYnVuZGxlcyAhPSBudWxsICYmIGZlYXR1cmVzICE9IG51bGwpCi0JCQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShuZXcgRmlsZShiYXNlKSwgbnVsbCwgbnVsbCwgbmV3IEZpbGVbXSB7bmV3IEZpbGUoYnVuZGxlcyl9LCBuZXcgRmlsZShmZWF0dXJlcykpOwotCQl9Ci0JCWluaXRpYWxpemVSZXBvc2l0b3JpZXMocHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQXJ0aWZhY3RSZXBvc2l0b3J5KEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5jb250ZXh0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgbG9jYXRpb247Ci0JCXRyeSB7Ci0JCQlsb2NhdGlvbiA9IG5ldyBVUkwoYXJ0aWZhY3RMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Mb2NhdGlvblVSTCwgYXJ0aWZhY3RMb2NhdGlvbikpOwotCQl9Ci0JCXRyeSB7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJCWlmICghcmVwb3NpdG9yeS5pc01vZGlmaWFibGUoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Ob3RXcml0YWJsZSwgbG9jYXRpb24pKTsKLQkJCXByb3ZpZGVyLnNldEFydGlmYWN0UmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKLQkJCWlmIChwcm92aWRlci5yZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzKCkpCi0JCQkJcmVwb3NpdG9yeS5zZXRQcm9wZXJ0eShQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghcHJvdmlkZXIuYXBwZW5kKCkpCi0JCQkJcmVwb3NpdG9yeS5yZW1vdmVBbGwoKTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0KLQkJLy8gCXRoZSBnaXZlbiByZXBvIGxvY2F0aW9uIGlzIG5vdCBhbiBleGlzdGluZyByZXBvIHNvIHdlIGhhdmUgdG8gY3JlYXRlIHNvbWV0aGluZwotCQkvLyBUT0RPIGZvciBub3cgY3JlYXRlIGEgU2ltcGxlIHJlcG8gYnkgZGVmYXVsdC4KLQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gYXJ0aWZhY3RSZXBvTmFtZSAhPSBudWxsID8gYXJ0aWZhY3RSZXBvTmFtZSA6IGFydGlmYWN0TG9jYXRpb24gKyAiIC0gYXJ0aWZhY3RzIjsgLy8kTk9OLU5MUy0xJAotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlc3VsdCA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgcmVwb3NpdG9yeU5hbWUsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlkpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVzdWx0LmdldExvY2F0aW9uKCkpOwotCQlwcm92aWRlci5zZXRBcnRpZmFjdFJlcG9zaXRvcnkocmVzdWx0KTsKLQkJcmVzdWx0LnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgY29tcHJlc3MpOwotCQlpZiAocHJvdmlkZXIucmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcygpKQotCQkJcmVzdWx0LnNldFByb3BlcnR5KFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUywgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYXJ0aWZhY3RSZXBvTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldE5hbWUoYXJ0aWZhY3RSZXBvTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZvcklucGxhY2UoRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJRmlsZSBsb2NhdGlvbiA9IHByb3ZpZGVyLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCWxvY2F0aW9uID0gcHJvdmlkZXIuZ2V0QnVuZGxlTG9jYXRpb25zKClbMF07Ci0JCXRyeSB7Ci0JCQltZXRhZGF0YUxvY2F0aW9uID0gbG9jYXRpb24udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJYXJ0aWZhY3RMb2NhdGlvbiA9IGxvY2F0aW9uLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG91Z2h0IG5vdCBoYXBwZW4uLi4KLQkJfQotCQlwcm92aWRlci5zZXRQdWJsaXNoQXJ0aWZhY3RSZXBvc2l0b3J5KHRydWUpOwotCQlwcm92aWRlci5zZXRQdWJsaXNoQXJ0aWZhY3RzKGZhbHNlKTsKLQkJcHJvdmlkZXIuc2V0TWFwcGluZ1J1bGVzKElOUExBQ0VfTUFQUElOR19SVUxFUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNZXRhZGF0YVJlcG9zaXRvcnkoRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgbG9jYXRpb247Ci0JCXRyeSB7Ci0JCQlsb2NhdGlvbiA9IG5ldyBVUkwobWV0YWRhdGFMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Mb2NhdGlvblVSTCwgYXJ0aWZhY3RMb2NhdGlvbikpOwotCQl9Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQkJaWYgKHJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJCS8vIGRvbid0IHNldCB0aGUgY29tcHJlc3MgZmxhZyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGZvcm1hdAotCQkJCS8vIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgcmVwb3NpdG9yeQotCQkJCWlmICghcmVwb3NpdG9yeS5pc01vZGlmaWFibGUoKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fbWV0YWRhdGFSZXBvTm90V3JpdGFibGUsIGxvY2F0aW9uKSk7Ci0JCQkJcHJvdmlkZXIuc2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9zaXRvcnkpOwotCQkJCWlmICghcHJvdmlkZXIuYXBwZW5kKCkpCi0JCQkJCXJlcG9zaXRvcnkucmVtb3ZlQWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCX0KLQotCQkvLyAJdGhlIGdpdmVuIHJlcG8gbG9jYXRpb24gaXMgbm90IGFuIGV4aXN0aW5nIHJlcG8gc28gd2UgaGF2ZSB0byBjcmVhdGUgc29tZXRoaW5nCi0JCS8vIFRPRE8gZm9yIG5vdyBjcmVhdGUgYSByYW5kb20gcmVwbyBieSBkZWZhdWx0LgotCQlTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPSBtZXRhZGF0YVJlcG9OYW1lID09IG51bGwgPyBtZXRhZGF0YUxvY2F0aW9uICsgIiAtIG1ldGFkYXRhIiA6IG1ldGFkYXRhUmVwb05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXN1bHQgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sIHJlcG9zaXRvcnlOYW1lLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlc3VsdC5nZXRMb2NhdGlvbigpKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCBjb21wcmVzcyk7Ci0JCQlpZiAobWV0YWRhdGFSZXBvTmFtZSAhPSBudWxsKQotCQkJCXJlc3VsdC5zZXROYW1lKG1ldGFkYXRhUmVwb05hbWUpOwotCQkJcHJvdmlkZXIuc2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlcG9zaXRvcmllcyhFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWluaXRpYWxpemVBcnRpZmFjdFJlcG9zaXRvcnkocHJvdmlkZXIpOwotCQlpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0JCQljb21wcmVzcyA9ICJ0cnVlIjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzQ29tbWFuZExpbmVBcmd1bWVudHMoU3RyaW5nW10gYXJncywgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLXB1Ymxpc2hBcnRpZmFjdHMiKSB8fCBhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1wYSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwcm92aWRlci5zZXRQdWJsaXNoQXJ0aWZhY3RzKHRydWUpOwotCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItcHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeSIpIHx8IGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLXBhciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwcm92aWRlci5zZXRQdWJsaXNoQXJ0aWZhY3RSZXBvc2l0b3J5KHRydWUpOwotCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItYXBwZW5kIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlci5zZXRBcHBlbmQodHJ1ZSk7Ci0KLQkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1ub0RlZmF1bHRJVXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLnNldEFkZERlZmF1bHRJVXMoZmFsc2UpOwotCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItY29tcHJlc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbXByZXNzID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1yZXVzZVBhY2syMDBGaWxlcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJcHJvdmlkZXIucmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcyh0cnVlKTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgaWYgdGhlIG5leHQgb25lCi0JCQkvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoIGEgcGFybSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItc291cmNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wZXJhdGlvbiA9IGFyZ3NbaSAtIDFdOwotCQkJCWFyZ3VtZW50ID0gYXJnOwotCQkJfQotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWlucGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJb3BlcmF0aW9uID0gYXJnc1tpIC0gMV07Ci0JCQkJYXJndW1lbnQgPSBhcmc7Ci0JCQl9Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItY29uZmlnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wZXJhdGlvbiA9IGFyZ3NbaSAtIDFdOwotCQkJCWFyZ3VtZW50ID0gYXJnOwotCQkJfQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi11cGRhdGVTaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wZXJhdGlvbiA9IGFyZ3NbaSAtIDFdOwotCQkJCWFyZ3VtZW50ID0gYXJnOwotCQkJfQotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWV4ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcHJvdmlkZXIuc2V0RXhlY3V0YWJsZUxvY2F0aW9uKGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItbGF1bmNoZXJDb25maWciKSkgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLnNldExhdW5jaGVyQ29uZmlnKGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItbWV0YWRhdGFSZXBvc2l0b3J5IikgfHwgYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLW1yIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1ldGFkYXRhTG9jYXRpb24gPSBhcmc7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItbWV0YWRhdGFSZXBvc2l0b3J5TmFtZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJbWV0YWRhdGFSZXBvTmFtZSA9IGFyZzsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnkiKSB8IGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhcnRpZmFjdExvY2F0aW9uID0gYXJnOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLWFydGlmYWN0UmVwb3NpdG9yeU5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWFydGlmYWN0UmVwb05hbWUgPSBhcmc7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZmxhdm9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlci5zZXRGbGF2b3IoYXJnKTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1wcm9kdWN0RmlsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcHJvdmlkZXIuc2V0UHJvZHVjdEZpbGUoYXJnKTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1mZWF0dXJlcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJZmVhdHVyZXMgPSBhcmc7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItYnVuZGxlcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJYnVuZGxlcyA9IGFyZzsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1iYXNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQliYXNlID0gYXJnOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXJvb3QiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLnNldFJvb3RJZChhcmcpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXJvb3RWZXJzaW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlci5zZXRSb290VmVyc2lvbihhcmcpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXAyLm9zIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlci5zZXRPUyhhcmcpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXNpdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLnNldFNpdGVMb2NhdGlvbihuZXcgVVJMKGFyZykpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdEFydGlmYWN0UmVwb01hbmFnZXIoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGRlZmF1bHRBcnRpZmFjdE1hbmFnZXIsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdE1ldGFkYXRhUmVwb01hbmFnZXIoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0TWV0YWRhdGFNYW5hZ2VyID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGRlZmF1bHRNZXRhZGF0YU1hbmFnZXIsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRXZlbnRCdXMoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSkgPT0gbnVsbCkgewotCQkJYnVzID0gbmV3IFByb3Zpc2lvbmluZ0V2ZW50QnVzKCk7Ci0JCQlyZWdpc3RyYXRpb25CdXMgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FLCBidXMsIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBydW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb2Nlc3NDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdzLCBwcm92aWRlcik7Ci0JCU9iamVjdCByZXN1bHQgPSBydW4ocHJvdmlkZXIpOwotCQlpZiAocmVzdWx0ICE9IElBcHBsaWNhdGlvbi5FWElUX09LKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihhcmdzW2ldKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJ1bihFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdGVyRXZlbnRCdXMoKTsKLQkJcmVnaXN0ZXJEZWZhdWx0TWV0YWRhdGFSZXBvTWFuYWdlcigpOwotCQlyZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCk7Ci0JCWluaXRpYWxpemUocHJvdmlkZXIpOwotCi0JCWlmIChwcm92aWRlci5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsICYmIHByb3ZpZGVyLmdldFByb2R1Y3RGaWxlKCkgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmV4Y2VwdGlvbl9iYXNlTG9jYXRpb25Ob3RTcGVjaWZpZWQpOwotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKC0xKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMubWVzc2FnZV9nZW5lcmF0aW5nTWV0YWRhdGEsIHByb3ZpZGVyLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0KLQkJbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEdlbmVyYXRvcihwcm92aWRlcik7Ci0KLQkJaWYgKGluY3JlbWVudGFsUmVzdWx0ICE9IG51bGwpCi0JCQlnZW5lcmF0b3Iuc2V0SW5jcmVtZW50YWxSZXN1bHQoaW5jcmVtZW50YWxSZXN1bHQpOwotCQlnZW5lcmF0b3Iuc2V0R2VuZXJhdGVSb290SVUoZ2VuZXJhdGVSb290SVUpOwotCQlJU3RhdHVzIHJlc3VsdCA9IGdlbmVyYXRvci5nZW5lcmF0ZSgpOwotCi0JCWluY3JlbWVudGFsUmVzdWx0ID0gbnVsbDsKLQkJbG9uZyBhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAocmVzdWx0LmlzT0soKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLm1lc3NhZ2VfZ2VuZXJhdGlvbkNvbXBsZXRlZCwgU3RyaW5nLnZhbHVlT2YoKGFmdGVyIC0gYmVmb3JlKSAvIDEwMDApKSk7Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0JCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBydW4oKFN0cmluZ1tdKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25EZWZhdWx0TWV0YWRhdGFNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXIudW5yZWdpc3RlcigpOwotCQkJcmVnaXN0cmF0aW9uRGVmYXVsdE1ldGFkYXRhTWFuYWdlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmVnaXN0cmF0aW9uRGVmYXVsdEFydGlmYWN0TWFuYWdlci51bnJlZ2lzdGVyKCk7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyID0gbnVsbDsKLQkJfQotCQlpZiAocmVnaXN0cmF0aW9uQnVzICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJhdGlvbkJ1cy51bnJlZ2lzdGVyKCk7Ci0JCQlyZWdpc3RyYXRpb25CdXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZShTdHJpbmcgYmFzZSkgewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMuYXJ0aWZhY3RMb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZXMoU3RyaW5nIGJ1bmRsZXMpIHsKLQkJdGhpcy5idW5kbGVzID0gYnVuZGxlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGFyZ3VtZW50KSB7Ci0JCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQl0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoU3RyaW5nIGZlYXR1cmVzKSB7Ci0JCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLm1ldGFkYXRhTG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnRhbFJlc3VsdChHZW5lcmF0b3IuR2VuZXJhdG9yUmVzdWx0IGl1cykgewotCQl0aGlzLmluY3JlbWVudGFsUmVzdWx0ID0gaXVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvclJvb3RJVShib29sZWFuIGIpIHsKLQkJdGhpcy5nZW5lcmF0ZVJvb3RJVSA9IGI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGFjZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZXJyb3JDb252ZXJ0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9vdXRwdXRTdHJlYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Vycm9yUGFyc2luZ1VwZGF0ZVNpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX3N0YXRlQWRkaXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX3NvdXJjZURpcmVjdG9yeUludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2FydGlmYWN0UmVwb0xvY2F0aW9uVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Ob3RXcml0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fbWV0YWRhdGFSZXBvTG9jYXRpb25VUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX21ldGFkYXRhUmVwb05vdFdyaXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9iYXNlTG9jYXRpb25Ob3RTcGVjaWZpZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlX2dlbmVyYXRpbmdNZXRhZGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlX2dlbmVyYXRpb25Db21wbGV0ZWQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL1Byb2R1Y3RRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvUHJvZHVjdFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODZkNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvUHJvZHVjdFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcy5Qcm9kdWN0RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yLkdlbmVyYXRvclJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0UXVlcnkgZXh0ZW5kcyBRdWVyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlOT1hfTEFVTkNIRVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgUHJvZHVjdEZpbGUgcHJvZHVjdDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmbGF2b3I7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgY2hpbGRyZW4gPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb25BZHZpY2U7Ci0KLQkvLyBDb2xsZWN0b3IgY29sbGVjdHMgdGhlIGxhcmdlc3QgdmVyc2lvbiBvZiBlYWNoIElVCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpIHsKLQkJcHJpdmF0ZSBmaW5hbCBIYXNoTWFwIGVsZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJCWlmIChlbGVtZW50cy5jb250YWluc0tleShpdS5nZXRJZCgpKSkgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgZXhpc3RpbmcgPSAoSUluc3RhbGxhYmxlVW5pdCkgZWxlbWVudHMuZ2V0KGl1LmdldElkKCkpOwotCQkJCWlmIChleGlzdGluZy5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKGl1LmdldFZlcnNpb24oKSkgPj0gMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZ2V0TGlzdCgpLnJlbW92ZShleGlzdGluZyk7Ci0JCQl9Ci0JCQllbGVtZW50cy5wdXQoaXUuZ2V0SWQoKSwgaXUpOwotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBQcm9kdWN0UXVlcnkoUHJvZHVjdEZpbGUgcHJvZHVjdCwgU3RyaW5nIGZsYXZvciwgTWFwIGNvbmZpZ0lVcywgU3RyaW5nIHZlcnNpb25BZHZpY2UpIHsKLQkJdGhpcy5wcm9kdWN0ID0gcHJvZHVjdDsKLQkJdGhpcy5mbGF2b3IgPSBmbGF2b3I7Ci0JCXRoaXMudmVyc2lvbkFkdmljZSA9IHZlcnNpb25BZHZpY2U7Ci0JCWluaXRpYWxpemUoY29uZmlnSVVzKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIGdldENvbGxlY3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdG9yOwotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkVmVyc2lvbnMoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJCXByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHN0cmVhbSAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vbm90aGluZwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoTWFwIGNvbmZpZ0lVcykgewotCQlib29sZWFuIGZlYXR1cmVzID0gcHJvZHVjdC51c2VGZWF0dXJlcygpOwotCQlQcm9wZXJ0aWVzIHZlcnNpb25zID0gbG9hZFZlcnNpb25zKHZlcnNpb25BZHZpY2UpOwotCi0JCUxpc3QgY29udGVudHMgPSBmZWF0dXJlcyA/IHByb2R1Y3QuZ2V0RmVhdHVyZXMoKSA6IHByb2R1Y3QuZ2V0UGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGl0ZW0gPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlOwotCQkJaWYgKHZlcnNpb25zLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQkJVmVyc2lvbiB2YWx1ZSA9IG5ldyBWZXJzaW9uKHZlcnNpb25zLmdldFByb3BlcnR5KGl0ZW0pKTsKLQkJCQlyYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UodmFsdWUsIHRydWUsIHZhbHVlLCB0cnVlKTsKLQkJCX0KLQotCQkJaWYgKGZlYXR1cmVzKSAvLyBmb3IgZmVhdHVyZXMgd2Ugd2FudCB0aGUgZ3JvdXAKLQkJCQlpdGVtID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2V0VHJhbnNmb3JtZWRJZChpdGVtLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkJCWNoaWxkcmVuLnB1dChpdGVtLCByYW5nZSk7Ci0JCQlpZiAoY29uZmlnSVVzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdXMgPSAoKFNldCkgY29uZmlnSVVzLmdldChpdGVtKSkuaXRlcmF0b3IoKTsgaXVzLmhhc05leHQoKTspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBvYmplY3QgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXVzLm5leHQoKTsKLQkJCQkJY2hpbGRyZW4ucHV0KG9iamVjdC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKG9iamVjdC5nZXRWZXJzaW9uKCksIHRydWUsIG9iamVjdC5nZXRWZXJzaW9uKCksIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvL2Fsc28gaW5jbHVkZSB0aGUgbGF1bmNoZXIgQ1UgZnJhZ21lbnRzIGFzIGEgd29ya2Fyb3VuZCB0byBidWcgMjE4ODkwCi0JCVN0cmluZyBsYXVuY2hlclByZWZpeCA9IHByb2R1Y3QuZ2V0SWQoKSArICIubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb25maWdJVXMuY29udGFpbnNLZXkobGF1bmNoZXJQcmVmaXgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl1cyA9ICgoU2V0KSBjb25maWdJVXMuZ2V0KGxhdW5jaGVyUHJlZml4KSkuaXRlcmF0b3IoKTsgaXVzLmhhc05leHQoKTspIHsKLQkJCQlJSW5zdGFsbGFibGVVbml0IG9iamVjdCA9IChJSW5zdGFsbGFibGVVbml0KSBpdXMubmV4dCgpOwotCQkJCWNoaWxkcmVuLnB1dChvYmplY3QuZ2V0SWQoKSwgbmV3IFZlcnNpb25SYW5nZShvYmplY3QuZ2V0VmVyc2lvbigpLCB0cnVlLCBvYmplY3QuZ2V0VmVyc2lvbigpLCB0cnVlKSk7Ci0JCQl9Ci0JCX0KLQotCQkvL2Fsc28gYWRkIHRoZSBsYXVuY2hlci5qYXIKLQkJaWYgKCFjaGlsZHJlbi5jb250YWluc0tleShFUVVJTk9YX0xBVU5DSEVSKSkgewotCQkJY2hpbGRyZW4ucHV0KEVRVUlOT1hfTEFVTkNIRVIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKTsKLQkJCWNoaWxkcmVuLnB1dChmbGF2b3IgKyBFUVVJTk9YX0xBVU5DSEVSLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSk7Ci0JCX0KLQotCQkvLyBhbmQgbGF1bmNoZXIgZnJhZ21lbnQgQ1VzCi0JCWlmIChjb25maWdJVXMuY29udGFpbnNLZXkoRVFVSU5PWF9MQVVOQ0hFUikpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXVzID0gKChTZXQpIGNvbmZpZ0lVcy5nZXQoRVFVSU5PWF9MQVVOQ0hFUikpLml0ZXJhdG9yKCk7IGl1cy5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBvYmplY3QgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXVzLm5leHQoKTsKLQkJCQljaGlsZHJlbi5wdXQob2JqZWN0LmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2Uob2JqZWN0LmdldFZlcnNpb24oKSwgdHJ1ZSwgb2JqZWN0LmdldFZlcnNpb24oKSwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmVhdHVyZSBiYXNlZCBwcm9kdWN0LCBpbmRpdmlkdWFsIGJ1bmRsZSBjb25maWcgQ1VzIGFyZSB1bmRlciBDT05GSUdVUkFUSU9OX0NVUyBmb3IgY29udmVuaWVuY2UKLQkJaWYgKGZlYXR1cmVzICYmIGNvbmZpZ0lVcy5jb250YWluc0tleShHZW5lcmF0b3JSZXN1bHQuQ09ORklHVVJBVElPTl9DVVMpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl1cyA9ICgoU2V0KSBjb25maWdJVXMuZ2V0KEdlbmVyYXRvclJlc3VsdC5DT05GSUdVUkFUSU9OX0NVUykpLml0ZXJhdG9yKCk7IGl1cy5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBvYmplY3QgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXVzLm5leHQoKTsKLQkJCQljaGlsZHJlbi5wdXQob2JqZWN0LmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2Uob2JqZWN0LmdldFZlcnNpb24oKSwgdHJ1ZSwgb2JqZWN0LmdldFZlcnNpb24oKSwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeSNpc01hdGNoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJVmVyc2lvblJhbmdlIHJhbmdlID0gKFZlcnNpb25SYW5nZSkgY2hpbGRyZW4uZ2V0KGNhbmRpZGF0ZS5nZXRJZCgpKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCXJldHVybiByYW5nZS5pc0luY2x1ZGVkKGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9EZWZhdWx0U2l0ZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmRhMDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5VUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFBhcnNlcyBhIHNpdGUueG1sIGZpbGUuCi0gKiBUaGlzIGNsYXNzIHdhcyBpbml0aWFsbHkgY29waWVkIGZyb20gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRGVmYXVsdFNpdGVQYXJzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2l0ZVBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9ERUYgPSAiY2F0ZWdvcnktZGVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRFX1NJVEVTID0gImFzc29jaWF0ZVNpdGVzIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVEVfU0lURSA9ICJhc3NvY2lhdGVTaXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lORk9fVVJMID0gImluZGV4Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlSUk9SID0gIm1pcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEFjdGl2YXRvci5JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FSQ0hJVkUgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQVRFR09SWSA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NBVEVHT1JZX0RFRiA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgPSA2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GRUFUVVJFID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSUdOT1JFRF9FTEVNRU5UID0gLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOSVRJQUwgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TSVRFID0gMTsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IGZhbHNlOwotCS8vIEN1cnJlbnQgb2JqZWN0IHN0YWNrICh1c2VkIHRvIGhvbGQgdGhlIGN1cnJlbnQgb2JqZWN0IHdlIGFyZQotCS8vIHBvcHVsYXRpbmcgaW4gdGhpcyBwbHVnaW4gZGVzY3JpcHRvcgotCVN0YWNrIG9iamVjdFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0KLQkvLyBDdXJyZW50IFN0YXRlIEluZm9ybWF0aW9uCi0JU3RhY2sgc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBzdGF0dXM7Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKLQkJVHJhY2luZy5kZWJ1ZygiRGVmYXVsdFNpdGVQYXJzZXI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vCXByaXZhdGUgc3RhdGljIFVSTEVudHJ5W10gZ2V0QXNzb2NpYXRlU2l0ZXMoU3RyaW5nIGFzc29jaWF0ZVNpdGVzVVJMKSB7Ci0JLy8KLQkvLwkJdHJ5IHsKLQkvLwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9tRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkvLwkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZG9tRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkvLwkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShhc3NvY2lhdGVTaXRlc1VSTCk7Ci0JLy8JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkvLwkJCQlyZXR1cm4gbnVsbDsKLQkvLwkJCU5vZGVMaXN0IG1pcnJvck5vZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQVNTT0NJQVRFX1NJVEUpOwotCS8vCQkJVVJMRW50cnlbXSBtaXJyb3JzID0gbmV3IFVSTEVudHJ5W21pcnJvck5vZGVzLmdldExlbmd0aCgpXTsKLQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCS8vCQkJCUVsZW1lbnQgbWlycm9yTm9kZSA9IChFbGVtZW50KSBtaXJyb3JOb2Rlcy5pdGVtKGkpOwotCS8vCQkJCW1pcnJvcnNbaV0gPSBuZXcgVVJMRW50cnkoKTsKLQkvLwkJCQlTdHJpbmcgaW5mb1VSTCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCS8vCQkJCVN0cmluZyBsYWJlbCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JLy8JCQkJbWlycm9yc1tpXS5zZXRVUkwoaW5mb1VSTCk7Ci0JLy8JCQkJbWlycm9yc1tpXS5zZXRBbm5vdGF0aW9uKGxhYmVsKTsKLQkvLwotCS8vCQkJCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCS8vCQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIG1pcnJvcjogdXJsOiIgKyBpbmZvVVJMICsgIiBsYWJlbDoiICsgbGFiZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLwkJCX0KLQkvLwkJCXJldHVybiBtaXJyb3JzOwotCS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCS8vCQkJLy8gbG9nIGlmIGFic29sdXRlIHVybAotCS8vCQkJaWYgKGFzc29jaWF0ZVNpdGVzVVJMICE9IG51bGwgJiYgKGFzc29jaWF0ZVNpdGVzVVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JLy8JCQkJCXx8IGFzc29jaWF0ZVNpdGVzVVJMLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JLy8JCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJqYXI6Ly8iKSkpIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQlsb2coTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfbWlycm9ycywgZSk7Ci0JLy8JCQlyZXR1cm4gbnVsbDsKLQkvLwkJfQotCS8vCX0KLQotCXN0YXRpYyBVUkxFbnRyeVtdIGdldE1pcnJvcnMoU3RyaW5nIG1pcnJvcnNVUkwpIHsKLQotCQl0cnkgewotCQkJU3RyaW5nIGNvdW50cnlDb2RlID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkudG9Mb3dlckNhc2UoKTsKLQkJCWludCB0aW1lWm9uZSA9IChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSkuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSAvICg2MCAqIDYwICogMTAwMCk7Ci0KLQkJCWlmIChtaXJyb3JzVVJMLmluZGV4T2YoIj8iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbWlycm9yc1VSTCA9IG1pcnJvcnNVUkwgKyAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWlycm9yc1VSTCA9IG1pcnJvcnNVUkwgKyAiPyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgImNvdW50cnlDb2RlPSIgKyBjb3VudHJ5Q29kZSArICImdGltZVpvbmU9IiArIHRpbWVab25lICsgIiZyZXNwb25zZVR5cGU9eG1sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb21GYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG1pcnJvcnNVUkwpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlOb2RlTGlzdCBtaXJyb3JOb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKE1JUlJPUik7Ci0JCQlVUkxFbnRyeVtdIG1pcnJvcnMgPSBuZXcgVVJMRW50cnlbbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXJyb3JOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBtaXJyb3JOb2RlID0gKEVsZW1lbnQpIG1pcnJvck5vZGVzLml0ZW0oaSk7Ci0JCQkJbWlycm9yc1tpXSA9IG5ldyBVUkxFbnRyeSgpOwotCQkJCVN0cmluZyBpbmZvVVJMID0gbWlycm9yTm9kZS5nZXRBdHRyaWJ1dGUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGxhYmVsID0gbWlycm9yTm9kZS5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQltaXJyb3JzW2ldLnNldFVSTChpbmZvVVJMKTsKLQkJCQltaXJyb3JzW2ldLnNldEFubm90YXRpb24obGFiZWwpOwotCi0JCQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQkJCWRlYnVnKCJQcm9jZXNzZWQgbWlycm9yOiB1cmw6IiArIGluZm9VUkwgKyAiIGxhYmVsOiIgKyBsYWJlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIG1pcnJvcnM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgaWYgYWJzb2x1dGUgdXJsCi0JCQlpZiAobWlycm9yc1VSTCAhPSBudWxsICYmIChtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImphcjovLyIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnMsIGUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJJbnRlcm5hbCBFcnJvciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGVycm9yKSB7Ci0JCUxvZ0hlbHBlci5sb2coZXJyb3IpOwotCX0KLQotCXN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBzaXRlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNpdGVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN0YXRlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJb2JqZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJc3RhdHVzID0gbnVsbDsKLQkJREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQl9Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiQ3JlYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSGFuZGxlIGNoYXJhY3RlciB0ZXh0Ci0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQkJLy9vbmx5IHB1c2ggaWYgZGVzY3JpcHRpb24KLQkJaW50IHN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJaWYgKHN0YXRlID09IFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgfHwgc3RhdGUgPT0gU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGKQotCQkJb2JqZWN0U3RhY2sucHVzaCh0ZXh0KTsKLQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBlbmQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlVUkxFbnRyeSBpbmZvID0gbnVsbDsKLQotCQlpbnQgc3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNUQVRFX0lHTk9SRURfRUxFTUVOVCA6Ci0JCQljYXNlIFNUQVRFX0FSQ0hJVkUgOgotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQlpbnRlcm5hbEVycm9yKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1BhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfU0lURSA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJCXNpdGUuZ2V0RGVzY3JpcHRpb24oKS5zZXRBbm5vdGF0aW9uKHRleHQpOwotCQkJCX0KLQkJCQkvL2RvIG5vdCBwb3AgdGhlIG9iamVjdAotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOgotCQkJCXN0YXRlU3RhY2sucG9wKCk7Ci0JCQkJb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJCWNhdGVnb3J5LnNldERlc2NyaXB0aW9uKHRleHQpOwotCQkJCX0KLQkJCQlvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJLy8gYWRkIHRleHQsIHByZXNlcnZpbmcgYXQgbW9zdCBvbmUgc3BhY2UgYmV0d2VlbiB0ZXh0IGZyYWdtZW50cwotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7Ci0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7Ci0JCQkJCWlmIChsZWFkaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0KLQkJCQlpbmZvID0gKFVSTEVudHJ5KSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7Ci0KLQkJCQlTaXRlTW9kZWwgc2l0ZU1vZGVsID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOwotCQkJCS8vIG92ZXJyaWRlIGRlc2NyaXB0aW9uLgotCQkJCS8vIGRvIG5vdCByYWlzZSBlcnJvciBhcyBwcmV2aW91cyBkZXNjcmlwdGlvbiBtYXkgYmUgZGVmYXVsdCBvbmUKLQkJCQkvLyB3aGVuIHBhcnNpbmcgc2l0ZSB0YWcKLQkJCQlpZiAoREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4pCi0JCQkJCWRlYnVnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0LCAobmV3IFN0cmluZ1tdIHtnZXRTdGF0ZShzdGF0ZSl9KSkpOwotCQkJCXNpdGVNb2RlbC5zZXREZXNjcmlwdGlvbihpbmZvKTsKLQkJCQlERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJLy8gYWRkIHRleHQsIHByZXNlcnZpbmcgYXQgbW9zdCBvbmUgc3BhY2UgYmV0d2VlbiB0ZXh0IGZyYWdtZW50cwotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7Ci0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7Ci0JCQkJCWlmIChsZWFkaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0KLQkJCQlpbmZvID0gKFVSTEVudHJ5KSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7Ci0KLQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLQkJCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldCwgKG5ldyBTdHJpbmdbXSB7Z2V0U3RhdGUoc3RhdGUpLCBjYXRlZ29yeS5nZXRMYWJlbCgpfSkpKTsKLQkJCQllbHNlCi0JCQkJCWNhdGVnb3J5LnNldERlc2NyaXB0aW9uKGluZm8uZ2V0QW5ub3RhdGlvbigpKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGUsIChuZXcgU3RyaW5nW10ge2dldFN0YXRlKHN0YXRlKX0pKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJFbmQgRWxlbWVudDoiICsgdXJpICsgIjoiICsgbG9jYWxOYW1lICsgIjoiICsgcU5hbWUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoKLQkgKiBIYW5kbGVzIGFuIGVycm9yIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3RhdHVzLiAgVGhlIGNvbGxlY3Rpb24gb2YgYWxsIGxvZ2dlZCBzdGF0dXMKLQkgKiBvYmplY3RzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyA8Y29kZT5nZXRTdGF0dXMoKTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZXJyb3IgYSBzdGF0dXMgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXJyb3IoSVN0YXR1cyBlcnJvcikgewotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZSwgbnVsbCk7Ci0JCX0KLQotCQlzdGF0dXMuYWRkKGVycm9yKTsKLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlMb2dIZWxwZXIubG9nKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZXJyb3JzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJbG9nU3RhdHVzKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZmF0YWwgZXJyb3JzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlsb2dTdGF0dXMoZXgpOwotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKgotCSAqIHJldHVybiB0aGUgc3RhdGUgYXMgU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0KLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOgotCQkJCXJldHVybiAiSWdub3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQlyZXR1cm4gIkluaXRpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfU0lURSA6Ci0JCQkJcmV0dXJuICJTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOgotCQkJCXJldHVybiAiRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoKLQkJCQlyZXR1cm4gIkFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOgotCQkJCXJldHVybiAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoKLQkJCQlyZXR1cm4gIkNhdGVnb3J5IERlZiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgOgotCQkJCXJldHVybiAiRGVzY3JpcHRpb24gLyBDYXRlZ29yeSBEZWYiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA6Ci0JCQkJcmV0dXJuICJEZXNjcmlwdGlvbiAvIFNpdGUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhdGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBzdGF0dXMgb2JqZWN0cyBhY2N1bXVsYXRlZCBieSB0aGUgcGFyc2VyLgotCSAqCi0JICogQHJldHVybiBtdWx0aS1zdGF0dXMgY29udGFpbmluZyBhY2N1bXVsYXRlZCBzdGF0dXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgTXVsdGlTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeURlZlN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7Ci0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7Ci0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOwotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhdGVnb3J5U3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7Ci0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7Ci0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7Ci0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOwotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWSkpOwotCQkJcHJvY2Vzc0NhdGVnb3J5KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUZlYXR1cmVTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUpKTsKLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsKLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0FSQ0hJVkUpKTsKLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUllfREVGKSk7Ci0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZKSk7Ci0JCQlwcm9jZXNzQ2F0ZWdvcnkoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQsIChuZXcgU3RyaW5nW10ge2VsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSW5pdGlhbFN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhTSVRFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1NJVEUpKTsKLQkJCXByb2Nlc3NTaXRlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgewotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQsIChuZXcgU3RyaW5nW10ge2VsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQkJCS8vIHdoYXQgd2UgcmVjZWl2ZWQgd2FzIG5vdCBhIHNpdGUueG1sLCBubyBuZWVkIHRvIGNvbnRpbnVlCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0ludmFsaWRYTUxTdHJlYW0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2l0ZVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fU0lURSkpOwotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOwotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOwotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudCwgKG5ldyBTdHJpbmdbXSB7ZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yVW5rbm93blRhZyhTdHJpbmcgbXNnKSB7Ci0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JR05PUkVEX0VMRU1FTlQpKTsKLQkJaW50ZXJuYWxFcnJvcihtc2cpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsZWFkaW5nU3BhY2UoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyLmxlbmd0aCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KDApKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2dTdGF0dXMoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG5hbWUgPSBleC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxICsgbmFtZS5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBtc2c7Ci0JCWlmIChuYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZywgKG5ldyBTdHJpbmdbXSB7ZXguZ2V0TWVzc2FnZSgpfSkpOwotCQllbHNlIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7bmFtZSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRMaW5lTnVtYmVyKCkpLCBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldENvbHVtbk51bWJlcigpKSwgZXguZ2V0TWVzc2FnZSgpfTsKLQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2UsIHZhbHVlcyk7Ci0JCX0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1zZywgZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBpbnB1dCBzdGVhbSBhbmQgY29uc3RydWN0cyBhIHNpdGUgbW9kZWwuCi0JICogVGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbAotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTklUSUFMKSk7Ci0JCWN1cnJlbnRTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7Ci0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJaWYgKG9iamVjdFN0YWNrLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfTm9TaXRlVGFnKTsKLQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFNpdGVNb2RlbCkgewotCQkJcmV0dXJuIChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOwotCQl9Ci0JCVN0cmluZyBzdGFjayA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RTdGFjay5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXN0YWNrID0gc3RhY2sgKyBpdGVyLm5leHQoKS50b1N0cmluZygpICsgIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaywgKG5ldyBTdHJpbmdbXSB7c3RhY2t9KSkpOwotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgYXJjaGl2ZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBcmNoaXZlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlVUkxFbnRyeSBhcmNoaXZlID0gbmV3IFVSTEVudHJ5KCk7Ci0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX01pc3NpbmcsIChuZXcgU3RyaW5nW10geyJwYXRoIiwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFyY2hpdmUuc2V0QW5ub3RhdGlvbihpZCk7Ci0KLQkJU3RyaW5nIHVybCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgPT0gbnVsbCB8fCB1cmwudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9NaXNzaW5nLCAobmV3IFN0cmluZ1tdIHsiYXJjaGl2ZSIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlhcmNoaXZlLnNldFVSTCh1cmwpOwotCi0JCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJCXNpdGUuYWRkQXJjaGl2ZShhcmNoaXZlKTsKLQkJfQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJFbmQgcHJvY2Vzc2luZyBBcmNoaXZlOiBwYXRoOiIgKyBpZCArICIgdXJsOiIgKyB1cmwpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyogCi0JICogcHJvY2VzcyB0aGUgQ2F0ZWdvcnkgIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGVnb3J5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgY2F0ZWdvcnkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJU2l0ZUZlYXR1cmUgZmVhdHVyZSA9IChTaXRlRmVhdHVyZSkgb2JqZWN0U3RhY2sucGVlaygpOwotCQlmZWF0dXJlLmFkZENhdGVnb3J5TmFtZShjYXRlZ29yeSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3NpbmcgQ2F0ZWdvcnk6IG5hbWU6IiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgY2F0ZWdvcnkgZGVmIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGVnb3J5RGVmKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgU2l0ZUNhdGVnb3J5KCk7Ci0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJY2F0ZWdvcnkuc2V0TmFtZShuYW1lKTsKLQkJY2F0ZWdvcnkuc2V0TGFiZWwobGFiZWwpOwotCi0JCVNpdGVNb2RlbCBzaXRlID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOwotCQlzaXRlLmFkZENhdGVnb3J5KGNhdGVnb3J5KTsKLQkJb2JqZWN0U3RhY2sucHVzaChjYXRlZ29yeSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3NpbmcgQ2F0ZWdvcnlEZWY6IG5hbWU6IiArIG5hbWUgKyAiIGxhYmVsOiIgKyBsYWJlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgZmVhdHVyZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTaXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFNpdGVGZWF0dXJlKCk7Ci0KLQkJLy8gZmVhdHVyZSBsb2NhdGlvbiBvbiB0aGUgc2l0ZQotCQlTdHJpbmcgdXJsSW5mbyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiBub1VSTCA9ICh1cmxJbmZvID09IG51bGwgfHwgdXJsSW5mby50cmltKCkuZXF1YWxzKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBub0lkID0gKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gbm9WZXJzaW9uID0gKHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBXZSBuZWVkIHRvIGhhdmUgaWQgYW5kIHZlcnNpb24sIG9yIHRoZSB1cmwsIG9yIGJvdGguCi0JCWlmIChub1VSTCkgewotCQkJaWYgKG5vSWQgfHwgbm9WZXJzaW9uKQotCQkJCWludGVybmFsRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZywgKG5ldyBTdHJpbmdbXSB7InVybCIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJLy8gZGVmYXVsdCB1cmwKLQkJCQl1cmxJbmZvID0gRkVBVFVSRVMgKyBpZCArICdfJyArIHZlcjsgLy8gCi0JCX0KLQotCQlmZWF0dXJlLnNldFVSTFN0cmluZyh1cmxJbmZvKTsKLQotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFR5cGUodHlwZSk7Ci0KLQkJLy8gaWYgb25lIGlzIG51bGwsIGFuZCBub3QgdGhlIG90aGVyCi0JCWlmIChub0lkIF4gbm9WZXJzaW9uKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10ge2lkLCB2ZXIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9OwotCQkJbG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZCwgdmFsdWVzKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlLnNldEZlYXR1cmVJZGVudGlmaWVyKGlkKTsKLQkJCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24odmVyKTsKLQkJfQotCi0JCS8vIGdldCBsYWJlbCBpZiBpdCBleGlzdHMKLQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJaWYgKCIiLmVxdWFscyhsYWJlbC50cmltKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJbGFiZWwgPSBudWxsOwotCQl9Ci0JCWZlYXR1cmUuc2V0TGFiZWwobGFiZWwpOwotCi0JCS8vIE9TCi0JCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRPUyhvcyk7Ci0KLQkJLy8gV1MKLQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFdTKHdzKTsKLQotCQkvLyBOTAotCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCi0JCWZlYXR1cmUuc2V0TkwobmwpOwotCi0JCS8vIGFyY2gKLQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRBcmNoKGFyY2gpOwotCi0JCS8vcGF0Y2gKLQkJU3RyaW5nIHBhdGNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0Y2giKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFBhdGNoKHBhdGNoKTsKLQotCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJc2l0ZS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQlmZWF0dXJlLnNldFNpdGVNb2RlbChzaXRlKTsKLQotCQlvYmplY3RTdGFjay5wdXNoKGZlYXR1cmUpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmxJbmZvICsgIiB0eXBlOiIgKyB0eXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIFVSTCBpbmZvIHdpdGggZWxlbWVudCB0ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmZvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlVUkxFbnRyeSBpbmYgPSBuZXcgVVJMRW50cnkoKTsKLQkJU3RyaW5nIGluZm9VUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmYuc2V0VVJMKGluZm9VUkwpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIlByb2Nlc3NlZCBJbmZvOiB1cmw6IiArIGluZm9VUkwpOyAvLyROT04tTkxTLTEkCi0KLQkJb2JqZWN0U3RhY2sucHVzaChpbmYpOwotCX0KLQotCS8qIAotCSAqIHByb2Nlc3Mgc2l0ZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkvLyBjcmVhdGUgc2l0ZSBtYXAKLQkJU2l0ZU1vZGVsIHNpdGUgPSBuZXcgU2l0ZU1vZGVsKCk7Ci0KLQkJLy8gaWYgVVJMIGlzIHNwZWNpZmllZCwgaXQgcmVwbGFjZXMgdGhlIFVSTCBvZiB0aGUgc2l0ZQotCQkvLyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbG9jYXRpb24gb2YgZmVhdHVyZXMgYW5kIGFyY2hpdmVzCi0JCVN0cmluZyBzaXRlVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNpdGVVUkwgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyhzaXRlVVJMLnRyaW0oKSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghc2l0ZVVSTC5lbmRzV2l0aCgiLyIpICYmICFzaXRlVVJMLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc2l0ZVVSTCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNpdGUuc2V0TG9jYXRpb25VUkxTdHJpbmcoc2l0ZVVSTCk7Ci0JCX0KLQotCQkvLyBwcm92aWRlIGRlZmF1bHQgZGVzY3JpcHRpb24gVVJMCi0JCS8vIElmIDxkZXNjcmlwdGlvbj4gaXMgc3BlY2lmaWVkLCBmb3IgdGhlIHNpdGUsICBpdCB0YWtlcyBwcmVjZWRlbmNlCQkKLQkJVVJMRW50cnkgZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJZGVzY3JpcHRpb24uc2V0VVJMKERFRkFVTFRfSU5GT19VUkwpOwotCQlzaXRlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotCQkvLyB2ZXJpZnkgd2UgY2FuIHBhcnNlIHRoZSBzaXRlIC4uLmlmIHRoZSBzaXRlIGhhcwotCQkvLyBhIGRpZmZlcmVudCB0eXBlIHRocm93IGFuIGV4Y2VwdGlvbiB0byBmb3JjZSByZXBhcnNpbmcKLQkJLy8gd2l0aCB0aGUgbWF0Y2hpbmcgcGFyc2VyCi0JCVN0cmluZyB0eXBlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXNpdGUuc2V0VHlwZSh0eXBlKTsKLQotCQkvLyBnZXQgbWlycm9ycywgaWYgYW55Ci0JCVN0cmluZyBtaXJyb3JzVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibWlycm9yc1VSTCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtaXJyb3JzVVJMICE9IG51bGwgJiYgbWlycm9yc1VSTC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLwkJCVVSTEVudHJ5W10gbWlycm9ycyA9IGdldE1pcnJvcnMobWlycm9yc1VSTCk7Ci0JCQkvLwkJCWlmIChtaXJyb3JzICE9IG51bGwpCi0JCQkvLwkJCQlzaXRlLnNldE1pcnJvcnMobWlycm9ycyk7Ci0JCQkvLwkJCWVsc2UKLQotCQkJLy9TaW5jZSB3ZSBhcmUgcGFyc2luZyB0aGUgc2l0ZSBhdCBwMiBnZW5lcmF0aW9uIHRpbWUgYW5kIHRoZSAKLQkJCS8vbWlycm9ycyBtYXkgY2hhbmdlLCB0aGVyZSBpcyBubyBwb2ludCBkb2luZyB0aGUgbWlycm9yIGV4cGFuc2lvbiBub3cKLQkJCXNpdGUuc2V0TWlycm9yc1VSTFN0cmluZyhtaXJyb3JzVVJMKTsKLQkJfQotCi0JCVN0cmluZyBwYWNrMjAwID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwYWNrMjAwICE9IG51bGwgJiYgbmV3IEJvb2xlYW4ocGFjazIwMCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXNpdGUuc2V0U3VwcG9ydHNQYWNrMjAwKHRydWUpOwotCQl9Ci0KLQkJLy8JCWlmIChhdHRyaWJ1dGVzLmdldFZhbHVlKCJkaWdlc3RVUkwiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQlzaXRlLnNldERpZ2VzdEV4aXN0KHRydWUpOwotCQkvLwkJCXNpdGUuc2V0RGlnZXN0VVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRpZ2VzdFVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQkvLwotCQkvLwkJCWlmICgoYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXZhaWxhYmxlTG9jYWxlcyIpICE9IG51bGwpICYmICghYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXZhaWxhYmxlTG9jYWxlcyIpLnRyaW0oKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS8vCQkJCVN0cmluZ1Rva2VuaXplciBsb2NhbHMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImF2YWlsYWJsZUxvY2FsZXMiKSwgIiwiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJLy8JCQkJU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxzID0gbmV3IFN0cmluZ1tsb2NhbHMuY291bnRUb2tlbnMoKV07Ci0JCS8vCQkJCWludCBpID0gMDsKLQkJLy8JCQkJd2hpbGUgKGxvY2Fscy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJLy8JCQkJCWF2YWlsYWJsZUxvY2Fsc1tpKytdID0gbG9jYWxzLm5leHRUb2tlbigpOwotCQkvLwkJCQl9Ci0JCS8vCQkJCQkJCQlleHRlbmRlZFNpdGUuc2V0QXZhaWxhYmxlTG9jYWxzKGF2YWlsYWJsZUxvY2Fscyk7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLwotCQkvLwkJaWYgKChzaXRlIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSAmJiAoYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXNzb2NpYXRlU2l0ZXNVUkwiKSAhPSBudWxsKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJSVVSTEVudHJ5W10gYXNzb2NpYXRlU2l0ZXMgPSBnZXRBc3NvY2lhdGVTaXRlcyhhdHRyaWJ1dGVzLmdldFZhbHVlKCJhc3NvY2lhdGVTaXRlc1VSTCIpLCBmYWN0b3J5KTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCWlmIChhc3NvY2lhdGVTaXRlcyAhPSBudWxsKQotCQkvLwkJCQkoKEV4dGVuZGVkU2l0ZSkgc2l0ZSkuc2V0QXNzb2NpYXRlU2l0ZXMoYXNzb2NpYXRlU2l0ZXMpOwotCQkvLwkJCWVsc2UKLQkJLy8JCQkJc2l0ZS5zZXRNaXJyb3JzVVJMU3RyaW5nKG1pcnJvcnNVUkwpOwotCQkvLwkJfQotCi0JCW9iamVjdFN0YWNrLnB1c2goc2l0ZSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3MgU2l0ZSB0YWc6IHNpdGVVUkw6IiArIHNpdGVVUkwgKyAiIHR5cGU6IiArIHR5cGUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyoqCi0JICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpIHsKLQkJCWRlYnVnKCJTdGF0ZTogIiArIGN1cnJlbnRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOgotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtsb2NhbE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQloYW5kbGVJbml0aWFsU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9TSVRFIDoKLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoKLQkJCQloYW5kbGVGZWF0dXJlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoKLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6Ci0JCQkJaGFuZGxlQ2F0ZWdvcnlTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6Ci0JCQkJaGFuZGxlQ2F0ZWdvcnlEZWZTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgOgotCQkJCWhhbmRsZVNpdGVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA6Ci0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlLCAobmV3IFN0cmluZ1tdIHtnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQkJCQlicmVhazsKLQkJfQotCQlpbnQgbmV3U3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOwotCQlpZiAobmV3U3RhdGUgIT0gU1RBVEVfSUdOT1JFRF9FTEVNRU5UKQotCQkJY3VycmVudFN0YXRlID0gbmV3U3RhdGU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhaWxpbmdTcGFjZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIubGVuZ3RoKCkgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoc3RyLmxlbmd0aCgpIC0gMSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvRGlnZXN0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9EaWdlc3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4NmUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9EaWdlc3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIERlZmF1bHQgZmVhdHVyZSBwYXJzZXIuCi0gKiBQYXJzZXMgdGhlIGZlYXR1cmUgbWFuaWZlc3QgZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRGlnZXN0UGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIGZpbmFsIExpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBGZWF0dXJlUGFyc2VyIGZlYXR1cmVIYW5kbGVyID0gbmV3IEZlYXR1cmVQYXJzZXIoZmFsc2UpOwotCi0JcHVibGljIERpZ2VzdFBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWZlYXR1cmVIYW5kbGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKCJkaWdlc3QiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoImZlYXR1cmUiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVIYW5kbGVyLmdldFJlc3VsdCgpOwotCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQl9IGVsc2UKLQkJCWZlYXR1cmVIYW5kbGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZVtdIHBhcnNlKEZpbGUgbG9jYXRpb24pIHsKLQkJaWYgKCFsb2NhdGlvbi5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUphckZpbGUgamFyID0gbmV3IEphckZpbGUobG9jYXRpb24pOwotCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImRpZ2VzdC54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpcyksIHRoaXMpOwotCQkJcmV0dXJuIChGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IEZlYXR1cmVbZmVhdHVyZXMuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUmVhZGluZ0RpZ2VzdCwgbG9jYXRpb24pLCBlKSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclJlYWRpbmdEaWdlc3QsIGxvY2F0aW9uKSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoImRpZ2VzdCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWZlYXR1cmVIYW5kbGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJpYnV0ZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvRmVhdHVyZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhhN2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL0ZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5GZWF0dXJlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRGVmYXVsdCBmZWF0dXJlIHBhcnNlci4KLSAqIFBhcnNlcyB0aGUgZmVhdHVyZSBtYW5pZmVzdCBmaWxlIGFzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIEZlYXR1cmUgcmVzdWx0OwotCXByaXZhdGUgVVJMIHVybDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBjaGFyYWN0ZXJzID0gbnVsbDsKLQotCXByaXZhdGUgUHJvcGVydGllcyBtZXNzYWdlcyA9IG51bGw7Ci0KLQlwdWJsaWMgRmVhdHVyZVBhcnNlcigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmVhdHVyZVBhcnNlcihib29sZWFuIGNyZWF0ZVBhcnNlcikgewotCQlzdXBlcigpOwotCQlpZiAoIWNyZWF0ZVBhcnNlcikKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyYWN0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNoYXJhY3RlcnMuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlKGlkLCB2ZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyYWN0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXREZXNjcmlwdGlvbihsb2NhbGl6ZShjaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpKSk7Ci0JCX0gZWxzZSBpZiAoImxpY2Vuc2UiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRMaWNlbnNlKGxvY2FsaXplKGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkpKTsKLQkJfSBlbHNlIGlmICgiY29weXJpZ2h0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0Q29weXJpZ2h0KGxvY2FsaXplKGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkpKTsKLQkJfQotCQljaGFyYWN0ZXJzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZSBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCS8vc2tpcCBkaXJlY3RvcmllcyB0aGF0IGRvbid0IGNvbnRhaW4gYSBmZWF0dXJlLnByb3BlcnRpZXMgZmlsZQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksICJmZWF0dXJlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQl0cnkgewotCQkJCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlyZXN1bHQubG9hZChpbnB1dCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEphckZpbGUgamFyKSB7Ci0JCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KCJmZWF0dXJlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCXRyeSB7Ci0JCQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCXJlc3VsdC5sb2FkKGlucHV0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGl6ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKG1lc3NhZ2VzID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIG1lc3NhZ2VzLmdldFByb3BlcnR5KHZhbHVlLnN1YnN0cmluZygxKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZS4gVGhlIGdpdmVuIGxvY2F0aW9uIAotCSAqIHNob3VsZCBiZSBlaXRoZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIEpBUiBvciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLQkgKiB0aGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIHRvIHBhcnNlLiAgCi0JICovCi0JcHVibGljIEZlYXR1cmUgcGFyc2UoRmlsZSBsb2NhdGlvbikgewotCQlpZiAoIWxvY2F0aW9uLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvL3NraXAgZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBjb250YWluIGEgZmVhdHVyZS54bWwgZmlsZQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24sICJmZWF0dXJlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhsb2NhdGlvbik7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJcmV0dXJuIHBhcnNlKGlucHV0LCBwcm9wZXJ0aWVzKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChsb2NhdGlvbi5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCUphckZpbGUgamFyID0gbmV3IEphckZpbGUobG9jYXRpb24pOwotCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGphcik7Ci0JCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImZlYXR1cmUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCQlyZXR1cm4gcGFyc2UoaW5wdXQsIHByb3BlcnRpZXMpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIGEgZmVhdHVyZSBvYmplY3QKLQkgKiBvciBudWxsLiBUaGlzIG1ldGhvZCBjbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZSBwYXJzZShJbnB1dFN0cmVhbSBpbiwgUHJvcGVydGllcyBtZXNzYWdlcykgewotCQl0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7Ci0JCXJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkvLwkJCQkJVXRpbHMubG9nKGUxLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvcHlyaWdodChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LnNldENvcHlyaWdodFVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0aW9uKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0RGVzY3JpcHRpb25VUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCWNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXNjb3ZlcnlTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuYWRkRGlzY292ZXJ5U2l0ZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVGZWF0dXJlKGlkLCB2ZXIpOwotCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0LnNldEVudmlyb25tZW50KG9zLCB3cywgYXJjaCwgbmwpOwotCi0JCQkvL1RPRE8gcm9vdFVSTHMKLQkJCWlmICh1cmwgIT0gbnVsbCAmJiAiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJcmVzdWx0LnNldFVSTCgiZmVhdHVyZXMiICsgIi8iICsgZi5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpICsgIi8iKTsvLyArIGYuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZXh0ZXJuYWxpemVkIFVSTHMgbWlnaHQgYmUgaW4gcmVsYXRpdmUgZm9ybSwgZW5zdXJlIHRoZXkgYXJlIGFic29sdXRlCQkJCQotCQkJCS8vCQkJCWZlYXR1cmUuc2V0VVJMKFV0aWxzLm1ha2VBYnNvbHV0ZShVdGlscy5nZXRJbnN0YWxsVVJMKCksIHVybCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdC5zZXRQcm92aWRlck5hbWUobG9jYWxpemUoYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJvdmlkZXItbmFtZSIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRMYWJlbChsb2NhbGl6ZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRJbWFnZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJpbWFnZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLwkJCVV0aWxzLmRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGlkOiIgK2lkICsgIiB2ZXI6IiArdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ltcG9ydChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCUZlYXR1cmVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQllbnRyeSA9IEZlYXR1cmVFbnRyeS5jcmVhdGVSZXF1aXJlcyhpZCwgYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJtYXRjaCIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmaWx0ZXIiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgewotCQkJaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkgPSBGZWF0dXJlRW50cnkuY3JlYXRlUmVxdWlyZXMoaWQsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibWF0Y2giKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmlsdGVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJlc3VsdC5hZGRFbnRyeShlbnRyeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJRmVhdHVyZUVudHJ5IGVudHJ5ID0gbmV3IEZlYXR1cmVFbnRyeShhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBmbGFnID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmxhZyAhPSBudWxsKQotCQkJZW50cnkuc2V0T3B0aW9uYWwoQm9vbGVhbi52YWx1ZU9mKGZsYWcpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJc2V0RW52aXJvbm1lbnQoYXR0cmlidXRlcywgZW50cnkpOwotCQlyZXN1bHQuYWRkRW50cnkoZW50cnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5zdGFsbEhhbmRsZXIoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCXJlc3VsdC5zZXRJbnN0YWxsSGFuZGxlcihhdHRyaWJ1dGVzLmdldFZhbHVlKCJoYW5kbGVyIikpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoYXR0cmlidXRlcy5nZXRWYWx1ZSgibGlicmFyeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0SW5zdGFsbEhhbmRsZXJVUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaWNlbnNlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0TGljZW5zZVVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIHx8IHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKCJGZWF0dXJlUGFyc2VyI3Byb2Nlc3NQbHVnaW4sIElEIHswfSBvciB2ZXJzaW9uIHsxfSBpbnZhbGlkIiwgKG5ldyBTdHJpbmdbXSB7aWQsIHZlcnNpb259KSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlGZWF0dXJlRW50cnkgcGx1Z2luID0gbmV3IEZlYXR1cmVFbnRyeShpZCwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCQlzZXRFbnZpcm9ubWVudChhdHRyaWJ1dGVzLCBwbHVnaW4pOwotCQkJU3RyaW5nIHVucGFjayA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVucGFjayIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodW5wYWNrICE9IG51bGwpCi0JCQkJcGx1Z2luLnNldFVucGFjayhCb29sZWFuLnZhbHVlT2YodW5wYWNrKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlTdHJpbmcgZnJhZ21lbnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlwbHVnaW4uc2V0RnJhZ21lbnQoQm9vbGVhbi52YWx1ZU9mKGZyYWdtZW50KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlTdHJpbmcgZmlsdGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQlwbHVnaW4uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlyZXN1bHQuYWRkRW50cnkocGx1Z2luKTsKLQotCQkJLy8JCQlVdGlscy5kZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpZDoiICsgaWQgKyAiIHZlcjoiICsgdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcGRhdGVTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0VXBkYXRlU2l0ZUxhYmVsKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRVcGRhdGVTaXRlVVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnZpcm9ubWVudChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRFbnZpcm9ubWVudChvcywgd3MsIGFyY2gsIG5sKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLwkJVXRpbHMuZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWlmICgicGx1Z2luIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJsaWNlbnNlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzTGljZW5zZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiY29weXJpZ2h0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzQ29weXJpZ2h0KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJmZWF0dXJlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzSW1wb3J0KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJpbmNsdWRlcyIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0luY2x1ZGVzKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJpbnN0YWxsLWhhbmRsZXIiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NJbnN0YWxsSGFuZGxlcihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgidXBkYXRlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzVXBkYXRlU2l0ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiZGlzY292ZXJ5Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzRGlzY292ZXJ5U2l0ZShhdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTBjYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Ob1NpdGVUYWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfV3JvbmdQYXJzaW5nU3RhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfQ2F0ZWdvcnlBbHJlYWR5U2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbmRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JSZWFkaW5nRGlnZXN0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL1Byb2R1Y3RGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9Qcm9kdWN0RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM4MGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL1Byb2R1Y3RGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFByb2R1Y3RGaWxlIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0FSR1MgPSAicHJvZ3JhbUFyZ3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19MSU5VWCA9ICJwcm9ncmFtQXJnc0xpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9BUkdTX01BQyA9ICJwcm9ncmFtQXJnc01hYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9BUkdTX1NPTEFSSVMgPSAicHJvZ3JhbUFyZ3NTb2wiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19XSU4gPSAicHJvZ3JhbUFyZ3NXaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNX0FSR1MgPSAidm1BcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX0xJTlVYID0gInZtQXJnc0xpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fQVJHU19NQUMgPSAidm1BcmdzTWFjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX1NPTEFSSVMgPSAidm1BcmdzU29sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX1dJTiA9ICJ2bUFyZ3NXaW4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MQVJJU19MQVJHRSA9ICJzb2xhcmlzTGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTEFSSVNfTUVESVVNID0gInNvbGFyaXNNZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTEFSSVNfU01BTEwgPSAic29sYXJpc1NtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xBUklTX1RJTlkgPSAic29sYXJpc1RpbnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzE2X0xPVyA9ICJ3aW5TbWFsbExvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMTZfSElHSCA9ICJ3aW5TbWFsbEhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzI0X0xPVyA9ICJ3aW4yNExvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMzJfTE9XID0gIndpbk1lZGl1bUxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMzJfSElHSCA9ICJ3aW5NZWRpdW1IaWdoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU4zMl80OF9MT1cgPSAid2luTGFyZ2VMb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzQ4X0hJR0ggPSAid2luTGFyZ2VIaWdoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1dJTjMyID0gIndpbjMyIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0xJTlVYID0gImxpbnV4IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1NPTEFSSVMgPSAic29sYXJpcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19NQUNPU1ggPSAibWFjb3N4IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVCA9ICJwcm9kdWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfSU5JID0gImNvbmZpZ0luaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVIgPSAibGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX0FSR1MgPSAibGF1bmNoZXJBcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUExBU0ggPSAic3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VTRV9JQ08gPSAidXNlSWNvIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGVzZSBjb25zdGFudHMgZm9ybSBhIHNtYWxsIHN0YXRlIG1hY2hpbmUgdG8gcGFyc2UgdGhlIC5wcm9kdWN0IGZpbGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RBUlQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUk9EVUNUID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTEFVTkNIRVIgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9MQVVOQ0hFUl9BUkdTID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExVR0lOUyA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZFQVRVUkVTID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTID0gNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX0xJTlVYID0gNzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX01BQyA9IDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHU19TT0xBUklTID0gOTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX1dJTiA9IDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9WTV9BUkdTID0gMTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfTElOVVggPSAxMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVk1fQVJHU19NQUMgPSAxMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVk1fQVJHU19TT0xBUklTID0gMTQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfV0lOID0gMTU7Ci0KLQlwcml2YXRlIGludCBzdGF0ZSA9IFNUQVRFX1NUQVJUOwotCi0JcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRPUyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHVzZUljbyA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoNik7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpY29uc1tdID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb25maWdQYXRoID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIE1hcCBwbGF0Zm9ybVNwZWNpZmljQ29uZmlnUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gdXNlRmVhdHVyZXMgPSBmYWxzZTsKLQlwcml2YXRlIExpc3QgcGx1Z2lucyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZyYWdtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzcGxhc2hMb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGFwcGxpY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQotCXByaXZhdGUgUHJvcGVydGllcyBsYXVuY2hlckFyZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQl0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCJcXHJ8XFxufFxcZnxcXHQiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHRleHQucmVwbGFjZUFsbCgiXFxzKyIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBmZWF0dXJlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgUHJvZHVjdEZpbGUoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgb3MpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRPUyA9IG9zOwotCQkvLwkJdHJ5IHsKLQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJcGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2F0aW9uKSk7Ci0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJLy8JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZPUk1BVCwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3Byb2R1Y3RQYXJzZSwgbG9jYXRpb24pLCBlKSk7Ci0JCS8vCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZPUk1BVCwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3Byb2R1Y3RQYXJzZSwgbG9jYXRpb24pLCBlKSk7Ci0JCS8vCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZJTEUsIE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9taXNzaW5nRWxlbWVudCwgbG9jYXRpb24pLCBudWxsKSk7Ci0JCS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9QREVCVUlMRCwgRVhDRVBUSU9OX1BST0RVQ1RfRk9STUFULCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fcHJvZHVjdFBhcnNlLCBsb2NhdGlvbiksIGUpKTsKLQkJLy8JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyTmFtZSgpIHsKLQkJcmV0dXJuIGxhdW5jaGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQbHVnaW5zKCkgewotCQlyZXR1cm4gZ2V0UGx1Z2lucyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQbHVnaW5zKGJvb2xlYW4gaW5jbHVkZUZyYWdtZW50cykgewotCQlMaXN0IHAgPSBwbHVnaW5zICE9IG51bGwgPyBwbHVnaW5zIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaWYgKCFpbmNsdWRlRnJhZ21lbnRzKQotCQkJcmV0dXJuIHA7Ci0KLQkJTGlzdCBmID0gZnJhZ21lbnRzICE9IG51bGwgPyBmcmFnbWVudHMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpbnQgc2l6ZSA9IHAuc2l6ZSgpICsgZi5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlMaXN0IGJvdGggPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlib3RoLmFkZEFsbChwKTsKLQkJYm90aC5hZGRBbGwoZik7Ci0JCXJldHVybiBib3RoOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZyYWdtZW50cygpIHsKLQkJaWYgKGZyYWdtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBmcmFnbWVudHM7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmVhdHVyZXMoKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BsdWdpbihTdHJpbmcgcGx1Z2luKSB7Ci0JCXJldHVybiAocGx1Z2lucyAhPSBudWxsICYmIHBsdWdpbnMuY29udGFpbnMocGx1Z2luKSkgfHwgKGZyYWdtZW50cyAhPSBudWxsICYmIGZyYWdtZW50cy5jb250YWlucyhwbHVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCB1cmwgYW5kIGNvbnN0cnVjdHMgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgIT0gbnVsbCkKLQkJCXJldHVybiBpY29uczsKLQkJU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCQkJdGVtcFtpKytdID0gZWxlbWVudDsKLQkJfQotCQlpY29ucyA9IG5ldyBTdHJpbmdbaV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgaWNvbnMsIDAsIGkpOwotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb25maWdJbmlQYXRoKCkgewotCQlyZXR1cm4gY29uZmlnUGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0luaVBhdGgoU3RyaW5nIG9zKSB7Ci0JCVN0cmluZyBzcGVjaWZpYyA9IChTdHJpbmcpIHBsYXRmb3JtU3BlY2lmaWNDb25maWdQYXRocy5nZXQob3MpOwotCQlyZXR1cm4gc3BlY2lmaWMgPT0gbnVsbCA/IGNvbmZpZ1BhdGggOiBzcGVjaWZpYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGxhc2hMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHNwbGFzaExvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9kdWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiB1c2VGZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiAodmVyc2lvbiA9PSBudWxsKSA/ICIwLjAuMCIgOiB2ZXJzaW9uOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWTUFyZ3VtZW50cyhTdHJpbmcgb3MpIHsKLQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCWlmIChvcy5lcXVhbHMoT1NfV0lOMzIpKSB7Ci0JCQlrZXkgPSBWTV9BUkdTX1dJTjsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfTElOVVgpKSB7Ci0JCQlrZXkgPSBWTV9BUkdTX0xJTlVYOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19NQUNPU1gpKSB7Ci0JCQlrZXkgPSBWTV9BUkdTX01BQzsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfU09MQVJJUykpIHsKLQkJCWtleSA9IFZNX0FSR1NfU09MQVJJUzsKLQkJfQotCi0JCVN0cmluZyBwcmVmaXggPSBsYXVuY2hlckFyZ3MuZ2V0UHJvcGVydHkoVk1fQVJHUyk7Ci0JCVN0cmluZyBwbGF0Zm9ybSA9IG51bGwsIGFyZ3MgPSBudWxsOwotCQlpZiAoa2V5ICE9IG51bGwpCi0JCQlwbGF0Zm9ybSA9IGxhdW5jaGVyQXJncy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAocHJlZml4ICE9IG51bGwpCi0JCQlhcmdzID0gcGxhdGZvcm0gIT0gbnVsbCA/IHByZWZpeCArICIgIiArIHBsYXRmb3JtIDogcHJlZml4OyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWFyZ3MgPSBwbGF0Zm9ybSAhPSBudWxsID8gcGxhdGZvcm0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbm9ybWFsaXplKGFyZ3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50cyhTdHJpbmcgb3MpIHsKLQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCWlmIChvcy5lcXVhbHMoT1NfV0lOMzIpKSB7Ci0JCQlrZXkgPSBQUk9HUkFNX0FSR1NfV0lOOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19MSU5VWCkpIHsKLQkJCWtleSA9IFBST0dSQU1fQVJHU19MSU5VWDsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfTUFDT1NYKSkgewotCQkJa2V5ID0gUFJPR1JBTV9BUkdTX01BQzsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfU09MQVJJUykpIHsKLQkJCWtleSA9IFBST0dSQU1fQVJHU19TT0xBUklTOwotCQl9Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGxhdW5jaGVyQXJncy5nZXRQcm9wZXJ0eShQUk9HUkFNX0FSR1MpOwotCQlTdHJpbmcgcGxhdGZvcm0gPSBudWxsLCBhcmdzID0gbnVsbDsKLQkJaWYgKGtleSAhPSBudWxsKQotCQkJcGxhdGZvcm0gPSBsYXVuY2hlckFyZ3MuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHByZWZpeCAhPSBudWxsKQotCQkJYXJncyA9IHBsYXRmb3JtICE9IG51bGwgPyBwcmVmaXggKyAiICIgKyBwbGF0Zm9ybSA6IHByZWZpeDsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlhcmdzID0gcGxhdGZvcm0gIT0gbnVsbCA/IHBsYXRmb3JtIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5vcm1hbGl6ZShhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9TVEFSVCA6Ci0JCQkJaWYgKFBST0RVQ1QuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc1Byb2R1Y3QoYXR0cmlidXRlcyk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPRFVDVDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfUFJPRFVDVCA6Ci0JCQkJaWYgKENPTkZJR19JTkkuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc0NvbmZpZ0luaShhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgaWYgKExBVU5DSEVSLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NMYXVuY2hlcihhdHRyaWJ1dGVzKTsKLQkJCQkJc3RhdGUgPSBTVEFURV9MQVVOQ0hFUjsKLQkJCQl9IGVsc2UgaWYgKFBMVUdJTlMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QTFVHSU5TOwotCQkJCX0gZWxzZSBpZiAoRkVBVFVSRVMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9GRUFUVVJFUzsKLQkJCQl9IGVsc2UgaWYgKExBVU5DSEVSX0FSR1MuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9MQVVOQ0hFUl9BUkdTOwotCQkJCX0gZWxzZSBpZiAoU1BMQVNILmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXNwbGFzaExvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9MQVVOQ0hFUiA6Ci0JCQkJaWYgKE9TX1NPTEFSSVMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc1NvbGFyaXMoYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIGlmICgid2luIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2Nlc3NXaW4oYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIGlmIChPU19MSU5VWC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzTGludXgoYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIGlmIChPU19NQUNPU1guZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc01hYyhhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQkJaWYgKCJpY28iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc0ljbyhhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgaWYgKCJibXAiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc0JtcChhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfTEFVTkNIRVJfQVJHUyA6Ci0JCQkJaWYgKFBST0dSQU1fQVJHUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0dSQU1fQVJHUzsKLQkJCQl9IGVsc2UgaWYgKFBST0dSQU1fQVJHU19MSU5VWC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0dSQU1fQVJHU19MSU5VWDsKLQkJCQl9IGVsc2UgaWYgKFBST0dSQU1fQVJHU19NQUMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9HUkFNX0FSR1NfTUFDOwotCQkJCX0gZWxzZSBpZiAoUFJPR1JBTV9BUkdTX1NPTEFSSVMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9HUkFNX0FSR1NfU09MQVJJUzsKLQkJCQl9IGVsc2UgaWYgKFBST0dSQU1fQVJHU19XSU4uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9HUkFNX0FSR1NfV0lOOwotCQkJCX0gZWxzZSBpZiAoVk1fQVJHUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1ZNX0FSR1M7Ci0JCQkJfSBlbHNlIGlmIChWTV9BUkdTX0xJTlVYLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfVk1fQVJHU19MSU5VWDsKLQkJCQl9IGVsc2UgaWYgKFZNX0FSR1NfTUFDLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfVk1fQVJHU19NQUM7Ci0JCQkJfSBlbHNlIGlmIChWTV9BUkdTX1NPTEFSSVMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9WTV9BUkdTX1NPTEFSSVM7Ci0JCQkJfSBlbHNlIGlmIChWTV9BUkdTX1dJTi5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1ZNX0FSR1NfV0lOOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9QTFVHSU5TIDoKLQkJCQlpZiAoInBsdWdpbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9GRUFUVVJFUyA6Ci0JCQkJaWYgKCJmZWF0dXJlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfUExVR0lOUyA6Ci0JCQkJaWYgKFBMVUdJTlMuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQkJCXN0YXRlID0gU1RBVEVfUFJPRFVDVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfRkVBVFVSRVMgOgotCQkJCWlmIChGRUFUVVJFUy5lcXVhbHMobG9jYWxOYW1lKSkKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9EVUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9MQVVOQ0hFUl9BUkdTIDoKLQkJCQlpZiAoTEFVTkNIRVJfQVJHUy5lcXVhbHMobG9jYWxOYW1lKSkKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9EVUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9MQVVOQ0hFUiA6Ci0JCQkJaWYgKExBVU5DSEVSLmVxdWFscyhsb2NhbE5hbWUpKQotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0RVQ1Q7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTIDoKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX0xJTlVYIDoKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX01BQyA6Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19TT0xBUklTIDoKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX1dJTiA6Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1MgOgotCQkJY2FzZSBTVEFURV9WTV9BUkdTX0xJTlVYIDoKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19NQUMgOgotCQkJY2FzZSBTVEFURV9WTV9BUkdTX1NPTEFSSVMgOgotCQkJY2FzZSBTVEFURV9WTV9BUkdTX1dJTiA6Ci0JCQkJc3RhdGUgPSBTVEFURV9MQVVOQ0hFUl9BUkdTOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHUyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChQUk9HUkFNX0FSR1MsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19MSU5VWCA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChQUk9HUkFNX0FSR1NfTElOVVgsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19NQUMgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoUFJPR1JBTV9BUkdTX01BQywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX1NPTEFSSVMgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoUFJPR1JBTV9BUkdTX1NPTEFSSVMsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19XSU4gOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoUFJPR1JBTV9BUkdTX1dJTiwgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfVk1fQVJHUyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChWTV9BUkdTLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9WTV9BUkdTX0xJTlVYIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFZNX0FSR1NfTElOVVgsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfTUFDIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFZNX0FSR1NfTUFDLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9WTV9BUkdTX1NPTEFSSVMgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoVk1fQVJHU19TT0xBUklTLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9WTV9BUkdTX1dJTiA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChWTV9BUkdTX1dJTiwgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAobGF1bmNoZXJBcmdzID09IG51bGwpCi0JCQlsYXVuY2hlckFyZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IGxhdW5jaGVyQXJncy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkKLQkJCWxhdW5jaGVyQXJncy5zZXRQcm9wZXJ0eShrZXksIG9sZFZhbHVlICsgdmFsdWUpOwotCQllbHNlCi0JCQlsYXVuY2hlckFyZ3Muc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBmcmFnbWVudCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZyYWdtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZyYWdtZW50ICE9IG51bGwgJiYgbmV3IEJvb2xlYW4oZnJhZ21lbnQpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlpZiAoZnJhZ21lbnRzID09IG51bGwpCi0JCQkJZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZnJhZ21lbnRzLmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJaWYgKHBsdWdpbnMgPT0gbnVsbCkKLQkJCQlwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcGx1Z2lucy5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmVhdHVyZXMuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcm9kdWN0KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvZHVjdE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJYXBwbGljYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1c2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1c2VGZWF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1c2UgIT0gbnVsbCkKLQkJCXVzZUZlYXR1cmVzID0gQm9vbGVhbi52YWx1ZU9mKHVzZSkuYm9vbGVhblZhbHVlKCk7Ci0JCXZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ0luaShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlpZiAoImN1c3RvbSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVzZSIpKSkgeyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJcGF0aCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9zICE9IG51bGwgJiYgb3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBUT0RPIHNob3VsZCB3ZSBhbGxvdyBhIHBsYXRmb3JtLXNwZWNpZmljIGRlZmF1bHQgdG8gb3Zlci1yaWRlIGEgY3VzdG9tIGdlbmVyaWMgcGF0aD8KLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcGxhdGZvcm1TcGVjaWZpY0NvbmZpZ1BhdGhzLnB1dChvcywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWdQYXRoID0gcGF0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTGF1bmNoZXIoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWxhdW5jaGVyTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvc01hdGNoKFN0cmluZyBvcykgewotCQlpZiAob3MgPT0gY3VycmVudE9TKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb3MuZXF1YWxzKGN1cnJlbnRPUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTb2xhcmlzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoIW9zTWF0Y2goT1NfU09MQVJJUykpCi0JCQlyZXR1cm47Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZShTT0xBUklTX0xBUkdFKSk7Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZShTT0xBUklTX01FRElVTSkpOwotCQlyZXN1bHQuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU09MQVJJU19TTUFMTCkpOwotCQlyZXN1bHQuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU09MQVJJU19USU5ZKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NXaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmICghb3NNYXRjaChPU19XSU4zMikpCi0JCQlyZXR1cm47Ci0JCXVzZUljbyA9IEJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGVzLmdldFZhbHVlKFBfVVNFX0lDTykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSWNvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoIW9zTWF0Y2goT1NfV0lOMzIpIHx8ICF1c2VJY28pCi0JCQlyZXR1cm47Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQm1wKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoIW9zTWF0Y2goT1NfV0lOMzIpIHx8IHVzZUljbykKLQkJCXJldHVybjsKLQkJcmVzdWx0LmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzE2X0hJR0gpKTsKLQkJcmVzdWx0LmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzE2X0xPVykpOwotCQlyZXN1bHQuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfMjRfTE9XKSk7Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl8zMl9ISUdIKSk7Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl8zMl9MT1cpKTsKLQkJcmVzdWx0LmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzQ4X0hJR0gpKTsKLQkJcmVzdWx0LmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzQ4X0xPVykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTGludXgoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmICghb3NNYXRjaChPU19MSU5VWCkpCi0JCQlyZXR1cm47Ci0JCXJlc3VsdC5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWNvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTWFjKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoIW9zTWF0Y2goT1NfTUFDT1NYKSkKLQkJCXJldHVybjsKLQkJcmVzdWx0LmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKCJpY29uIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvU2l0ZUNhdGVnb3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9TaXRlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxOGQ4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9TaXRlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEEgY2F0ZWdvcnkgaW4gYW4gdXBkYXRlIHNpdGUuCi0gKiAKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlQ2F0ZWdvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBjb21wOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tcGFyYXRvciBmb3IgY2F0ZWdvcnkgbW9kZWxzLgotCSAqIAotCSAqIEByZXR1cm4gY29tcGFyYXRvcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGNvbXAgPT0gbnVsbCkgewotCQkJY29tcCA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCS8qCi0JCQkJICogQHNlZSBDb21wYXJhdG9yI2NvbXBhcmUoT2JqZWN0LE9iamVjdCkKLQkJCQkgKiBSZXR1cm5zIDAgaWYgdmVyc2lvbnMgYXJlIGVxdWFsLgotCQkJCSAqIFJldHVybnMgLTEgaWYgb2JqZWN0MSBpcyBhZnRlciB0aGFuIG9iamVjdDIuCi0JCQkJICogUmV0dXJucyArMSBpZiBvYmplY3QxIGlzIGJlZm9yZSB0aGFuIG9iamVjdDIuCi0JCQkJICovCi0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0KLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdDEgPSAoU2l0ZUNhdGVnb3J5KSBvMTsKLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdDIgPSAoU2l0ZUNhdGVnb3J5KSBvMjsKLQotCQkJCQlpZiAoY2F0MS5lcXVhbHMoY2F0MikpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJcmV0dXJuIGNhdDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhjYXQyLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdHdvIGNhdGVnb3J5IG1vZGVscyBmb3IgZXF1YWxpdHkuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJU2l0ZUNhdGVnb3J5IG90aGVyQ2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmo7Ci0JCQlyZXN1bHQgPSBnZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlckNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZGVzY3JpcHRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGNhdGVnb3J5IGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGNhdGVnb3J5IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgaGFzaCBjb2RlIGZvciBjYXRlZ29yeSBtb2RlbC4KLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCS8vCQlsb2NhbGl6ZWRMYWJlbCA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIGxhYmVsKTsKLQotCQkvLyBkZWxlZ2F0ZSB0byByZWZlcmVuY2VzCi0JCS8vCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBjYXRlZ29yeSBkZXNjcmlwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhdGVnb3J5IGRpc3BsYXlhYmxlIGxhYmVsLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGxhYmVsIGRpc3BsYXlhYmxlIGxhYmVsLCBvciByZXNvdXJjZSBrZXkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBuYW1lLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9TaXRlRmVhdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvU2l0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMjIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9TaXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE5MTc4MywgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRmVhdHVyZURvd25sb2FkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgcmVmZXJlbmNlIHRvIGEgZmVhdHVyZSBpbiBhbiB1cGRhdGUgc2l0ZS54bWwgZmlsZS4KLSAqIAotICogQmFzZWQgb24gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZVJlZmVyZW5jZU1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBTdHJpbmcgYXJjaDsKLQkvLyBwZXJmb3JtYW5jZQotCXByaXZhdGUgVVJMIGJhc2U7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIFN0cmluZyovY2F0ZWdvcnlOYW1lczsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0KLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyBwYXRjaDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFNpdGVNb2RlbCBzaXRlOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyB3czsKLQotCS8qCi0JICogQ29tcGFyZXMgdHdvIFVSTCBmb3IgZXF1YWxpdHkKLQkgKiBSZXR1cm4gZmFsc2UgaWYgb25lIG9mIHRoZW0gaXMgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lVVJMKFVSTCB1cmwxLCBVUkwgdXJsMikgewotCi0JCWlmICh1cmwxID09IG51bGwgfHwgdXJsMiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodXJsMSA9PSB1cmwyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGNoZWNrIGlmIFVSTCBhcmUgZmlsZTogVVJMIGFzIHdlIG1heQotCQkvLyBoYXZlIDIgVVJMIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZlYXR1cmVSZWZlcmVuY2UKLQkJLy8gYnV0IHdpdGggZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uCi0JCS8vIChpLmUuIGZpbGU6L0M7LyBhbmQgZmlsZTpDOi8pCi0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsMS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDIuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGaWxlIGZpbGUxID0gbmV3IEZpbGUodXJsMS5nZXRGaWxlKCkpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUodXJsMi5nZXRGaWxlKCkpOwotCi0JCWlmIChmaWxlMSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZmlsZTEuZXF1YWxzKGZpbGUyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2l0ZUZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmFtZSBvZiBhIGNhdGVnb3J5IHRoaXMgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5TmFtZSBjYXRlZ29yeSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLQkJaWYgKHRoaXMuY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIXRoaXMuY2F0ZWdvcnlOYW1lcy5jb250YWlucyhjYXRlZ29yeU5hbWUpKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzLmFkZChjYXRlZ29yeU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsKLQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uCi0JCWlmIChyZXNvbHZlZCkKLQkJCXJldHVybjsKLQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKGJhc2UsIHVybFN0cmluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIDIgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIGZvciBlcXVhbGl0eQotCSAqICAKLQkgKiBAcGFyYW0gb2JqZWN0IGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIGNvbXBhcmUgd2l0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBtb2RlbHMgYXJlIGVxdWFsLCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRVUkwoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFNpdGVGZWF0dXJlKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTaXRlRmVhdHVyZSBmID0gKFNpdGVGZWF0dXJlKSBvYmplY3Q7Ci0KLQkJcmV0dXJuIHNhbWVVUkwoZ2V0VVJMKCksIGYuZ2V0VVJMKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGNhdGVnb3JpZXMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbmFtZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeU5hbWVzKCkgewotCQlpZiAoY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgY2F0ZWdvcnlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllciBhcyBhIHN0cmluZwotCSAqIAotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGZlYXR1cmVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHZlcnNpb24gYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUgdmVyc2lvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgewotCQlyZXR1cm4gZmVhdHVyZVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuIElmIHRoZSBtb2RlbAotCSAqIG9iamVjdCBoYXMgYmVlbiByZXNvbHZlZCwgdGhlIGxhYmVsIGlzIGxvY2FsaXplZC4KLQkgKgotCSAqIEByZXR1cm4gZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLgotCSAqCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsTm9uTG9jYWxpemVkKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsKLQkJcmV0dXJuIG5sOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7Ci0JCXJldHVybiBhcmNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGNoIG1vZGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRjaCgpIHsKLQkJcmV0dXJuIHBhdGNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpdGUgbW9kZWwgZm9yIHRoZSByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBzaXRlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTaXRlTW9kZWwgZ2V0U2l0ZU1vZGVsKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0Ci0JICogZmVhdHVyZSB0eXBlIGZvciB0aGUgc2l0ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB1cmwgc3RyaW5nCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCWRlbGF5ZWRSZXNvbHZlKCk7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgcmVmZXJlbmNlLgotCSAqCi0JICogQHJldHVybiB1cmwgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7Ci0JCXJldHVybiB1cmxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZUJhc2UgVVJMCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCByZXNvbHZlQmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCXRoaXMuYmFzZSA9IHJlc29sdmVCYXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqCi0JICogQHBhcmFtIGFyY2ggc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7Ci0JCXRoaXMuYXJjaCA9IGFyY2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZXMgb2YgY2F0ZWdvcmllcyB0aGlzIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWVzIGFuIGFycmF5IG9mIGNhdGVnb3J5IG5hbWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lcyhTdHJpbmdbXSBjYXRlZ29yeU5hbWVzKSB7Ci0JCWlmIChjYXRlZ29yeU5hbWVzID09IG51bGwpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoY2F0ZWdvcnlOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlSWQgZmVhdHVyZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZUlkZW50aWZpZXIoU3RyaW5nIGZlYXR1cmVJZCkgewotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHZlcnNpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVZlcnNpb24gZmVhdHVyZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZlcnNpb24oU3RyaW5nIGZlYXR1cmVWZXJzaW9uKSB7Ci0JCXRoaXMuZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7Ci0JCXRoaXMubmwgPSBubDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgewotCQl0aGlzLm9zID0gb3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGF0Y2ggbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXRjaChTdHJpbmcgcGF0Y2gpIHsKLQkJdGhpcy5wYXRjaCA9IHBhdGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2VkLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIHNpdGUgc2l0ZSBmb3IgdGhlIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSkgewotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSB0eXBlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIHR5cGUgcmVmZXJlbmNlZCBmZWF0dXJlIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdW5yZXNvbHZlZCBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7Ci0JCXRoaXMudXJsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSB3cyB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgewotCQl0aGlzLndzID0gd3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS50b1N0cmluZygpICsgIiA6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiIGF0ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9mZWF0dXJlcy9TaXRlTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL1NpdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA5NzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL1NpdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuVVJMRW50cnk7Ci0KLS8qKgotICogQSBtb2RlbCBvZiBhbiB1cGRhdGUgc2l0ZS4KLSAqIAotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZU1vZGVsIHsKLQotCXByaXZhdGUgTGlzdCAvKm9mIEFyY2hpdmVSZWZlcmVuY2VNb2RlbCovYXJjaGl2ZVJlZmVyZW5jZXM7Ci0JLyoqCi0JICogTWFwIG9mIFN0cmluZyAoY2F0ZWdvcnkgaWQpIC0+IFNpdGVDYXRlZ29yeQotCSAqLwotCXByaXZhdGUgTWFwIGNhdGVnb3JpZXM7Ci0JcHJpdmF0ZSBVUkxFbnRyeSBkZXNjcmlwdGlvbjsKLQkvKioKLQkgKiBNYXAgb2YgU3RyaW5nIChmZWF0dXJlIGlkKSAtPiBTaXRlRmVhdHVyZQotCSAqLwotCXByaXZhdGUgTGlzdCBmZWF0dXJlczsKLQlwcml2YXRlIFVSTCBsb2NhdGlvblVSTDsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKLQlwcml2YXRlIExpc3QgLyogb2YgVVJMRW50cnkgKi9taXJyb3JzOwotCXByaXZhdGUgU3RyaW5nIG1pcnJvcnNVUkxTdHJpbmc7Ci0JcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzUGFjazIwMDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIHNpdGUgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwgdG8gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlUmVmZXJlbmNlIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyY2hpdmUoVVJMRW50cnkgYXJjaGl2ZVJlZmVyZW5jZSkgewotCQlpZiAodGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCF0aGlzLmFyY2hpdmVSZWZlcmVuY2VzLmNvbnRhaW5zKGFyY2hpdmVSZWZlcmVuY2UpKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcy5hZGQoYXJjaGl2ZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNhdGVnb3J5IHRvIHRoZSBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5KFNpdGVDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKQotCQkJY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghY2F0ZWdvcmllcy5jb250YWluc0tleShjYXRlZ29yeS5nZXROYW1lKCkpKQotCQkJY2F0ZWdvcmllcy5wdXQoY2F0ZWdvcnkuZ2V0TmFtZSgpLCBjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKFNpdGVGZWF0dXJlIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJaWYgKHRoaXMuZmVhdHVyZXMgPT0gbnVsbCkKLQkJCXRoaXMuZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZmVhdHVyZXMuYWRkKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtaXJyb3Igc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWlycm9yIG1pcnJvciBtb2RlbCAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWlycm9yKFVSTEVudHJ5IG1pcnJvcikgewotCQlpZiAodGhpcy5taXJyb3JzID09IG51bGwpCi0JCQl0aGlzLm1pcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghdGhpcy5taXJyb3JzLmNvbnRhaW5zKG1pcnJvcikpCi0JCQl0aGlzLm1pcnJvcnMuYWRkKG1pcnJvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKFVSTEVudHJ5W10gbmV3TWlycm9ycykgewotCQlpZiAobmV3TWlycm9ycyA9PSBudWxsIHx8IG5ld01pcnJvcnMubGVuZ3RoID09IDApCi0JCQl0aGlzLm1pcnJvcnMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLm1pcnJvcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QobmV3TWlycm9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWxzCi0JICogb24gdGhpcyBzaXRlCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZQotCSAqIG5vIGFyY2hpdmVzIGtub3duIHRvIHRoaXMgc2l0ZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTEVudHJ5W10gZ2V0QXJjaGl2ZXMoKSB7Ci0JCWlmIChhcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsIHx8IGFyY2hpdmVSZWZlcmVuY2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeVswXTsKLQotCQlyZXR1cm4gKFVSTEVudHJ5W10pIGFyY2hpdmVSZWZlcmVuY2VzLnRvQXJyYXkobmV3IFVSTEVudHJ5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3J5IG1vZGVscyBmb3IgdGhpcyBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2Ygc2l0ZSBjYXRlZ29yeSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5W10gZ2V0Q2F0ZWdvcmllcygpIHsKLQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTaXRlQ2F0ZWdvcnlbMF07Ci0JCXJldHVybiAoU2l0ZUNhdGVnb3J5W10pIGNhdGVnb3JpZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2l0ZUNhdGVnb3J5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFNpdGVDYXRlZ29yeSBnZXRDYXRlZ29yeShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFNpdGVDYXRlZ29yeSkgKGNhdGVnb3JpZXMgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yaWVzLmdldChuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHNpdGUgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTaXRlRmVhdHVyZVswXTsKLQkJcmV0dXJuIChTaXRlRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBTaXRlRmVhdHVyZVswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uVVJMKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgc2l0ZS4KLQkgKgotCSAqIEByZXR1cm4gdXJsIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHVwZGF0ZSBzaXRlIG1pcnJvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1pcnJvciBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFVSTEVudHJ5W10gZ2V0TWlycm9ycygpIHsKLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheTsKLQkJaWYgKG1pcnJvcnMgPT0gbnVsbCB8fCBtaXJyb3JzLnNpemUoKSA9PSAwKQotCQkJLy8gc2VlIGlmIHdlIGNhbiBnZXQgbWlycm9ycyBmcm9tIHRoZSBwcm92aWRlZCB1cmwKLQkJCWlmIChtaXJyb3JzVVJMU3RyaW5nICE9IG51bGwpCi0JCQkJZG9TZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoRGVmYXVsdFNpdGVQYXJzZXIuZ2V0TWlycm9ycyhtaXJyb3JzVVJMU3RyaW5nKSk7Ci0KLQkJaWYgKG1pcnJvcnMgPT0gbnVsbCB8fCBtaXJyb3JzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeVswXTsKLQkJcmV0dXJuIChVUkxFbnRyeVtdKSBtaXJyb3JzLnRvQXJyYXkobmV3IFVSTEVudHJ5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZnJvbSB3aGljaCB0aGUgbGlzdCBvZiBtaXJyb3JzIG9mIHRoaXMgc2l0ZSBjYW4gYmUgcmV0cmlldmVkLgotCSAqIAotCSAqIEBzaW5jZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciAxLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pcnJvcnNVUkwoKSB7Ci0JCXJldHVybiBtaXJyb3JzVVJMU3RyaW5nOwotCX0KLQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBzaXRlIHR5cGUuCi0JICogCi0JICogQHJldHVybiBzaXRlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFjazIwMFN1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRzUGFjazIwMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0JCS8vIEFyY2hpdmVzIGFuZCBmZWF0dXJlIGFyZSByZWxhdGl2ZSB0byBsb2NhdGlvbiBVUkwKLQkJLy8gaWYgdGhlIFNpdGUgZWxlbWVudCBoYXMgYSBVUkwgdGFnOiBzZWUgc3BlYwkKLQkJLy8JCWxvY2F0aW9uVVJMID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIGdldExvY2F0aW9uVVJMU3RyaW5nKCkpOwotCQkvLwkJaWYgKGxvY2F0aW9uVVJMID09IG51bGwpCi0JCS8vCQkJbG9jYXRpb25VUkwgPSBiYXNlOwotCQkvLwkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpLCBsb2NhdGlvblVSTCwgYnVuZGxlVVJMKTsKLQkJLy8JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSwgbG9jYXRpb25VUkwsIGJ1bmRsZVVSTCk7Ci0JCS8vCi0JCS8vCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQkJLy8JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENhdGVnb3J5TW9kZWxzKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCS8vCi0JCS8vCQlVUkwgdXJsID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIG1pcnJvcnNVUkxTdHJpbmcpOwotCQkvLwkJaWYgKHVybCAhPSBudWxsKQotCQkvLwkJCW1pcnJvcnNVUkxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJLy8KLQkJLy8JCWlmICgodGhpcyBpbnN0YW5jZW9mIEV4dGVuZGVkU2l0ZSkgJiYgKChFeHRlbmRlZFNpdGUpIHRoaXMpLmlzRGlnZXN0RXhpc3QoKSkgewotCQkvLwkJCUV4dGVuZGVkU2l0ZSBleHRlbmRlZFNpdGUgPSAoRXh0ZW5kZWRTaXRlKSB0aGlzOwotCQkvLwkJCWV4dGVuZGVkU2l0ZS5zZXRMaXRlRmVhdHVyZXMoVXBkYXRlTWFuYWdlclV0aWxzLmdldExpZ2h0RmVhdHVyZXMoZXh0ZW5kZWRTaXRlKSk7Ci0JCS8vCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gc2l0ZSBkZXNjcmlwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihVUkxFbnRyeSBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyB1cmwgZm9yIHRoZSBzaXRlIChhcyBhIHN0cmluZykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFkZGl0aW9uYWwgbWlycm9yIHNpdGVzCi0JICogCi0JICogQHBhcmFtIG1pcnJvcnMgYWRkaXRpb25hbCB1cGRhdGUgc2l0ZSBtaXJyb3JzCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pcnJvcnMoVVJMRW50cnlbXSBtaXJyb3JzKSB7Ci0JCWRvU2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKG1pcnJvcnMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1pcnJvcnMgdXJsLiBNaXJyb3Igc2l0ZXMgd2lsbCB0aGVuIGJlIG9idGFpbmVkIGZyb20gdGhpcyBtaXJyb3IgdXJsIGxhdGVyLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbXBsZW1lbnRhcnkgdG8gc2V0TWlycm9yc2l0ZUVudHJ5TW9kZWxzKCksIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSAKLQkgKiBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIG1pcnJvcnNVUkwgYWRkaXRpb25hbCB1cGRhdGUgc2l0ZSBtaXJyb3JzCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pcnJvcnNVUkxTdHJpbmcoU3RyaW5nIG1pcnJvcnNVUkwpIHsKLQkJdGhpcy5taXJyb3JzVVJMU3RyaW5nID0gbWlycm9yc1VSTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c1BhY2syMDAoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnN1cHBvcnRzUGFjazIwMCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgdHlwZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHNpdGUgdHlwZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2ZlYXR1cmVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2ZmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvZmVhdHVyZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5zdGFsbCBVcGRhdGUgQ29yZSBQcm9wZXJ0aWVzIEZpbGUKLSMKLQotRGVmYXVsdEZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb3IgdGhlIHZlcnNpb24gaXMgbnVsbCBvciBlbXB0eSBmb3IgdGhlIFN0YXRlOiBcInsyfVwiOiB1bmlxdWUgaWRlbnRpZmllcj1cInswfVwiIHZlcnNpb249XCJ7MX1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX05vU2l0ZVRhZz0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwic2l0ZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX01pc3Npbmc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFRoZSBcInswfVwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInsxfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdFNpdGVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgU2l0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX0NhdGVnb3J5QWxyZWFkeVNldD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudDogXCJ7MH1cIjogXCJ7MX1cIiBhbHJlYWR5IHNldCBmb3IgdGhlIFNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gZW5kIHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmc9IEVycm9yIFBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVycm9yOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvcmxpbmVDb2x1bW5NZXNzYWdlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50IFwiezB9XCIgbGluZTogXCJ7MX1cIiBjb2x1bW46XCJ7Mn1cIi4gRXJyb3I6IFwiezN9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdTaXRlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXRlPSBVbmtub3duIFN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtPSBUaGUgWE1MIHN0cmVhbSBpcyBub3QgYSB2YWxpZCBkZWZhdWx0IFwic2l0ZS54bWxcIiBmaWxlLiBUaGUgcm9vdCB0YWcgaXMgbm90IHNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9taXJyb3JzID0gRXJyb3IgcHJvY2Vzc2luZyB1cGRhdGUgc2l0ZSBtaXJyb3IuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclJlYWRpbmdEaWdlc3Q9RXJyb3IgcmVhZGluZyBzaXRlIGRpZ2VzdCB7MH0uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhZmZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWV4Y2VwdGlvbl9lcnJvckNvbnZlcnRpbmcgPSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIG1hbmlmZXN0IGZvciB7MH0uCi1leGNlcHRpb25fb3V0cHV0U3RyZWFtID0gVW5hYmxlIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgezB9LgotZXhjZXB0aW9uX2Vycm9yUGFyc2luZ1VwZGF0ZVNpdGUgPSBFcnJvciBwYXJzaW5nIHVwZGF0ZSBzaXRlOiB7MH0uCi1leGNlcHRpb25fc3RhdGVBZGRpdGlvbiA9IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgdGhlIGJ1bmRsZSB7MH0uCi1leGNlcHRpb25fc291cmNlRGlyZWN0b3J5SW52YWxpZCA9IFNvdXJjZSBkaXJlY3RvcnkgaXMgaW52YWxpZDogezB9LgotZXhjZXB0aW9uX2FydGlmYWN0UmVwb0xvY2F0aW9uVVJMID0gQXJ0aWZhY3QgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3QgYSB2YWxpZCBVUkw6IHswfS4KLWV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Ob3RXcml0YWJsZSA9IEFydGlmYWN0IHJlcG9zaXRvcnkgaXMgbm90IHdyaXRhYmxlOiB7MH0uCi1leGNlcHRpb25fbWV0YWRhdGFSZXBvTG9jYXRpb25VUkwgPSBNZXRhZGF0YSByZXBvc2l0b3J5IGxvY2F0aW9uIGlzIG5vdCBhIHZhbGlkIFVSTDogezB9LgotZXhjZXB0aW9uX21ldGFkYXRhUmVwb05vdFdyaXRhYmxlID0gTWV0YWRhdGEgcmVwb3NpdG9yeSBub3Qgd3JpdGFibGU6IHswfS4KLWV4Y2VwdGlvbl9iYXNlTG9jYXRpb25Ob3RTcGVjaWZpZWQgPSBFY2xpcHNlIGJhc2UgbG9jYXRpb24gbm90IHNwZWNpZmllZC4KLQotbWVzc2FnZV9nZW5lcmF0aW5nTWV0YWRhdGEgPSBHZW5lcmF0aW5nIG1ldGFkYXRhIGZvciB7MH0uCi1tZXNzYWdlX2dlbmVyYXRpb25Db21wbGV0ZWQgPSBHZW5lcmF0aW9uIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3MgW3swfSBzZWNvbmRzXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9CdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0J1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1NDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0J1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5wbHVnaW5jb252ZXJzaW9uLlBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb24uUGx1Z2luQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJkaXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKQVIgPSAiamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0ZJTEVOQU1FX0RFU0NSSVBUT1IgPSAiZmVhdHVyZS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9GSUxFTkFNRV9ERVNDUklQVE9SID0gInBsdWdpbi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX0ZJTEVOQU1FX0RFU0NSSVBUT1IgPSAiZnJhZ21lbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIFN0cmluZyBCVU5ETEVfRklMRV9LRVkgPSAiZWNsaXBzZS5wMi5idW5kbGUuZm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JVTkRMRV9MT0NBTElaQVRJT04gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAkKLQkvLwlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04gPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JLy8Jc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9MT0NBTElaQVRJT05TID0gImVjbGlwc2UucDIubWFuaWZlc3QubG9jYWxpemF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkvLwotCS8vCXN0YXRpYyBmaW5hbCBMb2NhbGUgREVGQVVMVF9MT0NBTEUgPSBuZXcgTG9jYWxlKCJkZiIsICJMVCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCS8vCXN0YXRpYyBmaW5hbCBMb2NhbGUgUFNFVURPX0xPQ0FMRSA9IG5ldyBMb2NhbGUoInp6IiwgIlpaIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlTdGF0ZU9iamVjdEZhY3RvcnkgZmFjdG9yeTsKLQlTdGF0ZSBzdGF0ZTsKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoU3RhdGVPYmplY3RGYWN0b3J5IGZhY3RvcnksIFN0YXRlIHN0YXRlKSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJLy9UT0RPIGZpbmQgYSBzdGF0ZSBhbmQgYSBmYWN0b3J5IHdoZW4gbm90IHByb3ZpZGVkCi0JfQotCi0JcHJpdmF0ZSBQbHVnaW5Db252ZXJ0ZXIgYWNxdWlyZVBsdWdpbkNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChQbHVnaW5Db252ZXJ0ZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBQbHVnaW5Db252ZXJ0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIERpY3Rpb25hcnkgY29udmVydFBsdWdpbk1hbmlmZXN0KEZpbGUgYnVuZGxlTG9jYXRpb24sIGJvb2xlYW4gbG9nQ29udmVyc2lvbkV4Y2VwdGlvbikgewotCQlQbHVnaW5Db252ZXJ0ZXIgY29udmVydGVyOwotCQl0cnkgewotCQkJY29udmVydGVyID0gYWNxdWlyZVBsdWdpbkNvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIlVuYWJsZSB0byBhcXVpcmUgUGx1Z2luQ29udmVydGVyIHNlcnZpY2UgZHVyaW5nIGdlbmVyYXRpb24gZm9yOiAiICsgYnVuZGxlTG9jYXRpb24pKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBjb252ZXJ0ZXIuY29udmVydE1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCBmYWxzZSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbikgewotCQkJLy8gb25seSBsb2cgdGhlIGV4Y2VwdGlvbiBpZiB3ZSBoYWQgYSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCBhbmQgd2UgZmFpbGVkIGNvbnZlcnNpb24KLQkJCWlmIChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkuZXF1YWxzKEZFQVRVUkVfRklMRU5BTUVfREVTQ1JJUFRPUikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIW5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBQTFVHSU5fRklMRU5BTUVfREVTQ1JJUFRPUikuZXhpc3RzKCkgJiYgIW5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBGUkFHTUVOVF9GSUxFTkFNRV9ERVNDUklQVE9SKS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChsb2dDb252ZXJzaW9uRXhjZXB0aW9uKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAwLCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fZXJyb3JDb252ZXJ0aW5nLCBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSksIGNvbnZlcnRFeGNlcHRpb24pOwotCQkJCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldEJ1bmRsZURlc2NyaXB0aW9uKERpY3Rpb25hcnkgZW5oYW5jZWRNYW5pZmVzdCwgRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQl0cnkgewotCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRvciA9IGZhY3RvcnkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIGVuaGFuY2VkTWFuaWZlc3QsIGJ1bmRsZUxvY2F0aW9uICE9IG51bGwgPyBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSA6IG51bGwsIDEpOyAvL1RPRE8gRG8gd2UgbmVlZCB0byBoYXZlIGEgcmVhbCBidW5kbGUgaWQKLQkJCWRlc2NyaXB0b3Iuc2V0VXNlck9iamVjdChlbmhhbmNlZE1hbmlmZXN0KTsKLQkJCXJldHVybiBkZXNjcmlwdG9yOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fc3RhdGVBZGRpdGlvbiwgYnVuZGxlTG9jYXRpb24gPT0gbnVsbCA/IG51bGwgOiBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIGUpOwotCQkJTG9nSGVscGVyLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gZ2V0QnVuZGxlRGVzY3JpcHRpb24oRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gbG9hZE1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldEJ1bmRsZURlc2NyaXB0aW9uKG1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldEJ1bmRsZURlc2NyaXB0aW9uKElucHV0U3RyZWFtIG1hbmlmZXN0U3RyZWFtLCBGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCUhhc2h0YWJsZSBlbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQl0cnkgewotCQkJTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QobWFuaWZlc3RTdHJlYW0sIGVudHJpZXMpOwotCQkJcmV0dXJuIGdldEJ1bmRsZURlc2NyaXB0aW9uKGVudHJpZXMsIGJ1bmRsZUxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgYnVuZGxlIGRlc2NyaXB0aW9uLiI7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBlKTsKLQkJCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIGJ1bmRsZSBkZXNjcmlwdGlvbi4iOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSk7Ci0JCQlMb2dIZWxwZXIubG9nKHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERpY3Rpb25hcnkgbG9hZE1hbmlmZXN0KEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJSW5wdXRTdHJlYW0gbWFuaWZlc3RTdHJlYW0gPSBudWxsOwotCQlaaXBGaWxlIGphckZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UobmV3IFBhdGgoYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIGJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlqYXJGaWxlID0gbmV3IFppcEZpbGUoYnVuZGxlTG9jYXRpb24sIFppcEZpbGUuT1BFTl9SRUFEKTsKLQkJCQlaaXBFbnRyeSBtYW5pZmVzdEVudHJ5ID0gamFyRmlsZS5nZXRFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwotCQkJCWlmIChtYW5pZmVzdEVudHJ5ICE9IG51bGwpIHsKLQkJCQkJbWFuaWZlc3RTdHJlYW0gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKG1hbmlmZXN0RW50cnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZSBtYW5pZmVzdEZpbGUgPSBuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKLQkJCQlpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpKQotCQkJCQltYW5pZmVzdFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3RGaWxlKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlIGJ1dCBsb2cKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGJ1bmRsZSBtYW5pZmVzdC4iLCBlKSk7Ci0JCX0KLQotCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gbnVsbDsKLQkJaWYgKG1hbmlmZXN0U3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTWFwIG1hbmlmZXN0TWFwID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QobWFuaWZlc3RTdHJlYW0sIG51bGwpOwotCQkJCS8vIFRPRE8gdGVtcG9yYXJ5IGhhY2suICBXZSBhcmUgcmVhZGluZyBhIE1hcCBidXQgZXZlcnlvbmUgd2FudHMgYSBEaWN0aW9uYXJ5IHNvIGNvbnZlcnQuCi0JCQkJLy8gcmVhbCBhbnN3ZXIgaXMgdG8gaGF2ZSBwZW9wbGUgZXhwZWN0IGEgTWFwIGJ1dCB0aGF0IGlzIGEgd2lkZXIgY2hhbmdlLgotCQkJCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZShtYW5pZmVzdE1hcCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGJ1bmRsZSBtYW5pZmVzdC4iLCBlKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBidW5kbGUgbWFuaWZlc3QuIiwgZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoamFyRmlsZSAhPSBudWxsKQotCQkJCQkJamFyRmlsZS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbWFuaWZlc3QgPSBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoYnVuZGxlTG9jYXRpb24sIHRydWUpOwotCQl9Ci0KLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvL0RlYWwgd2l0aCB0aGUgcHJlLTMuMCBwbHVnLWluIHNoYXBlIHdobyBoYXZlIGEgZGVmYXVsdCBqYXIgbWFuaWZlc3QubWYKLQkJaWYgKG1hbmlmZXN0LmdldChvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpID09IG51bGwpCi0JCQltYW5pZmVzdCA9IGNvbnZlcnRQbHVnaW5NYW5pZmVzdChidW5kbGVMb2NhdGlvbiwgdHJ1ZSk7Ci0KLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQltYW5pZmVzdC5wdXQoQlVORExFX0ZJTEVfS0VZLCBidW5kbGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpID8gRElSIDogSkFSKTsKLQkJZ2V0TWFuaWZlc3RMb2NhbGl6YXRpb25zKG1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbik7Ci0JCS8vIGxvY2FsaXplTWFuaWZlc3QobWFuaWZlc3QsIGJ1bmRsZUxvY2F0aW9uKTsKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KLQotCS8vCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLwkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCS8vCQlJbnB1dFN0cmVhbSBwcm9wZXJ0eVN0cmVhbSA9IG51bGw7Ci0JLy8JCXRyeSB7Ci0JLy8JCQl0cnkgewotCS8vCQkJCWlmIChidW5kbGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpKQotCS8vCQkJCQlwcm9wZXJ0eVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIGxvY2FsaXphdGlvbkZpbGUpKTsKLQkvLwkJCQllbHNlIHsKLQkvLwkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTCgiamFyOiIgKyBidW5kbGVMb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIS8iICsgbG9jYWxpemF0aW9uRmlsZSkub3BlbkNvbm5lY3Rpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8JCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkvLwkJCQkJcHJvcGVydHlTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JLy8JCQkJfQotCS8vCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkvLwkJCQkvLyBpZiB0aGVyZSBpcyBubyBtZXNzYWdlcyBmaWxlIHRoZW4ganVzdCByZXR1cm47Ci0JLy8JCQkJcmV0dXJuIHJlc3VsdDsKLQkvLwkJCX0KLQkvLwkJCXJlc3VsdC5sb2FkKHByb3BlcnR5U3RyZWFtKTsKLQkvLwkJfSBmaW5hbGx5IHsKLQkvLwkJCWlmIChwcm9wZXJ0eVN0cmVhbSAhPSBudWxsKQotCS8vCQkJCXByb3BlcnR5U3RyZWFtLmNsb3NlKCk7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIHJlc3VsdDsKLQkvLwl9Ci0KLQkvLyBDb2xsZWN0IHRoZSBtYW5pZmVzdCBsb2NhbGl6YXRpb25zIGZyb20gdGhlIGJ1bmRsZSBkaXJlY3RvcnkKLQkvLyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbWFuaWZlc3QuCi0JcHJpdmF0ZSB2b2lkIGdldE1hbmlmZXN0TG9jYWxpemF0aW9ucyhEaWN0aW9uYXJ5IG1hbmlmZXN0LCBGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCS8vCQlNYXAgbG9jYWxpemF0aW9uczsKLQkJLy8JCUxvY2FsZSBkZWZhdWx0TG9jYWxlID0gbnVsbDsgLy8gPSBMb2NhbGUuRU5HTElTSDsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBHZW5lcmF0b3JJbmZvCi0JCS8vCQlTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfTE9DQUxJWkFUSU9OKTsKLQkJLy8JCWlmIChidW5kbGVMb2NhbGl6YXRpb24gPT0gbnVsbCB8fCBidW5kbGVMb2NhbGl6YXRpb24udHJpbSgpLmxlbmd0aCgpID09IDApCi0JCS8vCQkJYnVuZGxlTG9jYWxpemF0aW9uID0gREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OOwotCQkvLwotCQkvLwkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UobmV3IFBhdGgoYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkJYnVuZGxlTG9jYXRpb24uaXNGaWxlKCkpIHsKLQkJLy8JCQlsb2NhbGl6YXRpb25zID0gZ2V0SmFyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbiwgbWFuaWZlc3QsIGRlZmF1bHRMb2NhbGUpOwotCQkvLwkJfSBlbHNlIHsKLQkJLy8JCQlsb2NhbGl6YXRpb25zID0gZ2V0RGlyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbiwgbWFuaWZlc3QsIGRlZmF1bHRMb2NhbGUpOwotCQkvLwkJfQotCQkvLwotCQkvLwkJaWYgKGxvY2FsaXphdGlvbnMuc2l6ZSgpID4gMCkgewotCQkvLwkJCW1hbmlmZXN0LnB1dChNQU5JRkVTVF9MT0NBTElaQVRJT05TLCBsb2NhbGl6YXRpb25zKTsKLQkJLy8JCX0KLQl9Ci0KLQkvLwlwcml2YXRlIE1hcCBnZXRKYXJNYW5pZmVzdExvY2FsaXphdGlvbihGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uLCBEaWN0aW9uYXJ5IG1hbmlmZXN0LCBMb2NhbGUgZGVmYXVsdExvY2FsZSkgewotCS8vCQlaaXBGaWxlIGphckZpbGUgPSBudWxsOwotCS8vCQlNYXAgbG9jYWxpemF0aW9ucyA9IG5ldyBIYXNoTWFwKDQpOwotCS8vCQl0cnkgewotCS8vCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JLy8JCQlmb3IgKEVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkvLwkJCQlaaXBFbnRyeSBuZXh0RW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkvLwkJCQlTdHJpbmcgbmV4dE5hbWUgPSBuZXh0RW50cnkuZ2V0TmFtZSgpOwotCS8vCQkJCVN0cmluZyBsb2NhbGVTdHJpbmcgPSBnZXRMb2NhbGVTdHJpbmcobmV4dE5hbWUsIGJ1bmRsZUxvY2FsaXphdGlvbik7Ci0JLy8KLQkvLwkJCQlpZiAoIW5leHRFbnRyeS5pc0RpcmVjdG9yeSgpICYmIGxvY2FsZVN0cmluZyAhPSBudWxsKSB7Ci0JLy8JCQkJCUxvY2FsZSBuZXh0TG9jYWxlID0gZ2V0TG9jYWxlKGxvY2FsZVN0cmluZyk7Ci0JLy8JCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JLy8JCQkJCXRyeSB7Ci0JLy8JCQkJCQlzdHJlYW0gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKG5leHRFbnRyeSk7Ci0JLy8JCQkJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCS8vCQkJCQkJcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0JLy8JCQkJCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFN0cmluZ3MgPSBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKG1hbmlmZXN0LCBwcm9wZXJ0aWVzKTsKLQkvLwkJCQkJCWlmIChsb2NhbGl6ZWRTdHJpbmdzLnNpemUoKSA+IDApIHsKLQkvLwkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkvLwkJCQkJCQlpZiAoREVGQVVMVF9MT0NBTEUuZXF1YWxzKG5leHRMb2NhbGUpICYmIGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgewotCS8vCQkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkvLwkJCQkJCQl9Ci0JLy8JCQkJCQl9Ci0JLy8JCQkJCX0gZmluYWxseSB7Ci0JLy8JCQkJCQlpZiAoc3RyZWFtICE9IG51bGwpCi0JLy8JCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JLy8JCQkJCX0KLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCS8vCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOwotCS8vCQl9IGZpbmFsbHkgewotCS8vCQkJaWYgKGphckZpbGUgIT0gbnVsbCkgewotCS8vCQkJCXRyeSB7Ci0JLy8JCQkJCWphckZpbGUuY2xvc2UoKTsKLQkvLwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkvLwkJCQkJLy8gZG8gbm90aGluZwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCi0JLy8JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgTWFwIGdldERpck1hbmlmZXN0TG9jYWxpemF0aW9uKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24sIERpY3Rpb25hcnkgbWFuaWZlc3QsIExvY2FsZSBkZWZhdWx0TG9jYWxlKSB7Ci0JLy8JCUZpbGUgbG9jYWxpemF0aW9uUGF0aCA9IG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24pOwotCS8vCQlGaWxlIGxvY2FsaXphdGlvbkRpciA9IGxvY2FsaXphdGlvblBhdGguZ2V0UGFyZW50RmlsZSgpOwotCS8vCQlTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSA9IGxvY2FsaXphdGlvblBhdGguZ2V0TmFtZSgpOwotCS8vCQlTdHJpbmdbXSBsb2NhbGl6YXRpb25GaWxlcyA9IGxvY2FsaXphdGlvbkRpci5saXN0KG5ldyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyKGxvY2FsaXphdGlvbkZpbGUpKTsKLQkvLwotCS8vCQlIYXNoTWFwIGxvY2FsaXphdGlvbnMgPSBudWxsOwotCS8vCi0JLy8JCWlmIChsb2NhbGl6YXRpb25GaWxlcyAhPSBudWxsKSB7Ci0JLy8JCQlsb2NhbGl6YXRpb25zID0gbmV3IEhhc2hNYXAobG9jYWxpemF0aW9uRmlsZXMubGVuZ3RoKTsKLQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxpemF0aW9uRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkvLwkJCQlTdHJpbmcgbmV4dEZpbGUgPSBsb2NhbGl6YXRpb25GaWxlc1tpXTsKLQkvLwkJCQlMb2NhbGUgbmV4dExvY2FsZSA9IGdldExvY2FsZShnZXRMb2NhbGVTdHJpbmcobmV4dEZpbGUsIGxvY2FsaXphdGlvbkZpbGUpKTsKLQkvLwotCS8vCQkJCXRyeSB7Ci0JLy8JCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGJ1bmRsZUxvY2F0aW9uLCBuZXh0RmlsZSk7Ci0JLy8JCQkJCVByb3BlcnRpZXMgbG9jYWxpemVkU3RyaW5ncyA9IGdldExvY2FsaXplZFByb3BlcnRpZXMobWFuaWZlc3QsIHByb3BlcnRpZXMpOwotCS8vCQkJCQlpZiAobG9jYWxpemVkU3RyaW5ncy5zaXplKCkgPiAwKSB7Ci0JLy8JCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkvLwkJCQkJCWlmIChERUZBVUxUX0xPQ0FMRS5lcXVhbHMobmV4dExvY2FsZSkgJiYgZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0JLy8JCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JLy8JCQkJCQl9Ci0JLy8JCQkJCX0KLQkvLwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkvLwkJCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCi0JLy8JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCS8vCX0KLQotCS8vCXByaXZhdGUgY2xhc3MgTG9jYWxpemF0aW9uRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKLQkvLwotCS8vCQlTdHJpbmcgZmlsZW5hbWVQcmVmaXg7Ci0JLy8KLQkvLwkJcHVibGljIExvY2FsaXphdGlvbkZpbGVGaWx0ZXIoU3RyaW5nIGZpbGVuYW1lUHJlZml4KSB7Ci0JLy8JCQl0aGlzLmZpbGVuYW1lUHJlZml4ID0gZmlsZW5hbWVQcmVmaXg7Ci0JLy8JCX0KLQkvLwotCS8vCQkvKiAobm9uLUphdmFkb2MpCi0JLy8JCSAqIEBzZWUgamF2YS5pby5GaWxlbmFtZUZpbHRlciNhY2NlcHQoamF2YS5pby5GaWxlLCBqYXZhLmxhbmcuU3RyaW5nKQotCS8vCQkgKi8KLQkvLwkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwkJCXJldHVybiAoZ2V0TG9jYWxlU3RyaW5nKGZpbGVuYW1lLCBmaWxlbmFtZVByZWZpeCkgIT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7Ci0JLy8JCX0KLQkvLwl9Ci0KLQkvLwlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRMb2NhbGVTdHJpbmcoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZmlsZW5hbWVQcmVmaXgpIHsKLQkvLwkJU3RyaW5nIGxvY2FsZVN0cmluZyA9IG51bGw7Ci0JLy8JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKGZpbGVuYW1lUHJlZml4KSAmJiBmaWxlbmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OKSkgewotCS8vCQkJaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gZmlsZW5hbWVQcmVmaXgubGVuZ3RoKCkgKyBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCgpKSB7Ci0JLy8JCQkJbG9jYWxlU3RyaW5nID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lUHJlZml4Lmxlbmd0aCgpICsgMSwgZmlsZW5hbWUubGVuZ3RoKCkgLSBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCgpKTsKLQkvLwkJCX0gZWxzZSB7Ci0JLy8JCQkJbG9jYWxlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLwkJCX0KLQkvLwkJfQotCS8vCQlyZXR1cm4gbG9jYWxlU3RyaW5nOwotCS8vCX0KLQotCS8vCXN0YXRpYyBwcml2YXRlIExvY2FsZSBnZXRMb2NhbGUoU3RyaW5nIGxvY2FsZVN0cmluZykgewotCS8vCQlMb2NhbGUgbG9jYWxlID0gREVGQVVMVF9MT0NBTEU7Ci0JLy8JCWlmIChsb2NhbGVTdHJpbmcubGVuZ3RoKCkgPT0gNSAmJiBsb2NhbGVTdHJpbmcuaW5kZXhPZignXycpID09IDIpIHsKLQkvLwkJCWxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlU3RyaW5nLnN1YnN0cmluZygwLCAyKSwgbG9jYWxlU3RyaW5nLnN1YnN0cmluZygzLCA1KSk7Ci0JLy8JCX0gZWxzZSBpZiAobG9jYWxlU3RyaW5nLmxlbmd0aCgpID09IDIpIHsKLQkvLwkJCWxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlU3RyaW5nLnN1YnN0cmluZygwLCAyKSk7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIGxvY2FsZTsKLQkvLwl9Ci0JLy8KLQkvLwlzdGF0aWMgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldExvY2FsaXplZFByb3BlcnRpZXMoRGljdGlvbmFyeSBtYW5pZmVzdCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JLy8JCS8vIFdhbGsgb3ZlciB0aGUgbWFuaWZlc3QgYW5kIGZpbmQgYWxsICV4eHggd2l0aCB0aGUgc3RyaW5nIHZhbHVlCi0JLy8JCS8vIGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUgYW5kIGNvcHkgdGhlbSB0byB0aGUgbG9jYWxpemVkIHByb3BlcnRpZXMuCi0JLy8JCVByb3BlcnRpZXMgbG9jYWxpemVkUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JLy8JCWZvciAoRW51bWVyYXRpb24gZSA9IG1hbmlmZXN0LmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkvLwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JLy8JCQlPYmplY3QgdmFsdWUgPSBtYW5pZmVzdC5nZXQoa2V5KTsKLQkvLwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCS8vCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotCS8vCQkJCWlmIChzdHJpbmdWYWx1ZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHN0cmluZ1ZhbHVlLnN1YnN0cmluZygxKSk7Ci0JLy8JCQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsKQotCS8vCQkJCQkJbG9jYWxpemVkUHJvcGVydGllcy5wdXQoa2V5LCBuZXdWYWx1ZSk7Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9Ci0JLy8JCXJldHVybiBsb2NhbGl6ZWRQcm9wZXJ0aWVzOwotCS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0VjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZTNiOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LkVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIGltcGxlbWVudHMgSUdlbmVyYXRvckluZm8gewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxURVJfT0JKRUNUQ0xBU1MgPSAiKCIgKyBDb25zdGFudHMuT0JKRUNUQ0xBU1MgKyAiPSIgKyBGcmFtZXdvcmtBZG1pbi5jbGFzcy5nZXROYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyRndOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9GV19OQU1FICsgIj1FcXVpbm94KSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vU3RyaW5nIGZpbHRlckZ3VmVyc2lvbiA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfVkVSU0lPTiArICI9IiArIHByb3BzLmdldFByb3BlcnR5KCJlcXVpbm94LmZ3LnZlcnNpb24iKSArICIpIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyTGF1bmNoZXJOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9OQU1FICsgIj1FY2xpcHNlLmV4ZSkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvL1N0cmluZyBmaWx0ZXJMYXVuY2hlclZlcnNpb24gPSAiKCIgKyBGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX1ZFUlNJT04gKyAiPSIgKyBwcm9wcy5nZXRQcm9wZXJ0eSgiZXF1aW5veC5sYXVuY2hlci52ZXJzaW9uIikgKyAiKSI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZyYW1ld29ya0FkbWluRmlsbHRlciA9ICIoJiIgKyBGSUxURVJfT0JKRUNUQ0xBU1MgKyBmaWx0ZXJGd05hbWUgKyBmaWx0ZXJMYXVuY2hlck5hbWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX0VRVUlOT1hfRlJBTUVXT1JLQURNSU5fRVFVSU5PWCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX0VRVUlOT1hfUDJfUkVDT05DSUxFUl9EUk9QSU5TID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiAJVE9ETzogVGVtcG9yYXJ5IGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGVjbGlwc2UgaW5zdGFsbHMKLQkgKiAJCSAgaW4gYSBwcm9maWxlIHNob3VsZCBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkgKiAJCSAgd2l0aCB1cGRhdGUgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0NPTVBBVElCSUxJVFkgPSAiZWNsaXBzZS5wMi51cGRhdGUuY29tcGF0aWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG9zOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgbmFtZSBmb3IgdGhlIGV4ZWN1dGFibGUuCi0JICogQHBhcmFtIHByb3ZpZGVkT1MgVGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gcmV0dXJuIHRoZSBleGVjdXRhYmxlIGZvci4gSWYgbnVsbCwKLQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgcnVudGltZSBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhlY3V0YWJsZU5hbWUoU3RyaW5nIHByb3ZpZGVkT1MpIHsKLQkJU3RyaW5nIHRoZU9TID0gcHJvdmlkZWRPUzsKLQkJaWYgKHRoZU9TID09IG51bGwpIHsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVudmlyb25tZW50SW5mby5jbGFzcy5nZXROYW1lKCkpOwotCQkJdGhlT1MgPSBpbmZvLmdldE9TKCk7Ci0JCX0KLQkJaWYgKHRoZU9TLmVxdWFsc0lnbm9yZUNhc2UoIndpbjMyIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiZWNsaXBzZS5leGUiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGVPUy5lcXVhbHNJZ25vcmVDYXNlKCJtYWNvc3giKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJFY2xpcHNlLmFwcCI7IC8vJE5PTi1OTFMtMSQKLQkJLy9GSVhNRSBJcyB0aGlzIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciBhbGwgbm9uLVdpbmRvd3MgcGxhdGZvcm1zPwotCQlyZXR1cm4gImVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZERlZmF1bHRJVXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFwcGVuZCA9IGZhbHNlOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBhcnRpZmFjdFJlcG9zaXRvcnk7Ci0JcHJpdmF0ZSBGaWxlIGJhc2VMb2NhdGlvbjsKLQlwcml2YXRlIEZpbGVbXSBidW5kbGVMb2NhdGlvbnM7Ci0JcHJpdmF0ZSBGaWxlIGNvbmZpZ0xvY2F0aW9uOwotCXByaXZhdGUgQXJyYXlMaXN0IGRlZmF1bHRJVXM7Ci0JcHJpdmF0ZSBMaXN0IG90aGVySVVzOwotCXByaXZhdGUgRmlsZSBleGVjdXRhYmxlTG9jYXRpb247Ci0JcHJpdmF0ZSBGaWxlIGZlYXR1cmVzTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgZnJhbWV3b3JrQWRtaW5UcmFja2VyOwotCXByaXZhdGUgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3I7Ci0JcHJpdmF0ZSBTdHJpbmdbXVtdIG1hcHBpbmdSdWxlczsKLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5OwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQXJ0aWZhY3RSZXBvID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBcnRpZmFjdHMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29tcGF0aWJpbGl0eSA9IEJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoVVBEQVRFX0NPTVBBVElCSUxJVFksICJmYWxzZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIHJvb3RJZDsKLQlwcml2YXRlIFN0cmluZyByb290VmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBwcm9kdWN0RmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJDb25maWc7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbkFkdmljZTsKLQotCXByaXZhdGUgVVJMIHNpdGVMb2NhdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiByZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzID0gZmFsc2U7Ci0KLQlwdWJsaWMgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkRGVmYXVsdElVcygpIHsKLQkJcmV0dXJuIGFkZERlZmF1bHRJVXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYXBwZW5kKCkgewotCQlyZXR1cm4gYXBwZW5kOwotCX0KLQotCXByb3RlY3RlZCBHZW5lcmF0b3JCdW5kbGVJbmZvIGNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQnVuZGxlSW5mbygpIHsKLQkJR2VuZXJhdG9yQnVuZGxlSW5mbyByZXN1bHQgPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbygpOwotCQlyZXN1bHQuc2V0U3ltYm9saWNOYW1lKCJkZWZhdWx0Q29uZmlndXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFZlcnNpb24oIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFN0YXJ0TGV2ZWwoNCk7Ci0JCS8vIFRoZXNlIHNob3VsZCBqdXN0IGJlIGluIHRoZSBpbnN0YWxsIHNlY3Rpb24gbm93Ci0JCS8vCQlyZXN1bHQuc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCJpbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckJ1bmRsZUluZm8gY3JlYXRlRGVmYXVsdFVuY29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSB7Ci0JCUdlbmVyYXRvckJ1bmRsZUluZm8gcmVzdWx0ID0gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oKTsKLQkJcmVzdWx0LnNldFN5bWJvbGljTmFtZSgiZGVmYXVsdFVuY29uZmlndXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFZlcnNpb24oIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVGhlc2Ugc2hvdWxkIGp1c3QgYmUgaW4gdGhlIHVuaW5zdGFsbCBzZWN0aW9uIG5vdwotCQkvLwkJcmVzdWx0LnNldFNwZWNpYWxDb25maWdDb21tYW5kcygidW5pbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogT2J0YWlucyB0aGUgZnJhbWV3b3JrIG1hbmlwdWxhdG9yIGluc3RhbmNlLiBUaHJvd3MgYW4gZXhjZXB0aW9uCi0JICogaWYgaXQgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZyYW1ld29ya01hbmlwdWxhdG9yKCkgewotCQlGcmFtZXdvcmtBZG1pbiBhZG1pbiA9IGdldEZyYW1ld29ya0FkbWluKCk7Ci0JCWlmIChhZG1pbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZyYW1ld29yayBhZG1pbiBzZXJ2aWNlIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlwdWxhdG9yID0gYWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJaWYgKG1hbmlwdWxhdG9yID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRnJhbWV3b3JrIG1hbmlwdWxhdG9yIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdW5kbGVJbmZvIGNyZWF0ZUxhdW5jaGVyKCkgewotCQlHZW5lcmF0b3JCdW5kbGVJbmZvIHJlc3VsdCA9IG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKCk7Ci0JCXJlc3VsdC5zZXRTeW1ib2xpY05hbWUoIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0VmVyc2lvbigiMC4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQkvL3Jlc3VsdC5zZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoIm1hbmlwdWxhdG9yLmFkZFByb2dyYW1Bcmd1bWVudCgnLXN0YXJ0dXAnKTsgbWFuaXB1bGF0b3IuYWRkUHJvZ3JhbUFyZ3VtZW50KGFydGlmYWN0KTsiKTsKLQkJcmVzdWx0LnNldFNwZWNpYWxDb25maWdDb21tYW5kcygiYWRkUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOi1zdGFydHVwKTthZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6QGFydGlmYWN0KTsiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoInJlbW92ZVByb2dyYW1BcmcocHJvZ3JhbUFyZzotc3RhcnR1cCk7cmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOkBhcnRpZmFjdCk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlTGF1bmNoZXJCdW5kbGVJbmZvKFNldCBpdXMpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCQlDb2xsZWN0aW9uIGxhdW5jaGVycyA9IGdldElVcyhpdXMsICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsYXVuY2hlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBvYmplY3QgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdC5nZXRJZCgpLmVuZHNXaXRoKCIuc291cmNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCUdlbmVyYXRvckJ1bmRsZUluZm8gdGVtcCA9IG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKCk7Ci0JCQl0ZW1wLnNldFN5bWJvbGljTmFtZShvYmplY3QuZ2V0SWQoKSk7Ci0JCQl0ZW1wLnNldFZlcnNpb24ob2JqZWN0LmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJCXRlbXAuc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCJhZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6LS1sYXVuY2hlci5saWJyYXJ5KTthZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6QGFydGlmYWN0KTsiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVtcC5zZXRTcGVjaWFsVW5jb25maWdDb21tYW5kcygicmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOi0tbGF1bmNoZXIubGlicmFyeSk7cmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOkBhcnRpZmFjdCk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5hZGQodGVtcCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyYXRvckJ1bmRsZUluZm8gY3JlYXRlU2ltcGxlQ29uZmlndXJhdG9yQnVuZGxlSW5mbygpIHsKLQkJR2VuZXJhdG9yQnVuZGxlSW5mbyByZXN1bHQgPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbygpOwotCQlyZXN1bHQuc2V0U3ltYm9saWNOYW1lKE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SKTsKLQkJcmVzdWx0LnNldFZlcnNpb24oIjAuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFN0YXJ0TGV2ZWwoMSk7Ci0JCXJlc3VsdC5zZXRNYXJrZWRBc1N0YXJ0ZWQodHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdW5kbGVJbmZvIGNyZWF0ZURyb3BpbnNSZWNvbmNpbGVyQnVuZGxlSW5mbygpIHsKLQkJR2VuZXJhdG9yQnVuZGxlSW5mbyByZXN1bHQgPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbygpOwotCQlyZXN1bHQuc2V0U3ltYm9saWNOYW1lKE9SR19FQ0xJUFNFX0VRVUlOT1hfUDJfUkVDT05DSUxFUl9EUk9QSU5TKTsKLQkJcmVzdWx0LnNldFZlcnNpb24oIjAuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldE1hcmtlZEFzU3RhcnRlZCh0cnVlKTsKLQkJcmVzdWx0LnNldFNwZWNpYWxDb25maWdDb21tYW5kcygibWtkaXIocGF0aDoke2luc3RhbGxGb2xkZXJ9L2Ryb3BpbnMpIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCJybWRpcihwYXRoOiR7aW5zdGFsbEZvbGRlcn0vZHJvcGlucykiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRCdW5kbGVMb2NhdGlvbnMoKSB7Ci0JCWlmIChidW5kbGVMb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJYnVuZGxlTG9jYXRpb25zID0gbmV3IEZpbGVbXSB7fTsKLQkJCXJldHVybjsKLQkJfQotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBsb2NhdGlvbiA9IGJ1bmRsZUxvY2F0aW9uc1tpXTsKLQkJCWlmIChsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJRmlsZVtdIGxpc3QgPSBsb2NhdGlvbi5saXN0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspCi0JCQkJCXJlc3VsdC5hZGQobGlzdFtqXSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hZGQobG9jYXRpb24pOwotCQkJfQotCQl9Ci0JCWJ1bmRsZUxvY2F0aW9ucyA9IChGaWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBGaWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlW10gZ2V0QnVuZGxlTG9jYXRpb25zKCkgewotCQlyZXR1cm4gYnVuZGxlTG9jYXRpb25zOwotCX0KLQotCXB1YmxpYyBDb25maWdEYXRhIGdldENvbmZpZ0RhdGEoKSB7Ci0JCXJldHVybiBtYW5pcHVsYXRvciA9PSBudWxsID8gbnVsbCA6IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlnRGF0YSBsb2FkQ29uZmlnRGF0YShGaWxlIGxvY2F0aW9uKSB7Ci0JCWlmIChtYW5pcHVsYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZWFkRndDb25maWcobWFuaXB1bGF0b3IsIGxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZ0xvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RGVmYXVsdElVcyhTZXQgaXVzKSB7Ci0JCWlmIChkZWZhdWx0SVVzICE9IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdElVczsKLQkJZGVmYXVsdElVcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCWlmIChhZGREZWZhdWx0SVVzKSB7Ci0JCQlkZWZhdWx0SVVzLmFkZEFsbChjcmVhdGVMYXVuY2hlckJ1bmRsZUluZm8oaXVzKSk7Ci0JCQlkZWZhdWx0SVVzLmFkZChjcmVhdGVMYXVuY2hlcigpKTsKLQkJCWRlZmF1bHRJVXMuYWRkKGNyZWF0ZVNpbXBsZUNvbmZpZ3VyYXRvckJ1bmRsZUluZm8oKSk7Ci0JCQlkZWZhdWx0SVVzLmFkZChjcmVhdGVEcm9waW5zUmVjb25jaWxlckJ1bmRsZUluZm8oKSk7Ci0JCQkvLwkJCWRlZmF1bHRJVXMuYWRkKGNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQnVuZGxlSW5mbygpKTsKLQkJCS8vCQkJZGVmYXVsdElVcy5hZGQoY3JlYXRlRGVmYXVsdFVuY29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJVXM7Ci0JfQotCi0JLy8gVE9ETzogVGhpcyBpcyBraW5kIG9mIHVnbHkuIEl0J3MgcHVycG9zZSBpcyB0byBhbGxvdyB1cyB0byBjcmFmdCBDVXMgdGhhdCB3ZSBrbm93IGFib3V0IGFuZCBuZWVkIGZvciBvdXIgYnVpbGQKLQkvLyBXZSBzaG91bGQgdHJ5IHRvIHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyaWMgcHJpb3IgdG8gcmVsZWFzZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE90aGVySVVzKCkgewotCQlpZiAob3RoZXJJVXMgIT0gbnVsbCkKLQkJCXJldHVybiBvdGhlcklVczsKLQkJb3RoZXJJVXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW90aGVySVVzLmFkZChjcmVhdGVEcm9waW5zUmVjb25jaWxlckJ1bmRsZUluZm8oKSk7Ci0JCXJldHVybiBvdGhlcklVczsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRFeGVjdXRhYmxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBleGVjdXRhYmxlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RmVhdHVyZXNMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZlYXR1cmVzTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGbGF2b3IoKSB7Ci0JCXJldHVybiBmbGF2b3I7Ci0JfQotCi0JcHJpdmF0ZSBGcmFtZXdvcmtBZG1pbiBnZXRGcmFtZXdvcmtBZG1pbigpIHsKLQkJaWYgKGZyYW1ld29ya0FkbWluVHJhY2tlciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUZpbHRlciBmaWx0ZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmNyZWF0ZUZpbHRlcihmcmFtZXdvcmtBZG1pbkZpbGx0ZXIpOwotCQkJCWZyYW1ld29ya0FkbWluVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBmaWx0ZXIsIG51bGwpOwotCQkJCWZyYW1ld29ya0FkbWluVHJhY2tlci5vcGVuKCk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZXZlciBoYXBwZW5zCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkvLwkJdHJ5IHsKLQkJLy8JCQlmcmFtZXdvcmtBZG1pblRyYWNrZXIud2FpdEZvclNlcnZpY2UoNTAwKTsKLQkJLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJLy8JCQkvLyBpZ25vcmUKLQkJLy8JCX0KLQotCQlGcmFtZXdvcmtBZG1pbiBhZG1pbiA9IChGcmFtZXdvcmtBZG1pbikgZnJhbWV3b3JrQWRtaW5UcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJaWYgKGFkbWluID09IG51bGwpIHsKLQkJCXN0YXJ0QnVuZGxlKE9SR19FQ0xJUFNFX0VRVUlOT1hfRlJBTUVXT1JLQURNSU5fRVFVSU5PWCk7Ci0JCQlzdGFydEJ1bmRsZShPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUik7Ci0JCQlhZG1pbiA9IChGcmFtZXdvcmtBZG1pbikgZnJhbWV3b3JrQWRtaW5UcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJfQotCQlyZXR1cm4gYWRtaW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNVcGRhdGVDb21wYXRpYmxlKCkgewotCQlyZXR1cm4gdXBkYXRlQ29tcGF0aWJpbGl0eTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SVVzKFNldCBpdXMsIFN0cmluZyBwcmVmaXgpIHsKLQkJU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCB0bXAgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRtcC5nZXRJZCgpLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXN1bHQuYWRkKHRtcCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRKUkVMb2NhdGlvbigpIHsKLQkJLy9hc3N1bWUgSlJFIGlzIHJlbGF0aXZlIHRvIGluc3RhbGwgbG9jYXRpb24KLQkJaWYgKGV4ZWN1dGFibGVMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZShleGVjdXRhYmxlTG9jYXRpb24uZ2V0UGFyZW50RmlsZSgpLCAianJlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyQ29uZmlnKCkgewotCQlyZXR1cm4gbGF1bmNoZXJDb25maWc7Ci0JfQotCi0JcHVibGljIExhdW5jaGVyRGF0YSBnZXRMYXVuY2hlckRhdGEoKSB7Ci0JCXJldHVybiBtYW5pcHVsYXRvciA9PSBudWxsID8gbnVsbCA6IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXVtdIGdldE1hcHBpbmdSdWxlcygpIHsKLQkJcmV0dXJuIG1hcHBpbmdSdWxlczsKLQl9Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRNZXRhZGF0YVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBtZXRhZGF0YVJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290SWQoKSB7Ci0JCXJldHVybiByb290SWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290VmVyc2lvbigpIHsKLQkJaWYgKHJvb3RWZXJzaW9uID09IG51bGwpCi0JCQlyZXR1cm4gIjAuMC4wIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcm9vdFZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9kdWN0RmlsZSgpIHsKLQkJcmV0dXJuIHByb2R1Y3RGaWxlOwotCX0KLQotCXB1YmxpYyBVUkwgZ2V0U2l0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gc2l0ZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRmlsZSBiYXNlKSB7Ci0JCWluaXRpYWxpemUoYmFzZSwgbmV3IEZpbGUoYmFzZSwgImNvbmZpZ3VyYXRpb24iKSwgbmV3IEZpbGUoYmFzZSwgZ2V0RGVmYXVsdEV4ZWN1dGFibGVOYW1lKG9zKSksIG5ldyBGaWxlW10ge25ldyBGaWxlKGJhc2UsICJwbHVnaW5zIil9LCBuZXcgRmlsZShiYXNlLCAiZmVhdHVyZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShGaWxlIGJhc2UsIEZpbGUgY29uZmlnLCBGaWxlIGV4ZWN1dGFibGUsIEZpbGVbXSBidW5kbGVMb2NhdGlvbnMsIEZpbGUgZmVhdHVyZXMpIHsKLQkJLy8gVE9ETwotCQlpZiAoYmFzZSA9PSBudWxsIHx8ICFiYXNlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3NvdXJjZURpcmVjdG9yeUludmFsaWQsIGJhc2UgPT0gbnVsbCA/ICJudWxsIiA6IGJhc2UuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmJhc2VMb2NhdGlvbiA9IGJhc2U7Ci0JCWlmIChjb25maWcgPT0gbnVsbCB8fCBjb25maWcuZXhpc3RzKCkpCi0JCQl0aGlzLmNvbmZpZ0xvY2F0aW9uID0gY29uZmlnOwotCQlpZiAoZXhlY3V0YWJsZSA9PSBudWxsIHx8IGV4ZWN1dGFibGUuZXhpc3RzKCkpCi0JCQl0aGlzLmV4ZWN1dGFibGVMb2NhdGlvbiA9IGV4ZWN1dGFibGU7Ci0JCXRoaXMuYnVuZGxlTG9jYXRpb25zID0gYnVuZGxlTG9jYXRpb25zOwotCQl0aGlzLmZlYXR1cmVzTG9jYXRpb24gPSBmZWF0dXJlczsKLQotCQlleHBhbmRCdW5kbGVMb2NhdGlvbnMoKTsKLQotCQkvLyBpZiB0aGUgY29uZmlnIG9yIGV4ZSBhcmUgbm90IHNldCB0aGVuIHdlIGNhbm5vdCBiZSBnZW5lcmF0aW5nIGFueSBkYXRhIHJlbGF0ZWQgdG8gdGhlIGNvbmZpZyBzbyAKLQkJLy8gZG9uJ3QgYm90aGVyIHNldHRpbmcgdXAgdGhlIG1hbmlwdWxhdG9yLiAgSW4gZmFjdCwgdGhlIG1hbmlwdWxhdG9yIHdpbGwgbGlrZWx5IGJlIGludmFsaWQgd2l0aG91dAotCQkvLyB0aGVzZSBsb2NhdGlvbnMuCi0JCWlmIChjb25maWdMb2NhdGlvbiA9PSBudWxsIHx8IGV4ZWN1dGFibGVMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNyZWF0ZUZyYW1ld29ya01hbmlwdWxhdG9yKCk7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGNvbmZpZ0xvY2F0aW9uLCB0cnVlKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKGV4ZWN1dGFibGVMb2NhdGlvbik7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlMikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hBcnRpZmFjdFJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBwdWJsaXNoQXJ0aWZhY3RSZXBvOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hBcnRpZmFjdHMoKSB7Ci0JCXJldHVybiBwdWJsaXNoQXJ0aWZhY3RzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldXNlRXhpc3RpbmdQYWNrMjAwRmlsZXMoKSB7Ci0JCXJldHVybiByZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldXNlRXhpc3RpbmdQYWNrMjAwRmlsZXMoYm9vbGVhbiBwdWJsaXNoUGFjaykgewotCQlyZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzID0gcHVibGlzaFBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRkRGVmYXVsdElVcyhib29sZWFuIHZhbHVlKSB7Ci0JCWFkZERlZmF1bHRJVXMgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiB2YWx1ZSkgewotCQlhcHBlbmQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSB2YWx1ZSkgewotCQlhcnRpZmFjdFJlcG9zaXRvcnkgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlTG9jYXRpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCWV4ZWN1dGFibGVMb2NhdGlvbiA9IG5ldyBGaWxlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGbGF2b3IoU3RyaW5nIHZhbHVlKSB7Ci0JCWZsYXZvciA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzVXBkYXRlQ29tcGF0aWJsZShib29sZWFuIGlzQ29tcGF0aWJsZSkgewotCQl0aGlzLnVwZGF0ZUNvbXBhdGliaWxpdHkgPSBpc0NvbXBhdGlibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXJDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCWxhdW5jaGVyQ29uZmlnID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ1J1bGVzKFN0cmluZ1tdW10gdmFsdWUpIHsKLQkJbWFwcGluZ1J1bGVzID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFSZXBvc2l0b3J5KElNZXRhZGF0YVJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJbWV0YWRhdGFSZXBvc2l0b3J5ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T1MoU3RyaW5nIG9zKSB7Ci0JCXRoaXMub3MgPSBvczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQXJ0aWZhY3RSZXBvc2l0b3J5KGJvb2xlYW4gdmFsdWUpIHsKLQkJcHVibGlzaEFydGlmYWN0UmVwbyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdHMoYm9vbGVhbiB2YWx1ZSkgewotCQlwdWJsaXNoQXJ0aWZhY3RzID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdElkKFN0cmluZyB2YWx1ZSkgewotCQlyb290SWQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290VmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJcm9vdFZlcnNpb24gPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9kdWN0RmlsZShTdHJpbmcgZmlsZSkgewotCQlwcm9kdWN0RmlsZSA9IGZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYXRpb24gb2Ygc2l0ZS54bWwgaWYgYXBwbGljYWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlTG9jYXRpb24oVVJMIGxvY2F0aW9uKSB7Ci0JCXRoaXMuc2l0ZUxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0QnVuZGxlKFN0cmluZyBidW5kbGVJZCkgewotCQlQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluID0gKFBhY2thZ2VBZG1pbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKGJ1bmRsZUlkLCBudWxsKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCAmJiBidW5kbGVzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmICgoYnVuZGxlc1swXS5nZXRTdGF0ZSgpICYgQnVuZGxlLlJFU09MVkVEKSA+IDApIHsKLQkJCQkJCWJ1bmRsZXNbMF0uc3RhcnQoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZmFpbGVkLCB0cnkgbmV4dCBidW5kbGUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkFkdmljZSgpIHsKLQkJcmV0dXJuIHZlcnNpb25BZHZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbkFkdmljZShTdHJpbmcgYWR2aWNlKSB7Ci0JCXRoaXMudmVyc2lvbkFkdmljZSA9IGFkdmljZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9GZWF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTlkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogCi0gKiBGZWF0dXJlIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2U7Ci0KLQlwcml2YXRlIFVSTEVudHJ5IGRlc2NyaXB0aW9uOwotCXByaXZhdGUgVVJMRW50cnkgbGljZW5zZTsKLQlwcml2YXRlIFVSTEVudHJ5IGNvcHlyaWdodDsKLQotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyOwotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyVVJMOwotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyTGlicmFyeTsKLQotCXByaXZhdGUgVVJMRW50cnkgdXBkYXRlU2l0ZTsKLQlwcml2YXRlIEFycmF5TGlzdCBkaXNjb3ZlcnlTaXRlczsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVudHJpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXJOYW1lOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotCXB1YmxpYyBGZWF0dXJlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREaXNjb3ZlcnlTaXRlKFN0cmluZyBsYWJlbCwgU3RyaW5nIHVybCkgewotCQlpZiAobGFiZWwgPT0gbnVsbCAmJiB1cmwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5kaXNjb3ZlcnlTaXRlcyA9PSBudWxsKQotCQkJdGhpcy5kaXNjb3ZlcnlTaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlVUkxFbnRyeSBlbnRyeSA9IG5ldyBVUkxFbnRyeSh1cmwsIGxhYmVsKTsKLQkJdGhpcy5kaXNjb3ZlcnlTaXRlcy5hZGQoZW50cnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KEZlYXR1cmVFbnRyeSBwbHVnaW4pIHsKLQkJaWYgKGVudHJpZXMgPT0gbnVsbCkKLQkJCWVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkKHBsdWdpbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcmNoKCkgewotCQlyZXR1cm4gYXJjaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodCgpIHsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsKQotCQkJcmV0dXJuIGNvcHlyaWdodC5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0VVJMKCkgewotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwpCi0JCQlyZXR1cm4gY29weXJpZ2h0LmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25VUkwoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVVJMRW50cnlbXSBnZXREaXNjb3ZlcnlTaXRlcygpIHsKLQkJaWYgKGRpc2NvdmVyeVNpdGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFVSTEVudHJ5WzBdOwotCQlyZXR1cm4gKFVSTEVudHJ5W10pIGRpc2NvdmVyeVNpdGVzLnRvQXJyYXkobmV3IFVSTEVudHJ5W2Rpc2NvdmVyeVNpdGVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlRW50cnlbXSBnZXRFbnRyaWVzKCkgewotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlRW50cnlbMF07Ci0JCXJldHVybiAoRmVhdHVyZUVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgRmVhdHVyZUVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxIYW5kbGVyKCkgewotCQlyZXR1cm4gaW5zdGFsbEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoKSB7Ci0JCXJldHVybiBpbnN0YWxsSGFuZGxlckxpYnJhcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGFuZGxlclVSTCgpIHsKLQkJcmV0dXJuIGluc3RhbGxIYW5kbGVyVVJMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoKSB7Ci0JCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQlyZXR1cm4gbGljZW5zZS5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZVVSTCgpIHsKLQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKLQkJCXJldHVybiBsaWNlbnNlLmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgewotCQlyZXR1cm4gbmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgewotCQlyZXR1cm4gcHJvdmlkZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlU2l0ZUxhYmVsKCkgewotCQlpZiAodXBkYXRlU2l0ZSAhPSBudWxsKQotCQkJcmV0dXJuIHVwZGF0ZVNpdGUuZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZVNpdGVVUkwoKSB7Ci0JCWlmICh1cGRhdGVTaXRlICE9IG51bGwpCi0JCQlyZXR1cm4gdXBkYXRlU2l0ZS5nZXRVUkwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBjb3B5cmlnaHQpIHsKLQkJaWYgKHRoaXMuY29weXJpZ2h0ID09IG51bGwpCi0JCQl0aGlzLmNvcHlyaWdodCA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmNvcHlyaWdodC5zZXRBbm5vdGF0aW9uKGNvcHlyaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0VVJMKFN0cmluZyBjb3B5cmlnaHRVUkwpIHsKLQkJaWYgKHRoaXMuY29weXJpZ2h0ID09IG51bGwpCi0JCQl0aGlzLmNvcHlyaWdodCA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmNvcHlyaWdodC5zZXRVUkwoY29weXJpZ2h0VVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbi5zZXRBbm5vdGF0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblVSTChTdHJpbmcgZGVzY3JpcHRpb25VUkwpIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbi5zZXRVUkwoZGVzY3JpcHRpb25VUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZyBvcywgU3RyaW5nIHdzLCBTdHJpbmcgYXJjaCwgU3RyaW5nIG5sKSB7Ci0JCXRoaXMub3MgPSBvczsKLQkJdGhpcy53cyA9IHdzOwotCQl0aGlzLmFyY2ggPSBhcmNoOwotCQl0aGlzLm5sID0gbmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoU3RyaW5nIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSGFuZGxlcihTdHJpbmcgaW5zdGFsbEhhbmRsZXIpIHsKLQkJdGhpcy5pbnN0YWxsSGFuZGxlciA9IGluc3RhbGxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxIYW5kbGVyTGlicmFyeShTdHJpbmcgaW5zdGFsbEhhbmRsZXJMaWJyYXJ5KSB7Ci0JCXRoaXMuaW5zdGFsbEhhbmRsZXJMaWJyYXJ5ID0gaW5zdGFsbEhhbmRsZXJMaWJyYXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxIYW5kbGVyVVJMKFN0cmluZyBpbnN0YWxsSGFuZGxlclVSTCkgewotCQl0aGlzLmluc3RhbGxIYW5kbGVyVVJMID0gaW5zdGFsbEhhbmRsZXJVUkw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKFN0cmluZyBsaWNlbnNlKSB7Ci0JCWlmICh0aGlzLmxpY2Vuc2UgPT0gbnVsbCkKLQkJCXRoaXMubGljZW5zZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmxpY2Vuc2Uuc2V0QW5ub3RhdGlvbihsaWNlbnNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlVVJMKFN0cmluZyBsaWNlbnNlVVJMKSB7Ci0JCWlmICh0aGlzLmxpY2Vuc2UgPT0gbnVsbCkKLQkJCXRoaXMubGljZW5zZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmxpY2Vuc2Uuc2V0VVJMKGxpY2Vuc2VVUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXJOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwcm92aWRlck5hbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlTGFiZWwoU3RyaW5nIHVwZGF0ZVNpdGVMYWJlbCkgewotCQlpZiAodGhpcy51cGRhdGVTaXRlID09IG51bGwpCi0JCQl0aGlzLnVwZGF0ZVNpdGUgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy51cGRhdGVTaXRlLnNldEFubm90YXRpb24odXBkYXRlU2l0ZUxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlVVJMKFN0cmluZyB1cGRhdGVTaXRlVVJMKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZVNpdGUgPT0gbnVsbCkKLQkJCXRoaXMudXBkYXRlU2l0ZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLnVwZGF0ZVNpdGUuc2V0VVJMKHVwZGF0ZVNpdGVVUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdmFsdWUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRmVhdHVyZSAiICsgaWQgKyAiIHZlcnNpb246ICIgKyB2ZXJzaW9uOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9GZWF0dXJlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjYzY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRW50cnkgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0JcHJpdmF0ZSBTdHJpbmcgbWF0Y2g7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUGx1Z2luOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZXMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdW5wYWNrID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWwgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRlbXBvcmFyeSBmaWVsZCB0byBhZGQgcHJvdmlzaW9uaW5nIGZpbHRlcnMgdG8gZmVhdHVyZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmaWx0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVFbnRyeSBjcmVhdGVSZXF1aXJlcyhTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbWF0Y2gsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gaXNQbHVnaW4pIHsKLQkJRmVhdHVyZUVudHJ5IHJlc3VsdCA9IG5ldyBGZWF0dXJlRW50cnkoaWQsIHZlcnNpb24sIGlzUGx1Z2luKTsKLQkJcmVzdWx0Lm1hdGNoID0gbWF0Y2g7Ci0JCXJlc3VsdC5pc1JlcXVpcmVzID0gdHJ1ZTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJcmVzdWx0LnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgYm9vbGVhbiBpc1BsdWdpbikgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuaXNQbHVnaW4gPSBpc1BsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgRmVhdHVyZUVudHJ5IG90aGVyID0gKEZlYXR1cmVFbnRyeSkgb2JqOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmlkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFpZC5lcXVhbHMob3RoZXIuaWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIudmVyc2lvbiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaCgpIHsKLQkJcmV0dXJuIGFyY2g7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBhZGQgcHJvdmlzaW9uaW5nIGZpbHRlcnMgdG8gZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaCgpIHsKLQkJcmV0dXJuIG1hdGNoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7Ci0JCXJldHVybiBubDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgewotCQlyZXR1cm4gb3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaWQgPT0gbnVsbCkgPyAwIDogaWQuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh2ZXJzaW9uID09IG51bGwpID8gMCA6IHZlcnNpb24uaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luKCkgewotCQlyZXR1cm4gaXNQbHVnaW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlcygpIHsKLQkJcmV0dXJuIGlzUmVxdWlyZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnBhY2soKSB7Ci0JCXJldHVybiB1bnBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoU3RyaW5nIG9zLCBTdHJpbmcgd3MsIFN0cmluZyBhcmNoLCBTdHJpbmcgbmwpIHsKLQkJdGhpcy5vcyA9IG9zOwotCQl0aGlzLndzID0gd3M7Ci0JCXRoaXMuYXJjaCA9IGFyY2g7Ci0JCXRoaXMubmwgPSBubDsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnkgbWV0aG9kIHRvIGFkZCBwcm92aXNpb25pbmcgZmlsdGVycyB0byBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoYm9vbGVhbiB2YWx1ZSkgewotCQlpc0ZyYWdtZW50ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSkgewotCQlvcHRpb25hbCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVucGFjayhib29sZWFuIHZhbHVlKSB7Ci0JCXVucGFjayA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdmFsdWUpIHsKLQkJdXJsID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlyZXN1bHQuYXBwZW5kKGlzUGx1Z2luID8gIlBsdWdpbjogIiA6ICJGZWF0dXJlOiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlc3VsdC5hcHBlbmQoaWQgIT0gbnVsbCA/IGlkLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uICE9IG51bGwgPyAiICIgKyB2ZXJzaW9uLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhOTYxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC5FcXVpbm94Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0b3IgewotCS8qKgotCSAqIENhcHR1cmVzIHRoZSBvdXRwdXQgb2YgYW4gZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmF0b3JSZXN1bHQgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0NVUyA9ICJDT05GSUdVUkFUSU9OX0NVUyI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogVGhlIHNldCBvZiBnZW5lcmF0ZWQgSVVzIHRoYXQgd2lsbCBiZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBJVQotCQkgKi8KLQkJZmluYWwgU2V0IHJvb3RJVXMgPSBuZXcgSGFzaFNldCgpOwotCQkvKioKLQkJICogVGhlIHNldCBvZiBnZW5lcmF0ZWQgSVVzIHRoYXQgd2lsbCBub3QgYmUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgSVUKLQkJICovCi0JCWZpbmFsIFNldCBub25Sb290SVVzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvKioKLQkJICogTWFwIG9mIHN5bWJvbGljIG5hbWUgdG8gYSBzZXQgb2YgZ2VuZXJhdGVkIENVcyBmb3IgdGhhdCBJVQotCQkgKi8KLQkJZmluYWwgTWFwIGNvbmZpZ3VyYXRpb25JVXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8qKgotCQkgKiBNYXAgbGF1bmNoZXJDb25maWcgdG8gY29uZmlnLmluaSBDb25maWdEYXRhCi0JCSAqLwotCQlmaW5hbCBNYXAgY29uZmlnRGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYWxsIElVcyBnZW5lcmF0ZWQgZHVyaW5nIHRoaXMgZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JCSAqLwotCQlTZXQgYWxsR2VuZXJhdGVkSVVzKCkgewotCQkJSGFzaFNldCBhbGwgPSBuZXcgSGFzaFNldCgpOwotCQkJYWxsLmFkZEFsbChyb290SVVzKTsKLQkJCWFsbC5hZGRBbGwobm9uUm9vdElVcyk7Ci0JCQlyZXR1cm4gYWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIElVIGluIHRoaXMgcmVzdWx0IHdpdGggdGhlIGdpdmVuIGlkLgotCQkgKi8KLQkJSUluc3RhbGxhYmxlVW5pdCBnZXRJbnN0YWxsYWJsZVVuaXQoU3RyaW5nIGlkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9vdElVcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCB0bXAgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICh0bXAuZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCQlyZXR1cm4gdG1wOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vblJvb3RJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgdG1wID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAodG1wLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQkJcmV0dXJuIHRtcDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVVBEQVRFX0NPTkZJR1VSQVRPUiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9FUVVJTk9YX0xBVU5DSEVSID0gIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9DT05GSUdfU1VGRklYID0gIi5jb25maWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfSU5JX1NVRkZJWCA9ICIuaW5pIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0xBVUNIRVJfU1VGRklYID0gIi5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIGZpbmFsIElHZW5lcmF0b3JJbmZvIGluZm87Ci0KLQlwcml2YXRlIEdlbmVyYXRvclJlc3VsdCBpbmNyZW1lbnRhbFJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9kdWN0RmlsZSBwcm9kdWN0RmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUm9vdElVID0gdHJ1ZTsKLQotCS8qKgotCSAqIFNob3J0IHRlcm0gZml4IHRvIGVuc3VyZSBJVXMgdGhhdCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXJlIG5vdCBsb3N0LgotCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExNTIxLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZXQgcm9vdENhdGVnb3J5ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgU3RhdGVPYmplY3RGYWN0b3J5IHN0YXRlT2JqZWN0RmFjdG9yeTsKLQotCS8qKgotCSAqIENvbnZlcnQgYSBsaXN0IG9mIHRva2VucyBpbnRvIGFuIGFycmF5LiBUaGUgbGlzdCBzZXBhcmF0b3IgaGFzIHRvIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QXJyYXlGcm9tU3RyaW5nKFN0cmluZyBsaXN0LCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsIHNlcGFyYXRvcik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKCF0b2tlbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFkZCh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZUNvbmZpZ1NwZWMoU3RyaW5nIGNvbmZpZykgewotCQlTdHJpbmdbXSBwYXJzZWQgPSBnZXRBcnJheUZyb21TdHJpbmcoY29uZmlnLCAiXyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXJzZWQubGVuZ3RoID4gMykgewotCQkJU3RyaW5nW10gYWRqdXN0ZWQgPSBuZXcgU3RyaW5nW10ge3BhcnNlZFswXSwgcGFyc2VkWzFdLCBwYXJzZWRbMl0gKyAnXycgKyBwYXJzZWRbM119OwotCQkJcmV0dXJuIGFkanVzdGVkOwotCQl9Ci0JCXJldHVybiBwYXJzZWQ7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRvcihJR2VuZXJhdG9ySW5mbyBpbmZvUHJvdmlkZXIpIHsKLQkJdGhpcy5pbmZvID0gaW5mb1Byb3ZpZGVyOwotCQkvLyBUT0RPIG5lZWQgdG8gZmlndXJlIGEgYmV0dGVyIHdheSBvZiBjb25maWd1cmluZyB0aGUgZ2VuZXJhdG9yLi4uCi0JCVBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgUGxhdGZvcm1BZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocGxhdGZvcm1BZG1pbiAhPSBudWxsKSB7Ci0JCQlzdGF0ZU9iamVjdEZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY3JlbWVudGFsUmVzdWx0KEdlbmVyYXRvclJlc3VsdCByZXN1bHQpIHsKLQkJdGhpcy5pbmNyZW1lbnRhbFJlc3VsdCA9IHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVQcm9kdWN0SVUoR2VuZXJhdG9yUmVzdWx0IHJlc3VsdCkgewotCQlnZW5lcmF0ZVByb2R1Y3RDb25maWdDVXMocmVzdWx0KTsKLQotCQlHZW5lcmF0b3JSZXN1bHQgcHJvZHVjdENvbnRlbnRzID0gbmV3IEdlbmVyYXRvclJlc3VsdCgpOwotCi0JCVByb2R1Y3RRdWVyeSBxdWVyeSA9IG5ldyBQcm9kdWN0UXVlcnkocHJvZHVjdEZpbGUsIGluZm8uZ2V0Rmxhdm9yKCksIHJlc3VsdC5jb25maWd1cmF0aW9uSVVzLCBpbmZvLmdldFZlcnNpb25BZHZpY2UoKSk7Ci0JCUNvbGxlY3RvciBjb2xsZWN0b3IgPSBpbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLnF1ZXJ5KHF1ZXJ5LCBxdWVyeS5nZXRDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0b3IuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJcHJvZHVjdENvbnRlbnRzLnJvb3RJVXMuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQotCQlTdHJpbmcgdmVyc2lvbiA9IHByb2R1Y3RGaWxlLmdldFZlcnNpb24oKTsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKCIwLjAuMCIpICYmIGluZm8uZ2V0Um9vdFZlcnNpb24oKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQl2ZXJzaW9uID0gaW5mby5nZXRSb290VmVyc2lvbigpOwotCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBuZXcgVmVyc2lvblJhbmdlKG5ldyBWZXJzaW9uKHZlcnNpb24pLCB0cnVlLCBuZXcgVmVyc2lvbih2ZXJzaW9uKSwgdHJ1ZSk7Ci0JCUFycmF5TGlzdCByZXF1aXJlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXJlcXVpcmVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGluZm8uZ2V0Rmxhdm9yKCkgKyBwcm9kdWN0RmlsZS5nZXRJZCgpLCBwcm9kdWN0RmlsZS5nZXRJZCgpICsgUFJPRFVDVF9MQVVDSEVSX1NVRkZJWCwgcmFuZ2UsIG51bGwsIGZhbHNlLCB0cnVlKSk7Ci0JCXJlcXVpcmVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGluZm8uZ2V0Rmxhdm9yKCkgKyBwcm9kdWN0RmlsZS5nZXRJZCgpLCBwcm9kdWN0RmlsZS5nZXRJZCgpICsgUFJPRFVDVF9JTklfU1VGRklYLCByYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXJlcXVpcmVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGluZm8uZ2V0Rmxhdm9yKCkgKyBwcm9kdWN0RmlsZS5nZXRJZCgpLCBwcm9kdWN0RmlsZS5nZXRJZCgpICsgUFJPRFVDVF9DT05GSUdfU1VGRklYLCByYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0KLQkJLy9kZWZhdWx0IENVcwkJCi0JCXJlcXVpcmVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLk9TR0lfQlVORExFX0NMQVNTSUZJRVIsIGluZm8uZ2V0Rmxhdm9yKCkpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXJlcXVpcmVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKCJzb3VyY2UiLCBpbmZvLmdldEZsYXZvcigpKSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwcm9kdWN0RmlsZS51c2VGZWF0dXJlcygpKQotCQkJcmVxdWlyZXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIsIGluZm8uZ2V0Rmxhdm9yKCkpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuSU5TVEFMTF9GRUFUVVJFU19GSUxURVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gcm9vdCA9IGNyZWF0ZVRvcExldmVsSVVEZXNjcmlwdGlvbihwcm9kdWN0Q29udGVudHMsIHByb2R1Y3RGaWxlLmdldElkKCksIHZlcnNpb24sIHByb2R1Y3RGaWxlLmdldFByb2R1Y3ROYW1lKCksIHJlcXVpcmVzLCBmYWxzZSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KHJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZVRvcExldmVsSVUoR2VuZXJhdG9yUmVzdWx0IHJlc3VsdCwgU3RyaW5nIGNvbmZpZ3VyYXRpb25JZGVudGlmaWNhdGlvbiwgU3RyaW5nIGNvbmZpZ3VyYXRpb25WZXJzaW9uKSB7Ci0JCS8vIFRPRE8sIGJpdCBvZiBhIGhhY2sgYnV0IGZvciBub3cgc2V0IHRoZSBuYW1lIG9mIHRoZSBJVSB0byB0aGUgSUQuCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIHJvb3QgPSBjcmVhdGVUb3BMZXZlbElVRGVzY3JpcHRpb24ocmVzdWx0LCBjb25maWd1cmF0aW9uSWRlbnRpZmljYXRpb24sIGNvbmZpZ3VyYXRpb25WZXJzaW9uLCBjb25maWd1cmF0aW9uSWRlbnRpZmljYXRpb24sIG51bGwsIHRydWUpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChyb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gY3JlYXRlVG9wTGV2ZWxJVURlc2NyaXB0aW9uKEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIFN0cmluZyBjb25maWd1cmF0aW9uSWRlbnRpZmljYXRpb24sIFN0cmluZyBjb25maWd1cmF0aW9uVmVyc2lvbiwgU3RyaW5nIGNvbmZpZ3VyYXRpb25OYW1lLCBMaXN0IHJlcXVpcmVzLCBib29sZWFuIGNvbmZpZ3VyZUxhdW5jaGVyRGF0YSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiByb290ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlyb290LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJcm9vdC5zZXRJZChjb25maWd1cmF0aW9uSWRlbnRpZmljYXRpb24pOwotCQlyb290LnNldFZlcnNpb24obmV3IFZlcnNpb24oY29uZmlndXJhdGlvblZlcnNpb24pKTsKLQkJcm9vdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgY29uZmlndXJhdGlvbk5hbWUpOwotCi0JCUFycmF5TGlzdCByZXFzQ29uZmlndXJhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdChyZXN1bHQucm9vdElVcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0LnJvb3RJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBuZXcgVmVyc2lvblJhbmdlKGl1LmdldFZlcnNpb24oKSwgdHJ1ZSwgaXUuZ2V0VmVyc2lvbigpLCB0cnVlKTsKLQkJCS8vCQkJYm9vbGVhbiBpc09wdGlvbmFsID0gY2hlY2tPcHRpb25hbFJvb3REZXBlbmRlbmN5KGl1KTsKLQkJCXJlcXNDb25maWd1cmF0aW9uVW5pdHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIHJhbmdlLCBpdS5nZXRGaWx0ZXIoKSwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQkJaWYgKHJlcXVpcmVzICE9IG51bGwpCi0JCQlyZXFzQ29uZmlndXJhdGlvblVuaXRzLmFkZEFsbChyZXF1aXJlcyk7Ci0JCXJvb3Quc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXFzQ29uZmlndXJhdGlvblVuaXRzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXFzQ29uZmlndXJhdGlvblVuaXRzLnNpemUoKV0pKTsKLQkJcm9vdC5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVswXSk7Ci0KLQkJcm9vdC5zZXRQcm9wZXJ0eSgibGluZVVwIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJvb3Quc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihjb25maWd1cmF0aW9uSWRlbnRpZmljYXRpb24sIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQkJcm9vdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9HUk9VUCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQlyb290LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ3VyYXRpb25JZGVudGlmaWNhdGlvbiwgbmV3IFZlcnNpb24oY29uZmlndXJhdGlvblZlcnNpb24pKX0pOwotCQlyb290LnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfT1NHSSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuY29uZmlndXJhdGlvbkRhdGEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IGluZm8uZ2V0Q29uZmlnRGF0YSgpOwotCQlpZiAoY29uZmlnRGF0YSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBkYXRhU3RyaW5ncyA9IGdldENvbmZpZ3VyYXRpb25TdHJpbmdzKGNvbmZpZ0RhdGEpOwotCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gZGF0YVN0cmluZ3NbMF07Ci0JCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9IGRhdGFTdHJpbmdzWzFdOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyZUxhdW5jaGVyRGF0YSkgewotCQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IGluZm8uZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCQlpZiAobGF1bmNoZXJEYXRhICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBkYXRhU3RyaW5ncyA9IGdldExhdW5jaGVyQ29uZmlnU3RyaW5ncyhsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpLCBsYXVuY2hlckRhdGEuZ2V0UHJvZ3JhbUFyZ3MoKSk7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gZGF0YVN0cmluZ3NbMF07Ci0JCQkJdW5jb25maWd1cmF0aW9uRGF0YSArPSBkYXRhU3RyaW5nc1sxXTsKLQkJCX0KLQkJfQotCi0JCXRvdWNocG9pbnREYXRhLnB1dCgiY29uZmlndXJlIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5jb25maWd1cmUiLCB1bmNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlyb290LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25TdHJpbmdzKENvbmZpZ0RhdGEgY29uZmlnRGF0YSkgewotCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5jb25maWd1cmF0aW9uRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25maWdEYXRhLmdldEZ3RGVwZW5kZW50UHJvcHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGFQcm9wZXJ0eSA9IChFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9ICgoU3RyaW5nKSBhUHJvcGVydHkuZ2V0S2V5KCkpOwotCQkJaWYgKGtleS5lcXVhbHMoIm9zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoIikgfHwga2V5LmVxdWFscygib3NnaS5mcmFtZXdvcmsiKSB8fCBrZXkuZXF1YWxzKCJvc2dpLmJ1bmRsZXMiKSB8fCBrZXkuZXF1YWxzKCJlb2YiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCWNvbnRpbnVlOwotCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZToiICsga2V5ICsgIiwgcHJvcFZhbHVlOiIgKyAoKFN0cmluZykgYVByb3BlcnR5LmdldFZhbHVlKCkpICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXVuY29uZmlndXJhdGlvbkRhdGEgKz0gInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZToiICsga2V5ICsgIiwgcHJvcFZhbHVlOik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ0RhdGEuZ2V0RndJbmRlcGVuZGVudFByb3BzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRyeSBhUHJvcGVydHkgPSAoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoKFN0cmluZykgYVByb3BlcnR5LmdldEtleSgpKTsKLQkJCWlmIChrZXkuZXF1YWxzKCJvc2dpLmZyYW1ld29ya0NsYXNzUGF0aCIpIHx8IGtleS5lcXVhbHMoIm9zZ2kuZnJhbWV3b3JrIikgfHwga2V5LmVxdWFscygib3NnaS5idW5kbGVzIikgfHwga2V5LmVxdWFscygiZW9mIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQljb250aW51ZTsKLQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICJzZXRQcm9ncmFtUHJvcGVydHkocHJvcE5hbWU6IiArIGtleSArICIsIHByb3BWYWx1ZToiICsgKChTdHJpbmcpIGFQcm9wZXJ0eS5nZXRWYWx1ZSgpKSArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJzZXRQcm9ncmFtUHJvcGVydHkocHJvcE5hbWU6IiArIGtleSArICIsIHByb3BWYWx1ZTopOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Y29uZmlndXJhdGlvbkRhdGEsIHVuY29uZmlndXJhdGlvbkRhdGF9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0TGF1bmNoZXJDb25maWdTdHJpbmdzKGZpbmFsIFN0cmluZ1tdIGp2bUFyZ3MsIGZpbmFsIFN0cmluZ1tdIHByb2dyYW1BcmdzKSB7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bmNvbmZpZ3VyYXRpb25EYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGp2bUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICJhZGRKdm1BcmcoanZtQXJnOiIgKyBqdm1BcmdzW2ldICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJyZW1vdmVKdm1BcmcoanZtQXJnOiIgKyBqdm1BcmdzW2ldICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2dyYW1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvZ3JhbUFyZyA9IHByb2dyYW1BcmdzW2ldOwotCQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKCItLWxhdW5jaGVyLmxpYnJhcnkiKSB8fCBwcm9ncmFtQXJnLmVxdWFscygiLXN0YXJ0dXAiKSB8fCBwcm9ncmFtQXJnLmVxdWFscygiLWNvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpKys7Ci0JCQljb25maWd1cmF0aW9uRGF0YSArPSAiYWRkUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOiIgKyBwcm9ncmFtQXJnICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJyZW1vdmVQcm9ncmFtQXJnKHByb2dyYW1Bcmc6IiArIHByb2dyYW1BcmcgKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtjb25maWd1cmF0aW9uRGF0YSwgdW5jb25maWd1cmF0aW9uRGF0YX07Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2VuZXJhdGUoKSB7Ci0JCUdlbmVyYXRvclJlc3VsdCByZXN1bHQgPSBpbmNyZW1lbnRhbFJlc3VsdCAhPSBudWxsID8gaW5jcmVtZW50YWxSZXN1bHQgOiBuZXcgR2VuZXJhdG9yUmVzdWx0KCk7Ci0KLQkJaWYgKGluZm8uZ2V0UHJvZHVjdEZpbGUoKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXByb2R1Y3RGaWxlID0gbmV3IFByb2R1Y3RGaWxlKGluZm8uZ2V0UHJvZHVjdEZpbGUoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vVE9ETwotCQkJfQotCQl9Ci0KLQkJRmVhdHVyZVtdIGZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoaW5mby5nZXRGZWF0dXJlc0xvY2F0aW9uKCkpOwotCQlnZW5lcmF0ZUZlYXR1cmVJVXMoZmVhdHVyZXMsIHJlc3VsdCwgaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSk7Ci0KLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVzID0gZ2V0QnVuZGxlRGVzY3JpcHRpb25zKGluZm8uZ2V0QnVuZGxlTG9jYXRpb25zKCkpOwotCQlnZW5lcmF0ZUJ1bmRsZUlVcyhidW5kbGVzLCByZXN1bHQsIGluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkpOwotCi0JCWdlbmVyYXRlTmF0aXZlSVVzKGluZm8uZ2V0RXhlY3V0YWJsZUxvY2F0aW9uKCksIHJlc3VsdCwgaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSk7Ci0KLQkJZ2VuZXJhdGVDb25maWdJVXMocmVzdWx0KTsKLQotCQlpZiAoaW5mby5hZGREZWZhdWx0SVVzKCkpCi0JCQlnZW5lcmF0ZURlZmF1bHRDb25maWdJVShyZXN1bHQucm9vdElVcyk7Ci0KLQkJaWYgKGdlbmVyYXRlUm9vdElVKQotCQkJZ2VuZXJhdGVSb290SVUocmVzdWx0LCBpbmZvLmdldFJvb3RJZCgpLCBpbmZvLmdldFJvb3RWZXJzaW9uKCkpOwotCi0JCS8vCQlwZXJzaXN0ZW5jZS5zZXRNYXBwaW5nUnVsZXMoaW5mby5nZXRNYXBwaW5nUnVsZXMoKSA9PSBudWxsID8gZGVmYXVsdE1hcHBpbmdSdWxlcyA6IGluZm8uZ2V0TWFwcGluZ1J1bGVzKCkpOwotCQkvLwkJaWYgKGluZm8ucHVibGlzaEFydGlmYWN0cygpIHx8IGluZm8ucHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeSgpKSB7Ci0JCS8vCQkJcGVyc2lzdGVuY2Uuc2F2ZUFydGlmYWN0UmVwb3NpdG9yeSgpOwotCQkvLwkJfQotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeSA9IGluZm8uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCWlmIChtZXRhZGF0YVJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJU2V0IGFsbEdlbmVyYXRlZFVuaXRzID0gcmVzdWx0LmFsbEdlbmVyYXRlZElVcygpOwotCQkJbWV0YWRhdGFSZXBvc2l0b3J5LmFkZEluc3RhbGxhYmxlVW5pdHMoKElJbnN0YWxsYWJsZVVuaXRbXSkgYWxsR2VuZXJhdGVkVW5pdHMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFthbGxHZW5lcmF0ZWRVbml0cy5zaXplKCldKSk7Ci0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJ1bmRsZUlVcyhCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMsIEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24pIHsKLQkJLy8gQ29tcHV0aW5nIHRoZSBwYXRoIGZvciBsb2NhbGl6ZWQgcHJvcGVydHkgZmlsZXMgaW4gYSBOTCBmcmFnbWVudCBidW5kbGUKLQkJLy8gcmVxdWlyZXMgdGhlIEJVTkRMRV9MT0NBTElaQVRJT04gcHJvcGVydHkgZnJvbSB0aGUgbWFuaWZlc3Qgb2YgdGhlIGhvc3QgYnVuZGxlLAotCQkvLyBzbyBhIGZpcnN0IHBhc3MgaXMgZG9uZSBvdmVyIGFsbCB0aGUgYnVuZGxlcyB0byBjYWNoZSB0aGlzIHZhbHVlIGFzIHdlbGwgYXMgdGhlIHRhZ3MKLQkJLy8gZnJvbSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBsb2NhbGl6YWJsZSBwcm9wZXJ0aWVzLgotCQlmaW5hbCBpbnQgQ0FDSEVfUEhBU0UgPSAwOwotCQlmaW5hbCBpbnQgR0VORVJBVEVfUEhBU0UgPSAxOwotCQlNYXAgYnVuZGxlTG9jYWxpemF0aW9uTWFwID0gbmV3IEhhc2hNYXAoYnVuZGxlcy5sZW5ndGgpOwotCQlTZXQgbG9jYWxpemF0aW9uSVVzID0gbmV3IEhhc2hTZXQoMzIpOwotCQlmb3IgKGludCBwaGFzZSA9IENBQ0hFX1BIQVNFOyBwaGFzZSA8PSBHRU5FUkFURV9QSEFTRTsgcGhhc2UrKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlRGVzY3JpcHRpb24gYmQgPSBidW5kbGVzW2ldOwotCQkJCS8vIEEgYnVuZGxlIG1heSBiZSBudWxsIGlmIHRoZSBhc3NvY2lhdGVkIHBsdWctaW4gZG9lcyBub3QgaGF2ZSBhIG1hbmlmZXN0IGZpbGUgLQotCQkJCS8vIGZvciBleGFtcGxlLCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLmo5Ci0JCQkJaWYgKGJkICE9IG51bGwgJiYgYmQuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBiZC5nZXRWZXJzaW9uKCkgIT0gbnVsbCkgewotCQkJCQlNYXAgYnVuZGxlTWFuaWZlc3QgPSAoTWFwKSBiZC5nZXRVc2VyT2JqZWN0KCk7Ci0KLQkJCQkJaWYgKHBoYXNlID09IENBQ0hFX1BIQVNFKSB7Ci0JCQkJCQlpZiAoYnVuZGxlTWFuaWZlc3QgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZ1tdIGNhY2hlZFZhbHVlcyA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmdldE1hbmlmZXN0Q2FjaGVkVmFsdWVzKGJ1bmRsZU1hbmlmZXN0KTsKLQkJCQkJCQlidW5kbGVMb2NhbGl6YXRpb25NYXAucHV0KG1ha2VTaW1wbGVLZXkoYmQpLCBjYWNoZWRWYWx1ZXMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIGZvcm1hdCA9IChTdHJpbmcpIChidW5kbGVNYW5pZmVzdCkuZ2V0KEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5CVU5ETEVfRklMRV9LRVkpOwotCQkJCQkJYm9vbGVhbiBpc0RpciA9IChmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuZXF1YWxzKEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5ESVIpID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQkJCQkJSUFydGlmYWN0S2V5IGtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUFydGlmYWN0S2V5KGJkLmdldFN5bWJvbGljTmFtZSgpLCBiZC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFkID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGtleSwgbmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSksIHRydWUsIGZhbHNlKTsKLQkJCQkJCWlmIChpc0RpcikKLQkJCQkJCQlwdWJsaXNoQXJ0aWZhY3QoYWQsIG5ldyBGaWxlKGJkLmdldExvY2F0aW9uKCkpLmxpc3RGaWxlcygpLCBkZXN0aW5hdGlvbiwgZmFsc2UpOwotCQkJCQkJZWxzZQotCQkJCQkJCXB1Ymxpc2hBcnRpZmFjdChhZCwgbmV3IEZpbGVbXSB7bmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSl9LCBkZXN0aW5hdGlvbiwgdHJ1ZSk7Ci0JCQkJCQlpZiAoaW5mby5yZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzKCkgJiYgIWluZm8ucHVibGlzaEFydGlmYWN0cygpKSB7Ci0JCQkJCQkJRmlsZSBwYWNrRmlsZSA9IG5ldyBQYXRoKGJkLmdldExvY2F0aW9uKCkpLmFkZEZpbGVFeHRlbnNpb24oInBhY2suZ3oiKS50b0ZpbGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChwYWNrRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFkMjAwID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlUGFjazIwMEFydGlmYWN0RGVzY3JpcHRvcihrZXksIHBhY2tGaWxlLCBhZC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUpKTsKLQkJCQkJCQkJcHVibGlzaEFydGlmYWN0KGFkMjAwLCBuZXcgRmlsZVtdIHtwYWNrRmlsZX0sIGRlc3RpbmF0aW9uLCB0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCUlJbnN0YWxsYWJsZVVuaXQgYnVuZGxlSVUgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVJVShiZCwgYnVuZGxlTWFuaWZlc3QsIGlzRGlyLCBrZXkpOwotCi0JCQkJCQlpZiAoaXNGcmFnbWVudChiZCkpIHsKLQkJCQkJCQkvLyBUT0RPOiBDYW4gTkwgZnJhZ21lbnRzIGJlIG11bHRpLWhvc3Q/ICBXaGF0IHNwZWNpYWwgaGFuZGxpbmcKLQkJCQkJCQkvLwkJIGlzIHJlcXVpcmVkIGZvciBtdWx0aS1ob3N0IGZyYWdtZW50cyBpbiBnZW5lcmFsPwotCQkJCQkJCVN0cmluZyBob3N0SWQgPSBiZC5nZXRIb3N0KCkuZ2V0TmFtZSgpOwotCQkJCQkJCVN0cmluZyBob3N0S2V5ID0gbWFrZVNpbXBsZUtleShob3N0SWQpOwotCQkJCQkJCVN0cmluZ1tdIGNhY2hlZFZhbHVlcyA9IChTdHJpbmdbXSkgYnVuZGxlTG9jYWxpemF0aW9uTWFwLmdldChob3N0S2V5KTsKLQotCQkJCQkJCWlmIChjYWNoZWRWYWx1ZXMgIT0gbnVsbCkgewotCQkJCQkJCQlNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVIb3N0TG9jYWxpemF0aW9uRnJhZ21lbnQoYnVuZGxlSVUsIGJkLCBob3N0SWQsIGNhY2hlZFZhbHVlcywgbG9jYWxpemF0aW9uSVVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJlc3VsdC5yb290SVVzLmFkZChidW5kbGVJVSk7Ci0JCQkJCQlyZXN1bHQubm9uUm9vdElVcy5hZGRBbGwobG9jYWxpemF0aW9uSVVzKTsKLQkJCQkJCWxvY2FsaXphdGlvbklVcy5jbGVhcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZyYWdtZW50KEJ1bmRsZURlc2NyaXB0aW9uIGJkKSB7Ci0JCXJldHVybiAoYmQuZ2V0SG9zdCgpICE9IG51bGwgPyB0cnVlIDogZmFsc2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU2ltcGxlS2V5KEJ1bmRsZURlc2NyaXB0aW9uIGJkKSB7Ci0JCS8vIFRPRE86IGNhbid0IHVzZSB0aGUgYnVuZGxlIHZlcnNpb24gaW4gdGhlIGtleSBmb3IgdGhlIEJ1bmRsZUxvY2FsaXphdGlvbgotCQkvLwkJIHByb3BlcnR5IG1hcCBzaW5jZSB0aGUgaG9zdCBzcGVjaWZpY2F0aW9uIGZvciBhIGZyYWdtZW50IGhhcyBhCi0JCS8vCQkgdmVyc2lvbiByYW5nZSwgbm90IGEgdmVyc2lvbi4gSGVuY2UsIHRoaXMgbWVjaGFuaXNtIGZvciBmaW5kaW5nCi0JCS8vIAkJIG1hbmlmZXN0IGxvY2FsaXphdGlvbiBwcm9wZXJ0eSBmaWxlcyBtYXkgYnJlYWsgdW5kZXIgY2hhbmdlcwotCQkvLwkJIHRvIHRoZSBCdW5kbGVMb2NhbGl6YXRpb24gcHJvcGVydHkgb2YgYSBidW5kbGUuCi0JCXJldHVybiBtYWtlU2ltcGxlS2V5KGJkLmdldFN5bWJvbGljTmFtZSgpIC8qLCBiZC5nZXRWZXJzaW9uKCkgKi8pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU2ltcGxlS2V5KFN0cmluZyBpZCAvKiwgVmVyc2lvbiB2ZXJzaW9uICovKSB7Ci0JCXJldHVybiBpZDsgLy8gKyAnXycgKyB2ZXJzaW9uLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIElVcyBjb3JyZXNwb25kaW5nIHRvIHVwZGF0ZSBzaXRlIGNhdGVnb3JpZXMuCi0JICogQHBhcmFtIGNhdGVnb3JpZXNUb0ZlYXR1cmVzIE1hcCBvZiBTaXRlQ2F0ZWdvcnkgLT5TZXQgKEZlYXR1cmUgSVVzIGluIHRoYXQgY2F0ZWdvcnkpLgotCSAqIEBwYXJhbSByZXN1bHQgVGhlIGdlbmVyYXRvciByZXN1bHQgYmVpbmcgYnVpbHQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNhdGVnb3J5SVVzKE1hcCBjYXRlZ29yaWVzVG9GZWF0dXJlcywgR2VuZXJhdG9yUmVzdWx0IHJlc3VsdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcmllc1RvRmVhdHVyZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJcmVzdWx0Lm5vblJvb3RJVXMuYWRkKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUNhdGVnb3J5SVUoY2F0ZWdvcnksIChTZXQpIGNhdGVnb3JpZXNUb0ZlYXR1cmVzLmdldChjYXRlZ29yeSksIG51bGwpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZUNvbmZpZ0RhdGEoR2VuZXJhdG9yUmVzdWx0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0LmNvbmZpZ0RhdGEuY29udGFpbnNLZXkoaW5mby5nZXRMYXVuY2hlckNvbmZpZygpKSkKLQkJCXJldHVybjsgLy9iZWVuIGhlcmUsIGRvbmUgdGhpcwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBpbmZvLmdldExhdW5jaGVyRGF0YSgpOwotCQlpZiAobGF1bmNoZXJEYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRmlsZSBmd0NvbmZpZ0ZpbGUgPSBuZXcgRmlsZShsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpLCBFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpOwotCQlpZiAoZndDb25maWdGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKSB7Ci0JCQkJKChFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcikgaW5mbykubG9hZENvbmZpZ0RhdGEoZndDb25maWdGaWxlKTsKLQkJCQlDb25maWdEYXRhIGRhdGEgPSBpbmZvLmdldENvbmZpZ0RhdGEoKTsKLQkJCQlyZXN1bHQuY29uZmlnRGF0YS5wdXQoaW5mby5nZXRMYXVuY2hlckNvbmZpZygpLCBkYXRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBHZW5lcmF0b3JCdW5kbGVJbmZvIGNyZWF0ZUdlbmVyYXRvckJ1bmRsZUluZm8oQnVuZGxlSW5mbyBidW5kbGVJbmZvLCBHZW5lcmF0b3JSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmIChidW5kbGVJbmZvLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKLQotCQlTdHJpbmcgbmFtZSA9IGJ1bmRsZUluZm8uZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkJLy9lYXN5IGNhc2U6IGRvIHdlIGhhdmUgYSBtYXRjaGluZyBJVT8KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IHJlc3VsdC5nZXRJbnN0YWxsYWJsZVVuaXQobmFtZSk7Ci0JCWlmIChpdSAhPSBudWxsKSB7Ci0JCQlidW5kbGVJbmZvLnNldFZlcnNpb24oaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKGJ1bmRsZUluZm8pOwotCQl9Ci0KLQkJLy9oYXJkZXI6IHRyeSBpZF92ZXJzaW9uCi0JCWludCBpID0gbmFtZS5pbmRleE9mKCdfJyk7Ci0JCXdoaWxlIChpID4gLTEpIHsKLQkJCVZlcnNpb24gdmVyc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbihuYW1lLnN1YnN0cmluZyhpKSk7Ci0JCQkJYnVuZGxlSW5mby5zZXRTeW1ib2xpY05hbWUobmFtZS5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWJ1bmRsZUluZm8uc2V0VmVyc2lvbih2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdGhlICdfJyBmb3VuZCB3YXMgcHJvYmFibHkgcGFydCBvZiB0aGUgc3ltYm9saWMgaWQKLQkJCQlpID0gbmFtZS5pbmRleE9mKCdfJywgaSk7Ci0JCQl9Ci0JCX0KLQotCQkvL1F1ZXJ5IHRoZSByZXBvCi0JCVF1ZXJ5IHF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KG5hbWUpOwotCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQlJdGVyYXRvciBtYXRjaGVzID0gaW5mby5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoKS5xdWVyeShxdWVyeSwgY29sbGVjdG9yLCBudWxsKS5pdGVyYXRvcigpOwotCQkvL3BpY2sgdGhlIG5ld2VzdCBtYXRjaAotCQlJSW5zdGFsbGFibGVVbml0IG5ld2VzdCA9IG51bGw7Ci0JCXdoaWxlIChtYXRjaGVzLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgbWF0Y2hlcy5uZXh0KCk7Ci0JCQlpZiAobmV3ZXN0ID09IG51bGwgfHwgKG5ld2VzdC5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkpIDwgMCkpCi0JCQkJbmV3ZXN0ID0gY2FuZGlkYXRlOwotCQl9Ci0JCWlmIChuZXdlc3QgIT0gbnVsbCkgewotCQkJYnVuZGxlSW5mby5zZXRWZXJzaW9uKG5ld2VzdC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJ1bmRsZUNvbmZpZ0lVcyhCdW5kbGVJbmZvW10gaW5mb3MsIEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIFN0cmluZyBsYXVuY2hlckNvbmZpZykgewotCQlpZiAoaW5mb3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgY3VJZFByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmaWx0ZXIgPSBudWxsOwotCQlpZiAobGF1bmNoZXJDb25maWcgIT0gbnVsbCkgewotCQkJLy9sYXVuY2hlciBjb25maWcgaXMgb3Nfd3NfYXJjaCwgd2Ugd2FudCBzdWZmaXggd3Mub3MuYXJjaAotCQkJU3RyaW5nW10gY29uZmlnID0gcGFyc2VDb25maWdTcGVjKGxhdW5jaGVyQ29uZmlnKTsKLQkJCWN1SWRQcmVmaXggPSBjb25maWdbMV0gKyAnLicgKyBjb25maWdbMF0gKyAnLicgKyBjb25maWdbMl07Ci0KLQkJCWZpbHRlciA9ICIoJiAob3NnaS53cz0iICsgY29uZmlnWzFdICsgIikgKG9zZ2kub3M9IiArIGNvbmZpZ1swXSArICIpIChvc2dpLmFyY2g9IiArIGNvbmZpZ1syXSArICIpKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCi0JCUxpc3QgYWxsQ1VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlHZW5lcmF0b3JCdW5kbGVJbmZvIGJ1bmRsZSA9IGNyZWF0ZUdlbmVyYXRvckJ1bmRsZUluZm8oaW5mb3NbaV0sIHJlc3VsdCk7Ci0JCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IpKSB7Ci0JCQkJYnVuZGxlLnNldFN0YXJ0TGV2ZWwoQnVuZGxlSW5mby5OT19MRVZFTCk7Ci0JCQkJYnVuZGxlLnNldE1hcmtlZEFzU3RhcnRlZChmYWxzZSk7Ci0JCQkJYnVuZGxlLnNldFNwZWNpYWxDb25maWdDb21tYW5kcygic2V0UHJvZ3JhbVByb3BlcnR5KHByb3BOYW1lOm9yZy5lY2xpcHNlLnVwZGF0ZS5yZWNvbmNpbGUsIHByb3BWYWx1ZTpmYWxzZSk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidW5kbGUuc2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZTpvcmcuZWNsaXBzZS51cGRhdGUucmVjb25jaWxlLCBwcm9wVmFsdWU6KTsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChidW5kbGUuZ2V0U3RhcnRMZXZlbCgpID09IEJ1bmRsZUluZm8uTk9fTEVWRUwgJiYgIWJ1bmRsZS5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQkJLy8gdGhpcyBidW5kbGUgZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFydGljdWxhciBjb25maWd1cmF0aW9uLCB0aGUgcGx1Zy1pbiBkZWZhdWx0IElVIHdpbGwgaGFuZGxlIGluc3RhbGxpbmcgaXQKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSUluc3RhbGxhYmxlVW5pdCBjdSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUNvbmZpZ3VyYXRpb25Vbml0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgbmV3IFZlcnNpb24oYnVuZGxlLmdldFZlcnNpb24oKSksIGZhbHNlLCBidW5kbGUsIGluZm8uZ2V0Rmxhdm9yKCkgKyBjdUlkUHJlZml4LCBmaWx0ZXIpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQlhbGxDVXMuYWRkKGN1KTsKLQkJCQlyZXN1bHQucm9vdElVcy5hZGQoY3UpOwotCQkJCVN0cmluZyBrZXkgPSAocHJvZHVjdEZpbGUgIT0gbnVsbCAmJiBwcm9kdWN0RmlsZS51c2VGZWF0dXJlcygpKSA/IEdlbmVyYXRvclJlc3VsdC5DT05GSUdVUkFUSU9OX0NVUyA6IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQlpZiAocmVzdWx0LmNvbmZpZ3VyYXRpb25JVXMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJCQkoKFNldCkgcmVzdWx0LmNvbmZpZ3VyYXRpb25JVXMuZ2V0KGtleSkpLmFkZChjdSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCXNldC5hZGQoY3UpOwotCQkJCQlyZXN1bHQuY29uZmlndXJhdGlvbklVcy5wdXQoa2V5LCBzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeSA9IGluZm8uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCWlmIChtZXRhZGF0YVJlcG9zaXRvcnkgIT0gbnVsbCAmJiAhYWxsQ1VzLmlzRW1wdHkoKSkgewotCQkJLy8gUHJvZHVjdCBRdWVyeSB3aWxsIHJ1biBhZ2FpbnN0IHRoZSByZXBvIGxhdGVyIGluIGNyZWF0ZVByb2R1Y3RJVSwgbWFrZSBzdXJlIHRoZXNlIENVcyBhcmUgaW4gYmVmb3JlIHRoZW4KLQkJCW1ldGFkYXRhUmVwb3NpdG9yeS5hZGRJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIGFsbENVcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2FsbENVcy5zaXplKCldKSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ29uZmlnSVVzKEdlbmVyYXRvclJlc3VsdCByZXN1bHQpIHsKLQkJQ29uZmlnRGF0YSBkYXRhID0gaW5mby5nZXRDb25maWdEYXRhKCk7Ci0JCWlmICgoZGF0YSA9PSBudWxsIHx8IGRhdGEuZ2V0QnVuZGxlcygpLmxlbmd0aCA9PSAwKSAmJiBpbmZvLmdldExhdW5jaGVyQ29uZmlnKCkgIT0gbnVsbCkgewotCQkJLy9XZSBoYXZlIHRoZSBjb25maWcuaW5pIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWxsIHRoZSBuZWVkZWQgYnVuZGxlIElVcywgcmVtZW1iZXIgZm9yIGxhdGVyCi0JCQlzdG9yZUNvbmZpZ0RhdGEocmVzdWx0KTsKLQkJfSBlbHNlIGlmIChkYXRhICE9IG51bGwpIHsKLQkJCS8vIGdlbmVyYXRpb24gYWdhaW5zdCBhbiBlY2xpcHNlIGluc3RhbGwgKGNvbmZpZy5pbmkgKyBidW5kbGVzKQotCQkJZ2VuZXJhdGVCdW5kbGVDb25maWdJVXMoZGF0YS5nZXRCdW5kbGVzKCksIHJlc3VsdCwgaW5mby5nZXRMYXVuY2hlckNvbmZpZygpKTsKLQkJfSBlbHNlIGlmIChyZXN1bHQuY29uZmlnRGF0YS5zaXplKCkgPiAwICYmIGdlbmVyYXRlUm9vdElVKSB7Ci0JCQkvLyBnZW5lcmF0aW9uIGZyb20gcmVtZW1iZXJlZCBjb25maWcuaW5pJ3MKLQkJCS8vIHdlIGhhdmUgTiBwbGF0Zm9ybXMsIGdlbmVyYXRlIGEgQ1UgZm9yIGVhY2gKLQkJCS8vIFRPRE8gdHJ5IGFuZCBmaW5kIGNvbW1vbiBwcm9wZXJ0aWVzIGFjcm9zcyBwbGF0Zm9ybXMKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHQuY29uZmlnRGF0YS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGxhdW5jaGVyQ29uZmlnID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWRhdGEgPSAoQ29uZmlnRGF0YSkgcmVzdWx0LmNvbmZpZ0RhdGEuZ2V0KGxhdW5jaGVyQ29uZmlnKTsKLQkJCQlnZW5lcmF0ZUJ1bmRsZUNvbmZpZ0lVcyhkYXRhLmdldEJ1bmRsZXMoKSwgcmVzdWx0LCBsYXVuY2hlckNvbmZpZyk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGJ1bmRsZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoaW5mby5hZGREZWZhdWx0SVVzKCkpCi0JCQlidW5kbGVJbmZvTGlzdC5hZGRBbGwoaW5mby5nZXREZWZhdWx0SVVzKHJlc3VsdC5yb290SVVzKSk7Ci0KLQkJYnVuZGxlSW5mb0xpc3QuYWRkQWxsKGluZm8uZ2V0T3RoZXJJVXMoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJ1bmRsZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUdlbmVyYXRvckJ1bmRsZUluZm8gYnVuZGxlID0gKEdlbmVyYXRvckJ1bmRsZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY29uZmlndXJlZElVID0gcmVzdWx0LmdldEluc3RhbGxhYmxlVW5pdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJaWYgKGNvbmZpZ3VyZWRJVSA9PSBudWxsKSB7Ci0JCQkJaWYgKCFnZW5lcmF0ZVJvb3RJVSkKLQkJCQkJY29udGludWU7Ci0JCQkJUXVlcnkgcXVlcnkgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5ID0gaW5mby5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoKTsKLQkJCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUl0ZXJhdG9yIG1hdGNoZXMgPSBtZXRhZGF0YVJlcG9zaXRvcnkucXVlcnkocXVlcnksIGNvbGxlY3RvciwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJCQkvL3BpY2sgdGhlIG5ld2VzdCBtYXRjaAotCQkJCUlJbnN0YWxsYWJsZVVuaXQgbmV3ZXN0ID0gbnVsbDsKLQkJCQl3aGlsZSAobWF0Y2hlcy5oYXNOZXh0KCkpIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgbWF0Y2hlcy5uZXh0KCk7Ci0JCQkJCWlmIChuZXdlc3QgPT0gbnVsbCB8fCAobmV3ZXN0LmdldFZlcnNpb24oKS5jb21wYXJlVG8oY2FuZGlkYXRlLmdldFZlcnNpb24oKSkgPCAwKSkKLQkJCQkJCW5ld2VzdCA9IGNhbmRpZGF0ZTsKLQkJCQl9Ci0JCQkJaWYgKG5ld2VzdCAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ3VyZWRJVSA9IG5ld2VzdDsKLQkJCQl9IGVsc2UgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlidW5kbGUuc2V0VmVyc2lvbihjb25maWd1cmVkSVUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQkJU3RyaW5nIGZpbHRlciA9IGNvbmZpZ3VyZWRJVSA9PSBudWxsID8gbnVsbCA6IGNvbmZpZ3VyZWRJVS5nZXRGaWx0ZXIoKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY3UgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVDb25maWd1cmF0aW9uVW5pdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIG5ldyBWZXJzaW9uKGJ1bmRsZS5nZXRWZXJzaW9uKCkpLCBmYWxzZSwgYnVuZGxlLCBpbmZvLmdldEZsYXZvcigpLCBmaWx0ZXIpOwotCQkJLy90aGUgY29uZmlndXJhdGlvbiB1bml0IHNob3VsZCBzaGFyZSB0aGUgc2FtZSBwbGF0Zm9ybSBmaWx0ZXIgYXMgdGhlIElVIGJlaW5nIGNvbmZpZ3VyZWQuCi0JCQlpZiAoY3UgIT0gbnVsbCkKLQkJCQlyZXN1bHQucm9vdElVcy5hZGQoY3UpOwotCQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCQlpZiAocHJvZHVjdEZpbGUgIT0gbnVsbCAmJiBwcm9kdWN0RmlsZS51c2VGZWF0dXJlcygpKQotCQkJCWtleSA9IEdlbmVyYXRvclJlc3VsdC5DT05GSUdVUkFUSU9OX0NVUzsKLQkJCWVsc2UgaWYgKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5zdGFydHNXaXRoKE9SR19FQ0xJUFNFX0VRVUlOT1hfTEFVTkNIRVIgKyAnLicpKQotCQkJCWtleSA9IE9SR19FQ0xJUFNFX0VRVUlOT1hfTEFVTkNIRVI7Ci0JCQllbHNlCi0JCQkJa2V5ID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQkJaWYgKHJlc3VsdC5jb25maWd1cmF0aW9uSVVzLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCQkoKFNldCkgcmVzdWx0LmNvbmZpZ3VyYXRpb25JVXMuZ2V0KGtleSkpLmFkZChjdSk7Ci0JCQl9IGVsc2UgewotCQkJCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCXNldC5hZGQoY3UpOwotCQkJCXJlc3VsdC5jb25maWd1cmF0aW9uSVVzLnB1dChrZXksIHNldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG9ydCB0ZXJtIGZpeCB0byBlbnN1cmUgSVVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nIGNhdGVnb3J5IGFyZSBub3QgbG9zdC4KLQkgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTUyMS4KLQkgKi8KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZ2VuZXJhdGVEZWZhdWx0Q2F0ZWdvcnkoSUluc3RhbGxhYmxlVW5pdCByb290SVUpIHsKLQkJcm9vdENhdGVnb3J5LmFkZChyb290SVUpOwotCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGNhdCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJY2F0LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGNhdGVnb3J5SWQgPSByb290SVUuZ2V0SWQoKSArICIuY2F0ZWdvcnlJVSI7IC8vJE5PTi1OTFMtMSQKLQkJY2F0LnNldElkKGNhdGVnb3J5SWQpOwotCQljYXQuc2V0VmVyc2lvbihWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JCWNhdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgcm9vdElVLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FKSk7Ci0JCWNhdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04sIHJvb3RJVS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04pKTsKLQotCQlBcnJheUxpc3QgcmVxdWlyZWQgPSBuZXcgQXJyYXlMaXN0KHJvb3RDYXRlZ29yeS5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9vdENhdGVnb3J5Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJcmVxdWlyZWQuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBpdS5nZXRGaWx0ZXIoKSwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQkJY2F0LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVxdWlyZWQudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXVpcmVkLnNpemUoKV0pKTsKLQkJY2F0LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGNhdGVnb3J5SWQsIFZlcnNpb24uZW1wdHlWZXJzaW9uKX0pOwotCQljYXQuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbMF0pOwotCQljYXQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfQ0FURUdPUlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY2F0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVEZWZhdWx0Q29uZmlnSVUoU2V0IGl1cykgewotCQkvLwkJVE9ETyB0aGlzIGlzIGEgYml0IG9mIGEgaGFjay4gIFdlIG5lZWQgdG8gaGF2ZSB0aGUgZGVmYXVsdCBJVSBmcmFnbWVudCBnZW5lcmF0ZWQgd2l0aCBjb2RlIHRoYXQgY29uZmlndXJlcwotCQkvLwkJYW5kIHVuY29uZmlndXJlcy4gIFRoZSBHZW5lcmF0b3Igc2hvdWxkIGJlIGRlY291cGxlZCBmcm9tIGFueSBwYXJ0aWN1bGFyIHByb3ZpZGVyIGJ1dCBpdCBpcyBub3QgY2xlYXIKLQkJLy8JCXRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgY3JlYXRlKiBtZXRob2RzIHRvIElHZW5lcmF0b3JJbmZvLi4uCi0JCS8vCQlNb2NrQnVuZGxlRGVzY3JpcHRpb24gYmQxID0gbmV3IE1vY2tCdW5kbGVEZXNjcmlwdGlvbigiZGVmYXVsdENvbmZpZ3VyZSIpOwotCQkvLwkJTW9ja0J1bmRsZURlc2NyaXB0aW9uIGJkMiA9IG5ldyBNb2NrQnVuZGxlRGVzY3JpcHRpb24oImRlZmF1bHRVbmNvbmZpZ3VyZSIpOwotCQlFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlciA9IChFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcikgaW5mbzsKLQkJaXVzLmFkZChNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlndXJhdGlvblVuaXQocHJvdmlkZXIuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25CdW5kbGVJbmZvKCksIHByb3ZpZGVyLmNyZWF0ZURlZmF1bHRVbmNvbmZpZ3VyYXRpb25CdW5kbGVJbmZvKCksIGluZm8uZ2V0Rmxhdm9yKCkpKTsKLQkJaXVzLmFkZChNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0RmVhdHVyZUNvbmZpZ3VyYXRpb25Vbml0KGluZm8uZ2V0Rmxhdm9yKCkpKTsKLQkJaXVzLmFkZChNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvblVuaXRGb3JTb3VyY2VCdW5kbGVzKGluZm8uZ2V0Rmxhdm9yKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgSVVzIGZvciB0aGUgbGF1bmNoZXJzIGZvdW5kIGluIHRoZSBvcmcuZWNsaXBzZS5leGVjdXRhYmxlIGZlYXR1cmUsIGlmIHByZXNlbnQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZXhlY3V0YWJsZSBmZWF0dXJlIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUV4ZWN1dGFibGVGZWF0dXJlSVVzKEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24pIHsKLQkJRmlsZSBwYXJlbnREaXIgPSBpbmZvLmdldEZlYXR1cmVzTG9jYXRpb24oKTsKLQkJaWYgKHBhcmVudERpciA9PSBudWxsIHx8ICFwYXJlbnREaXIuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUZpbGVbXSBmZWF0dXJlRGlycyA9IHBhcmVudERpci5saXN0RmlsZXMoKTsKLQkJaWYgKGZlYXR1cmVEaXJzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUZpbGUgZXhlY3V0YWJsZUZlYXR1cmVEaXIgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgZmVhdHVyZVByZWZpeCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGVfIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVEaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZURpcnNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoZmVhdHVyZVByZWZpeCkpIHsKLQkJCQlleGVjdXRhYmxlRmVhdHVyZURpciA9IGZlYXR1cmVEaXJzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChleGVjdXRhYmxlRmVhdHVyZURpciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlGaWxlIGJpbkRpciA9IG5ldyBGaWxlKGV4ZWN1dGFibGVGZWF0dXJlRGlyLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFiaW5EaXIuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vdGhlIGJpbiBkaXJlY3RvcnkgaXMgZGl2aWRpbmcgaW50byBhIGRpcmVjdG9yeSB0cmVlIG9mIHRoZSBmb3JtIC9iaW4vd3Mvb3MvYXJjaAotCQlGaWxlW10gd3NEaXJzID0gYmluRGlyLmxpc3RGaWxlcygpOwotCQlpZiAod3NEaXJzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gZXhlY3V0YWJsZUZlYXR1cmVEaXIuZ2V0TmFtZSgpLnN1YnN0cmluZyhmZWF0dXJlUHJlZml4Lmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgd3NJbmRleCA9IDA7IHdzSW5kZXggPCB3c0RpcnMubGVuZ3RoOyB3c0luZGV4KyspIHsKLQkJCVN0cmluZyB3cyA9IHdzRGlyc1t3c0luZGV4XS5nZXROYW1lKCk7Ci0JCQlGaWxlW10gb3NEaXJzID0gd3NEaXJzW3dzSW5kZXhdLmxpc3RGaWxlcygpOwotCQkJaWYgKG9zRGlycyA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChpbnQgb3NJbmRleCA9IDA7IG9zSW5kZXggPCBvc0RpcnMubGVuZ3RoOyBvc0luZGV4KyspIHsKLQkJCQlTdHJpbmcgb3MgPSBvc0RpcnNbb3NJbmRleF0uZ2V0TmFtZSgpOwotCQkJCUZpbGVbXSBhcmNoRGlycyA9IG9zRGlyc1tvc0luZGV4XS5saXN0RmlsZXMoKTsKLQkJCQlpZiAoYXJjaERpcnMgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZm9yIChpbnQgYXJjaEluZGV4ID0gMDsgYXJjaEluZGV4IDwgYXJjaERpcnMubGVuZ3RoOyBhcmNoSW5kZXgrKykgewotCQkJCQlTdHJpbmcgYXJjaCA9IGFyY2hEaXJzW2FyY2hJbmRleF0uZ2V0TmFtZSgpOwotCQkJCQlnZW5lcmF0ZUV4ZWN1dGFibGVJVXMod3MsIG9zLCBhcmNoLCB2ZXJzaW9uU3RyaW5nLCBhcmNoRGlyc1thcmNoSW5kZXhdLCByZXN1bHQsIGRlc3RpbmF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIElVcyBhbmQgQ1VzIGZvciB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBsYXVuY2hlciBmb3IgYSBnaXZlbgotCSAqIHdzL29zL2FyY2ggY29tYmluYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRXhlY3V0YWJsZUlVcyhTdHJpbmcgd3MsIFN0cmluZyBvcywgZmluYWwgU3RyaW5nIGFyY2gsIFN0cmluZyB2ZXJzaW9uLCBGaWxlIHJvb3QsIEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24pIHsKLQkJLy9DcmVhdGUgdGhlIElVCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCVN0cmluZyBwcm9kdWN0TmFtZXNwYWNlID0gKHByb2R1Y3RGaWxlICE9IG51bGwpID8gcHJvZHVjdEZpbGUuZ2V0SWQoKSA6ICJvcmcuZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhdW5jaGVySWRQcmVmaXggPSBwcm9kdWN0TmFtZXNwYWNlICsgUFJPRFVDVF9MQVVDSEVSX1NVRkZJWDsKLQkJU3RyaW5nIGxhdW5jaGVySWQgPSBsYXVuY2hlcklkUHJlZml4ICsgJy4nICsgd3MgKyAnLicgKyBvcyArICcuJyArIGFyY2g7Ci0JCWl1LnNldElkKGxhdW5jaGVySWQpOwotCQlWZXJzaW9uIGxhdW5jaGVyVmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRWZXJzaW9uKGxhdW5jaGVyVmVyc2lvbik7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGZpbHRlciA9ICIoJiAob3NnaS53cz0iICsgd3MgKyAiKSAob3NnaS5vcz0iICsgb3MgKyAiKSAob3NnaS5hcmNoPSIgKyBhcmNoICsgIikpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlpdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQotCQlJQXJ0aWZhY3RLZXkga2V5ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlTGF1bmNoZXJBcnRpZmFjdEtleShsYXVuY2hlcklkLCBsYXVuY2hlclZlcnNpb24pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlQcm92aWRlZENhcGFiaWxpdHkgbGF1bmNoZXJDYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShpbmZvLmdldEZsYXZvcigpICsgcHJvZHVjdE5hbWVzcGFjZSwgbGF1bmNoZXJJZFByZWZpeCwgbGF1bmNoZXJWZXJzaW9uKTsKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkobGF1bmNoZXJJZCwgbGF1bmNoZXJWZXJzaW9uKSwgbGF1bmNoZXJDYXBhYmlsaXR5fSk7Ci0KLQkJU3RyaW5nIGxhdW5jaGVyRnJhZ21lbnQgPSBPUkdfRUNMSVBTRV9FUVVJTk9YX0xBVU5DSEVSICsgJy4nICsgd3MgKyAnLicgKyBvczsKLQkJaWYgKCFDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpCi0JCQlsYXVuY2hlckZyYWdtZW50ICs9ICcuJyArIGFyY2g7Ci0JCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbGF1bmNoZXJGcmFnbWVudCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIGZpbHRlciwgZmFsc2UsIGZhbHNlKX0pOwotCQlyZXN1bHQucm9vdElVcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSkpOwotCi0JCS8vQ3JlYXRlIHRoZSBDVQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGluZm8uZ2V0Rmxhdm9yKCkgKyBsYXVuY2hlcklkOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQljdS5zZXRWZXJzaW9uKGxhdW5jaGVyVmVyc2lvbik7Ci0JCWN1LnNldEZpbHRlcihmaWx0ZXIpOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbGF1bmNoZXJJZCwgbmV3IFZlcnNpb25SYW5nZShsYXVuY2hlclZlcnNpb24sIHRydWUsIGxhdW5jaGVyVmVyc2lvbiwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJLy9UT0RPIGJ1ZyAyMTg4OTAsIHdvdWxkIGxpa2UgdGhlIGZyYWdtZW50IHRvIHByb3ZpZGUgdGhlIGxhdW5jaGVyIGNhcGFiaWxpdHkgYXMgd2VsbCwgYnV0IGNhbid0IHJpZ2h0IG5vdy4KLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBsYXVuY2hlclZlcnNpb24pfSk7Ci0KLQkJbXVuZ2VMYXVuY2hlckZpbGVOYW1lcyhyb290KTsKLQotCQljdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX05BVElWRSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoQ29uc3RhbnRzLk9TX01BQ09TWC5lcXVhbHMob3MpKSB7Ci0JCQlGaWxlW10gYXBwRm9sZGVycyA9IHJvb3QubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCQkJCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxlbmd0aCgpIC0gNCwgbmFtZS5sZW5ndGgoKSkuZXF1YWxzSWdub3JlQ2FzZSgiLmFwcCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSk7Ci0JCQlmb3IgKGludCBpID0gMDsgYXBwRm9sZGVycyAhPSBudWxsICYmIGkgPCBhcHBGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBtYWNPU0ZvbGRlciA9IG5ldyBGaWxlKGFwcEZvbGRlcnNbaV0sICJDb250ZW50cy9NYWNPUyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG1hY09TRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCUZpbGVbXSBsYXVuY2hlckZpbGVzID0gbWFjT1NGb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGF1bmNoZXJGaWxlcy5sZW5ndGg7IGorKykgewotCQkJCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfS8iICsgYXBwRm9sZGVyc1tpXS5nZXROYW1lKCkgKyAiL0NvbnRlbnRzL01hY09TLywgdGFyZ2V0RmlsZToiICsgbGF1bmNoZXJGaWxlc1tqXS5nZXROYW1lKCkgKyAiLCBwZXJtaXNzaW9uczo3NTUpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlpZiAobmV3IFBhdGgobGF1bmNoZXJGaWxlc1tqXS5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJCQkJCU1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmdlbmVyYXRlTGF1bmNoZXJTZXR0ZXIobGF1bmNoZXJGaWxlc1tqXS5nZXROYW1lKCksIGxhdW5jaGVySWQsIGxhdW5jaGVyVmVyc2lvbiwgb3MsIHdzLCBhcmNoLCByZXN1bHQucm9vdElVcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFDb25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKG9zKSAmJiAhQ29uc3RhbnRzLk9TX01BQ09TWC5lcXVhbHMob3MpKSB7Ci0JCQlGaWxlW10gbGF1bmNoZXJGaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxhdW5jaGVyRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljb25maWd1cmF0aW9uRGF0YSArPSAiIGNobW9kKHRhcmdldERpcjoke2luc3RhbGxGb2xkZXJ9LCB0YXJnZXRGaWxlOiIgKyBsYXVuY2hlckZpbGVzW2ldLmdldE5hbWUoKSArICIsIHBlcm1pc3Npb25zOjc1NSk7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKG5ldyBQYXRoKGxhdW5jaGVyRmlsZXNbaV0uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQkJTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2VuZXJhdGVMYXVuY2hlclNldHRlcihsYXVuY2hlckZpbGVzW2ldLmdldE5hbWUoKSwgbGF1bmNoZXJJZCwgbGF1bmNoZXJWZXJzaW9uLCBvcywgd3MsIGFyY2gsIHJlc3VsdC5yb290SVVzKTsKLQkJCX0KLQkJfQotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlJSW5zdGFsbGFibGVVbml0IHVuaXQgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQkJcmVzdWx0LnJvb3RJVXMuYWRkKHVuaXQpOwotCQkvL1RoZSBQcm9kdWN0IFF1ZXJ5IHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBsYXVuY2hlciBDVSBmcmFnbWVudHMgYXMgYSB3b3JrYXJvdW5kIHRvIGJ1ZyAyMTg4OTAKLQkJaWYgKHJlc3VsdC5jb25maWd1cmF0aW9uSVVzLmNvbnRhaW5zS2V5KGxhdW5jaGVySWRQcmVmaXgpKSB7Ci0JCQkoKFNldCkgcmVzdWx0LmNvbmZpZ3VyYXRpb25JVXMuZ2V0KGxhdW5jaGVySWRQcmVmaXgpKS5hZGQodW5pdCk7Ci0JCX0gZWxzZSB7Ci0JCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCXNldC5hZGQodW5pdCk7Ci0JCQlyZXN1bHQuY29uZmlndXJhdGlvbklVcy5wdXQobGF1bmNoZXJJZFByZWZpeCwgc2V0KTsKLQkJfQotCi0JCS8vQ3JlYXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yCi0JCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXksIHJvb3QsIGZhbHNlLCB0cnVlKTsKLQkJcHVibGlzaEFydGlmYWN0KGRlc2NyaXB0b3IsIHJvb3QubGlzdEZpbGVzKCksIGRlc3RpbmF0aW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiBGb3IgZWFjaCBwbGF0Zm9ybSwgZ2VuZXJhdGUgYSBDVSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbmZpZy5pbmkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcm9kdWN0Q29uZmlnQ1VzKEdlbmVyYXRvclJlc3VsdCByZXN1bHQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdC5jb25maWdEYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBsYXVuY2hlckNvbmZpZyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN0cmluZ1tdIGNvbmZpZyA9IHBhcnNlQ29uZmlnU3BlYyhsYXVuY2hlckNvbmZpZyk7Ci0JCQlTdHJpbmcgd3MgPSBjb25maWdbMV07Ci0JCQlTdHJpbmcgb3MgPSBjb25maWdbMF07Ci0JCQlTdHJpbmcgYXJjaCA9IGNvbmZpZ1syXTsKLQotCQkJQ29uZmlnRGF0YSBkYXRhID0gKENvbmZpZ0RhdGEpIHJlc3VsdC5jb25maWdEYXRhLmdldChsYXVuY2hlckNvbmZpZyk7Ci0KLQkJCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGN1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGluZm8uZ2V0Rmxhdm9yKCkgKyBwcm9kdWN0RmlsZS5nZXRJZCgpICsgIi5jb25maWcuIiArIHdzICsgJy4nICsgb3MgKyAnLicgKyBhcmNoOyAvLyROT04tTkxTLTEkCi0JCQlWZXJzaW9uIGN1VmVyc2lvbiA9IG5ldyBWZXJzaW9uKHByb2R1Y3RGaWxlLmdldFZlcnNpb24oKSk7Ci0JCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQkJY3Uuc2V0VmVyc2lvbihjdVZlcnNpb24pOwotCQkJY3Uuc2V0U2luZ2xldG9uKHRydWUpOwotCQkJY3Uuc2V0RmlsdGVyKCIoJiAob3NnaS53cz0iICsgd3MgKyAiKSAob3NnaS5vcz0iICsgb3MgKyAiKSAob3NnaS5hcmNoPSIgKyBhcmNoICsgIikpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQotCQkJUHJvdmlkZWRDYXBhYmlsaXR5IHByb2R1Y3RDb25maWdDYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShpbmZvLmdldEZsYXZvcigpICsgcHJvZHVjdEZpbGUuZ2V0SWQoKSwgcHJvZHVjdEZpbGUuZ2V0SWQoKSArIFBST0RVQ1RfQ09ORklHX1NVRkZJWCwgY3VWZXJzaW9uKTsKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eSBzZWxmQ2FwYWJpbGl0eSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgY3VWZXJzaW9uKTsKLQkJCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge3NlbGZDYXBhYmlsaXR5LCBwcm9kdWN0Q29uZmlnQ2FwYWJpbGl0eX0pOwotCi0JCQljdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX09TR0kpOwotCQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZ1tdIGRhdGFTdHJpbmdzID0gZ2V0Q29uZmlndXJhdGlvblN0cmluZ3MoZGF0YSk7Ci0JCQl0b3VjaHBvaW50RGF0YS5wdXQoImNvbmZpZ3VyZSIsIGRhdGFTdHJpbmdzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmNvbmZpZ3VyZSIsIGRhdGFTdHJpbmdzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0KLQkJCXJlc3VsdC5yb290SVVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KSk7Ci0JCX0KLQl9Ci0KLQkvKiAKLQkgKiBGb3IgdGhlIGdpdmVuIHBsYXRmb3JtICh3cywgb3MsIGFyY2gpIGdlbmVyYXRlIHRoZSBDVSB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIHByb2R1Y3QuaW5pIGZpbGUgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUHJvZHVjdEluaUNVKFN0cmluZyB3cywgU3RyaW5nIG9zLCBTdHJpbmcgYXJjaCwgU3RyaW5nIHZlcnNpb24sIEdlbmVyYXRvclJlc3VsdCByZXN1bHQpIHsKLQkJaWYgKHByb2R1Y3RGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy9hdHRlbXB0IHRvIG1lcmdlIGFyZ3VtZW50cyBmcm9tIHRoZSBsYXVuY2hlciBkYXRhIGFuZCB0aGUgcHJvZHVjdCBmaWxlCi0JCVNldCBqdm1BcmdzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJU2V0IHByb2dBcmdzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IGluZm8uZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWlmIChsYXVuY2hlckRhdGEgIT0gbnVsbCkgewotCQkJanZtQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpKSk7Ci0JCQlwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsYXVuY2hlckRhdGEuZ2V0UHJvZ3JhbUFyZ3MoKSkpOwotCQl9Ci0JCXByb2dBcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldEFycmF5RnJvbVN0cmluZyhwcm9kdWN0RmlsZS5nZXRQcm9ncmFtQXJndW1lbnRzKG9zKSwgIiAiKSkpOyAvLyROT04tTkxTLTEkCi0JCWp2bUFyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0QXJyYXlGcm9tU3RyaW5nKHByb2R1Y3RGaWxlLmdldFZNQXJndW1lbnRzKG9zKSwgIiAiKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nW10gZGF0YVN0cmluZ3MgPSBnZXRMYXVuY2hlckNvbmZpZ1N0cmluZ3MoKFN0cmluZ1tdKSBqdm1BcmdzLnRvQXJyYXkobmV3IFN0cmluZ1tqdm1BcmdzLnNpemUoKV0pLCAoU3RyaW5nW10pIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKSk7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9IGRhdGFTdHJpbmdzWzBdOwotCQlTdHJpbmcgdW5jb25maWd1cmF0aW9uRGF0YSA9IGRhdGFTdHJpbmdzWzFdOwotCi0JCWlmIChjb25maWd1cmF0aW9uRGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGN1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnVW5pdElkID0gaW5mby5nZXRGbGF2b3IoKSArIHByb2R1Y3RGaWxlLmdldElkKCkgKyAiLmluaS4iICsgd3MgKyAnLicgKyBvcyArICcuJyArIGFyY2g7IC8vJE5PTi1OTFMtMSQKLQkJVmVyc2lvbiBjdVZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uKTsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJY3Uuc2V0VmVyc2lvbihjdVZlcnNpb24pOwotCQljdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCWN1LnNldEZpbHRlcigiKCYgKG9zZ2kud3M9IiArIHdzICsgIikgKG9zZ2kub3M9IiArIG9zICsgIikgKG9zZ2kuYXJjaD0iICsgYXJjaCArICIpKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0KLQkJUHJvdmlkZWRDYXBhYmlsaXR5IHByb2R1Y3RJbmlDYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShpbmZvLmdldEZsYXZvcigpICsgcHJvZHVjdEZpbGUuZ2V0SWQoKSwgcHJvZHVjdEZpbGUuZ2V0SWQoKSArIFBST0RVQ1RfSU5JX1NVRkZJWCwgY3VWZXJzaW9uKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5IHNlbGZDYXBhYmlsaXR5ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBjdVZlcnNpb24pOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtzZWxmQ2FwYWJpbGl0eSwgcHJvZHVjdEluaUNhcGFiaWxpdHl9KTsKLQotCQljdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX09TR0kpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoImNvbmZpZ3VyZSIsIGNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgdW5jb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0KLQkJcmVzdWx0LnJvb3RJVXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRmVhdHVyZUlVcyhGZWF0dXJlW10gZmVhdHVyZXMsIEdlbmVyYXRvclJlc3VsdCByZXN1bHQsIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24pIHsKLQkJTWFwIGNhdGVnb3JpZXNUb0ZlYXR1cmVJVXMgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgZmVhdHVyZXNUb0NhdGVnb3JpZXMgPSBnZXRGZWF0dXJlVG9DYXRlZ29yeU1hcHBpbmdzKCk7Ci0JCS8vQnVpbGQgRmVhdHVyZSBJVXMsIGFuZCBhZGQgdGhlbSB0byBhbnkgY29ycmVzcG9uZGluZyBjYXRlZ29yaWVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gZmVhdHVyZS5nZXRMb2NhdGlvbigpOwotCQkJYm9vbGVhbiBpc0V4cGxvZGVkID0gKGxvY2F0aW9uLmVuZHNXaXRoKCIuamFyIikgPyBmYWxzZSA6IHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUZlYXR1cmVKYXJJVShmZWF0dXJlLCBpc0V4cGxvZGVkKTsKLQkJCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGZlYXR1cmVJVS5nZXRBcnRpZmFjdHMoKTsKLQkJCWZvciAoaW50IGFydGkgPSAwOyBhcnRpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgYXJ0aSsrKSB7Ci0JCQkJSUFydGlmYWN0RGVzY3JpcHRvciBhZCA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihhcnRpZmFjdHNbYXJ0aV0sIG5ldyBGaWxlKGxvY2F0aW9uKSwgdHJ1ZSwgZmFsc2UpOwotCQkJCWlmIChpc0V4cGxvZGVkKQotCQkJCQlwdWJsaXNoQXJ0aWZhY3QoYWQsIG5ldyBGaWxlKGxvY2F0aW9uKS5saXN0RmlsZXMoKSwgZGVzdGluYXRpb24sIGZhbHNlKTsKLQkJCQllbHNlCi0JCQkJCXB1Ymxpc2hBcnRpZmFjdChhZCwgbmV3IEZpbGVbXSB7bmV3IEZpbGUobG9jYXRpb24pfSwgZGVzdGluYXRpb24sIHRydWUpOwotCQkJfQotCQkJSUluc3RhbGxhYmxlVW5pdCBnZW5lcmF0ZWQgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVHcm91cElVKGZlYXR1cmUsIGZlYXR1cmVJVSk7Ci0JCQlyZXN1bHQucm9vdElVcy5hZGQoZ2VuZXJhdGVkKTsKLQkJCXJlc3VsdC5yb290SVVzLmFkZChmZWF0dXJlSVUpOwotCQkJU2V0IGNhdGVnb3JpZXMgPSBnZXRDYXRlZ29yaWVzKGZlYXR1cmUsIGZlYXR1cmVzVG9DYXRlZ29yaWVzKTsKLQkJCWlmIChjYXRlZ29yaWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNpdGVDYXRlZ29yeSBjYXRlZ29yeSA9IChTaXRlQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQkJU2V0IGZlYXR1cmVJVXMgPSAoU2V0KSBjYXRlZ29yaWVzVG9GZWF0dXJlSVVzLmdldChjYXRlZ29yeSk7Ci0JCQkJCWlmIChmZWF0dXJlSVVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVJVXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQkJY2F0ZWdvcmllc1RvRmVhdHVyZUlVcy5wdXQoY2F0ZWdvcnksIGZlYXR1cmVJVXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVJVXMuYWRkKGdlbmVyYXRlZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyb290Q2F0ZWdvcnkuYWRkKGdlbmVyYXRlZCk7Ci0JCQl9Ci0JCX0KLQkJZ2VuZXJhdGVDYXRlZ29yeUlVcyhjYXRlZ29yaWVzVG9GZWF0dXJlSVVzLCByZXN1bHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTmF0aXZlSVVzKEZpbGUgZXhlY3V0YWJsZUxvY2F0aW9uLCBHZW5lcmF0b3JSZXN1bHQgcmVzdWx0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uKSB7Ci0JCS8vZ2VuZXJhdGUgZGF0YSBmb3IgSlJFCi0JCUZpbGUganJlTG9jYXRpb24gPSBpbmZvLmdldEpSRUxvY2F0aW9uKCk7Ci0JCUlBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3QgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVKUkVEYXRhKGpyZUxvY2F0aW9uLCByZXN1bHQucm9vdElVcyk7Ci0JCXB1Ymxpc2hBcnRpZmFjdChhcnRpZmFjdCwgbmV3IEZpbGVbXSB7anJlTG9jYXRpb259LCBkZXN0aW5hdGlvbiwgZmFsc2UpOwotCi0JCWlmIChpbmZvLmdldExhdW5jaGVyQ29uZmlnKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gY29uZmlnID0gcGFyc2VDb25maWdTcGVjKGluZm8uZ2V0TGF1bmNoZXJDb25maWcoKSk7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9kdWN0RmlsZSAhPSBudWxsICYmICFwcm9kdWN0RmlsZS5nZXRWZXJzaW9uKCkuZXF1YWxzKCIwLjAuMCIpKSAvLyROT04tTkxTLTEkCi0JCQkJdmVyc2lvbiA9IHByb2R1Y3RGaWxlLmdldFZlcnNpb24oKTsKLQkJCWdlbmVyYXRlRXhlY3V0YWJsZUlVcyhjb25maWdbMV0sIGNvbmZpZ1swXSwgY29uZmlnWzJdLCB2ZXJzaW9uLCBleGVjdXRhYmxlTG9jYXRpb24uZ2V0UGFyZW50RmlsZSgpLCByZXN1bHQsIGRlc3RpbmF0aW9uKTsKLQkJCWdlbmVyYXRlUHJvZHVjdEluaUNVKGNvbmZpZ1sxXSwgY29uZmlnWzBdLCBjb25maWdbMl0sIHZlcnNpb24sIHJlc3VsdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvL0lmIHRoZSBleGVjdXRhYmxlIGZlYXR1cmUgaXMgcHJlc2VudCwgdXNlIGl0IHRvIGdlbmVyYXRlIElVcyBmb3IgbGF1bmNoZXJzCi0JCWlmIChnZW5lcmF0ZUV4ZWN1dGFibGVGZWF0dXJlSVVzKHJlc3VsdCwgZGVzdGluYXRpb24pIHx8IGV4ZWN1dGFibGVMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vZ2VuZXJhdGUgZGF0YSBmb3IgZXhlY3V0YWJsZSBsYXVuY2hlcgotCQlhcnRpZmFjdCA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUxhdW5jaGVySVUoZXhlY3V0YWJsZUxvY2F0aW9uLCBpbmZvLmdldEZsYXZvcigpLCByZXN1bHQucm9vdElVcyk7Ci0JCUZpbGVbXSBsYXVuY2hlckZpbGVzID0gbnVsbDsKLQkJLy9oYXJkLWNvZGVkIG5hbWUgaXMgb2ssIHNpbmNlIGNvbnNvbGUgbGF1bmNoZXIgaXMgbm90IGJyYW5kZWQsIGFuZCBhcHBlYXJzIG9uIFdpbmRvd3Mgb25seQotCQlGaWxlIGNvbnNvbGVMYXVuY2hlciA9IG5ldyBGaWxlKGV4ZWN1dGFibGVMb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCksICJlY2xpcHNlYy5leGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29uc29sZUxhdW5jaGVyLmV4aXN0cygpKQotCQkJbGF1bmNoZXJGaWxlcyA9IG5ldyBGaWxlW10ge2V4ZWN1dGFibGVMb2NhdGlvbiwgY29uc29sZUxhdW5jaGVyfTsKLQkJZWxzZQotCQkJbGF1bmNoZXJGaWxlcyA9IG5ldyBGaWxlW10ge2V4ZWN1dGFibGVMb2NhdGlvbn07Ci0JCXB1Ymxpc2hBcnRpZmFjdChhcnRpZmFjdCwgbGF1bmNoZXJGaWxlcywgZGVzdGluYXRpb24sIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVJvb3RJVShHZW5lcmF0b3JSZXN1bHQgcmVzdWx0LCBTdHJpbmcgcm9vdElVSWQsIFN0cmluZyByb290SVVWZXJzaW9uKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcm9vdElVID0gbnVsbDsKLQotCQlpZiAoaW5mby5nZXRQcm9kdWN0RmlsZSgpICE9IG51bGwpCi0JCQlyb290SVUgPSBjcmVhdGVQcm9kdWN0SVUocmVzdWx0KTsKLQkJZWxzZSBpZiAocm9vdElVSWQgIT0gbnVsbCkKLQkJCXJvb3RJVSA9IGNyZWF0ZVRvcExldmVsSVUocmVzdWx0LCByb290SVVJZCwgcm9vdElVVmVyc2lvbik7Ci0KLQkJaWYgKHJvb3RJVSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlc3VsdC5ub25Sb290SVVzLmFkZChyb290SVUpOwotCQlyZXN1bHQubm9uUm9vdElVcy5hZGQoZ2VuZXJhdGVEZWZhdWx0Q2F0ZWdvcnkocm9vdElVKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1bmRsZURlc2NyaXB0aW9uW10gZ2V0QnVuZGxlRGVzY3JpcHRpb25zKEZpbGVbXSBidW5kbGVMb2NhdGlvbnMpIHsKLQkJaWYgKGJ1bmRsZUxvY2F0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVEZXNjcmlwdGlvblswXTsKLQkJYm9vbGVhbiBhZGRTaW1wbGVDb25maWd1cmF0b3IgPSBmYWxzZTsKLQkJYm9vbGVhbiBzY0luID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlTG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWFkZFNpbXBsZUNvbmZpZ3VyYXRvcikKLQkJCQlhZGRTaW1wbGVDb25maWd1cmF0b3IgPSBidW5kbGVMb2NhdGlvbnNbaV0udG9TdHJpbmcoKS5pbmRleE9mKE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IpID4gMDsKLQkJCWlmICghc2NJbikgewotCQkJCXNjSW4gPSBidW5kbGVMb2NhdGlvbnNbaV0udG9TdHJpbmcoKS5pbmRleE9mKE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SKSA+IDA7Ci0JCQkJaWYgKHNjSW4pCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChzY0luKQotCQkJYWRkU2ltcGxlQ29uZmlndXJhdG9yID0gZmFsc2U7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gcmVzdWx0ID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW2J1bmRsZUxvY2F0aW9ucy5sZW5ndGggKyAoYWRkU2ltcGxlQ29uZmlndXJhdG9yID8gMSA6IDApXTsKLQkJQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRCdW5kbGVGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlTG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdW5kbGVEZXNjcmlwdGlvbiBkZXNjID0gZmFjdG9yeS5nZXRCdW5kbGVEZXNjcmlwdGlvbihidW5kbGVMb2NhdGlvbnNbaV0pOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQlyZXN1bHRbaV0gPSBkZXNjOwotCQl9Ci0JCWlmIChhZGRTaW1wbGVDb25maWd1cmF0b3IpIHsKLQkJCS8vQWRkIHNpbXBsZSBjb25maWd1cmF0b3IgdG8gdGhlIGxpc3Qgb2YgYnVuZGxlcwotCQkJdHJ5IHsKLQkJCQlGaWxlIGxvY2F0aW9uID0gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1IgKyAiLmphciIpKS5nZXRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24obG9jYXRpb24pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGdldEJ1bmRsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KHN0YXRlT2JqZWN0RmFjdG9yeSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0ZWdvcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmZWF0dXJlLCBvciBudWxsIGlmIHRoZXJlCi0JICogYXJlIG5vIGFwcGxpY2FibGUgY2F0ZWdvcmllcy4KLQkgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byByZXR1cm4gY2F0ZWdvcmllcyBmb3IKLQkgKiBAcGFyYW0gZmVhdHVyZXNUb0NhdGVnb3JpZXMgQSBtYXAgb2YgU2l0ZUZlYXR1cmUtPlNldDxTaXRlQ2F0ZWdvcnk+Ci0JICogQHJldHVybiBBIFNldDxTaXRlQ2F0ZWdvcnk+IG9mIHRoZSBjYXRlZ29yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZlYXR1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTZXQgZ2V0Q2F0ZWdvcmllcyhGZWF0dXJlIGZlYXR1cmUsIE1hcCBmZWF0dXJlc1RvQ2F0ZWdvcmllcykgewotCQkvL2ZpbmQgdGhlIFNpdGVGZWF0dXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZlYXR1cmUKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzVG9DYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVNpdGVGZWF0dXJlIHNpdGVGZWF0dXJlID0gKFNpdGVGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoc2l0ZUZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKS5lcXVhbHMoZmVhdHVyZS5nZXRJZCgpKSAmJiBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb24oKSkpCi0JCQkJcmV0dXJuIChTZXQpIGZlYXR1cmVzVG9DYXRlZ29yaWVzLmdldChzaXRlRmVhdHVyZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBGZWF0dXJlW10gZ2V0RmVhdHVyZXMoRmlsZSBmb2xkZXIpIHsKLQkJaWYgKGZvbGRlciA9PSBudWxsIHx8ICFmb2xkZXIuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbmV3IEZlYXR1cmVbMF07Ci0JCUZpbGVbXSBsb2NhdGlvbnMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGxvY2F0aW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZSBmZWF0dXJlID0gbmV3IEZlYXR1cmVQYXJzZXIoKS5wYXJzZShsb2NhdGlvbnNbaV0pOwotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCWZlYXR1cmUuc2V0TG9jYXRpb24obG9jYXRpb25zW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoRmVhdHVyZVtdKSByZXN1bHQudG9BcnJheShuZXcgRmVhdHVyZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIG1hcHBpbmcgb2YgZmVhdHVyZXMgdG8gY2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluIHRoZSBzaXRlLnhtbCwKLQkgKiBpZiBhdmFpbGFibGUuIFJldHVybnMgYW4gZW1wdHkgbWFwIGlmIHRoZXJlIGlzIG5vdCBzaXRlLnhtbCwgb3Igbm8gY2F0ZWdvcmllcy4KLQkgKiBAcmV0dXJuIEEgbWFwIG9mIFNpdGVGZWF0dXJlIC0+IFNldDxTaXRlQ2F0ZWdvcnk+LgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RmVhdHVyZVRvQ2F0ZWdvcnlNYXBwaW5ncygpIHsKLQkJSGFzaE1hcCBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVVSTCBzaXRlTG9jYXRpb24gPSBpbmZvLmdldFNpdGVMb2NhdGlvbigpOwotCQlpZiAoc2l0ZUxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbWFwcGluZ3M7Ci0JCUlucHV0U3RyZWFtIGlucHV0OwotCQlTaXRlTW9kZWwgc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNpdGVMb2NhdGlvbi5vcGVuU3RyZWFtKCkpOwotCQkJc2l0ZSA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpLnBhcnNlKGlucHV0KTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vZG9uJ3QgY29tcGxhaW4gaWYgdGhlIHVwZGF0ZSBzaXRlIGlzIG5vdCBwcmVzZW50Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fZXJyb3JQYXJzaW5nVXBkYXRlU2l0ZSwgc2l0ZUxvY2F0aW9uKSwgZSkpOwotCQl9Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gbWFwcGluZ3M7Ci0KLQkJLy9jb3B5IG1pcnJvciBpbmZvcm1hdGlvbiBmcm9tIHVwZGF0ZSBzaXRlIHRvIHAyIHJlcG9zaXRvcmllcwotCQlTdHJpbmcgbWlycm9ycyA9IHNpdGUuZ2V0TWlycm9yc1VSTCgpOwotCQlpZiAobWlycm9ycyAhPSBudWxsKSB7Ci0JCQkvL3JlbW92ZSBzaXRlLnhtbCBmaWxlIHJlZmVyZW5jZQotCQkJaW50IGluZGV4ID0gbWlycm9ycy5pbmRleE9mKCJzaXRlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJbWlycm9ycyA9IG1pcnJvcnMuc3Vic3RyaW5nKDAsIGluZGV4KSArIG1pcnJvcnMuc3Vic3RyaW5nKGluZGV4ICsgOSk7Ci0JCQlpbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfTUlSUk9SU19VUkwsIG1pcnJvcnMpOwotCQkJaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKS5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX01JUlJPUlNfVVJMLCBtaXJyb3JzKTsKLQkJfQotCi0JCVNpdGVGZWF0dXJlW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vYWRkIGEgbWFwcGluZyBmb3IgZWFjaCBjYXRlZ29yeSB0aGlzIGZlYXR1cmUgYmVsb25ncyB0bwotCQkJU3RyaW5nW10gY2F0ZWdvcnlOYW1lcyA9IGZlYXR1cmVzW2ldLmdldENhdGVnb3J5TmFtZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlOYW1lcy5sZW5ndGg7IGorKykgewotCQkJCVNpdGVDYXRlZ29yeSBjYXRlZ29yeSA9IHNpdGUuZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnlOYW1lc1tqXSk7Ci0JCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJU2V0IGNhdGVnb3JpZXMgPSAoU2V0KSBtYXBwaW5ncy5nZXQoZmVhdHVyZXNbaV0pOwotCQkJCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0JCQkJCQljYXRlZ29yaWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJCW1hcHBpbmdzLnB1dChmZWF0dXJlc1tpXSwgY2F0ZWdvcmllcyk7Ci0JCQkJCX0KLQkJCQkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIElHZW5lcmF0b3JJbmZvIGdldEdlbmVyYXRvckluZm8oKSB7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIEBUT0RPIFRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdG8gcmVuYW1lIHRoZSBsYXVuY2hlci5leGUgZmlsZXMKLQkgKiB0byBlY2xpcHNlLmV4ZSAob3IgImxhdW5jaGVyIiB0byAiZWNsaXBzZSIpLiBFdmVudHVhbGx5IHdlIHdpbGwgZWl0aGVyIGhhbmQtY3JhZnQKLQkgKiBtZXRhZGF0YS9hcnRpZmFjdHMgZm9yIGxhdW5jaGVycywgb3IgYWx0ZXIgdGhlIGRlbHRhIHBhY2sgdG8gY29udGFpbiBlY2xpcHNlLWJyYW5kZWQKLQkgKiBsYXVuY2hlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG11bmdlTGF1bmNoZXJGaWxlTmFtZXMoRmlsZSByb290KSB7Ci0JCWlmIChyb290LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbXVuZ2VMYXVuY2hlckZpbGVOYW1lcyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocm9vdC5pc0ZpbGUoKSkgewotCQkJaWYgKHJvb3QuZ2V0TmFtZSgpLmVxdWFscygibGF1bmNoZXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJvb3QucmVuYW1lVG8obmV3IEZpbGUocm9vdC5nZXRQYXJlbnRGaWxlKCksICJlY2xpcHNlIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChyb290LmdldE5hbWUoKS5lcXVhbHMoImxhdW5jaGVyLmV4ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcm9vdC5yZW5hbWVUbyhuZXcgRmlsZShyb290LmdldFBhcmVudEZpbGUoKSwgImVjbGlwc2UuZXhlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyBQdXQgdGhlIGFydGlmYWN0IG9uIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoQXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBGaWxlW10gZmlsZXMsIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24sIGJvb2xlYW4gYXNJcykgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsIHx8IGRlc3RpbmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaW5mby5wdWJsaXNoQXJ0aWZhY3RzKCkpIHsKLQkJCWRlc3RpbmF0aW9uLmFkZERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGFzSXMgJiYgZmlsZXMubGVuZ3RoID09IDEpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFkZXN0aW5hdGlvbi5jb250YWlucyhkZXNjcmlwdG9yKSkgewotCQkJCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbShkZXNjcmlwdG9yKSk7Ci0JCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZXNbMF0pKSwgdHJ1ZSwgb3V0cHV0LCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHB1Ymxpc2hpbmcgYXJ0aWZhY3RzIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwMi5nZW5lcmF0b3IiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUZpbGVVdGlscy56aXAoZmlsZXMsIHRlbXBGaWxlKTsKLQkJCQlpZiAoIWRlc3RpbmF0aW9uLmNvbnRhaW5zKGRlc2NyaXB0b3IpKSB7Ci0JCQkJCU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24uZ2V0T3V0cHV0U3RyZWFtKGRlc2NyaXB0b3IpKTsKLQkJCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRmlsZSkpLCB0cnVlLCBvdXRwdXQsIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgcHVibGlzaGluZyBhcnRpZmFjdHMiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRlbXBGaWxlICE9IG51bGwpCi0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSb290SVUoYm9vbGVhbiBnZW5lcmF0ZVJvb3RJVSkgewotCQl0aGlzLmdlbmVyYXRlUm9vdElVID0gZ2VuZXJhdGVSb290SVU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvR2VuZXJhdG9yQnVuZGxlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvR2VuZXJhdG9yQnVuZGxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYxNWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0dlbmVyYXRvckJ1bmRsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkhlYWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yQnVuZGxlSW5mbyBleHRlbmRzIEJ1bmRsZUluZm8gewotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0xFVkVMID0gLTE7Ci0KLQkvLwlwcml2YXRlIFN0cmluZyBzeW1ib2xpY05hbWU7Ci0JLy8JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQkvLwlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkvLwlwcml2YXRlIGludCBleHBlY3RlZFN0YXRlOwotCS8vCXByaXZhdGUgaW50IHN0YXJ0TGV2ZWwgPSBOT19MRVZFTDsKLQkvLwlwcml2YXRlIFN0cmluZyBtYW5pZmVzdDsKLQotCXByaXZhdGUgU3RyaW5nIHNwZWNpYWxDb25maWdDb21tYW5kczsKLQlwcml2YXRlIFN0cmluZyBzcGVjaWFsVW5jb25maWdDb21tYW5kczsKLQotCXB1YmxpYyBHZW5lcmF0b3JCdW5kbGVJbmZvKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJc3VwZXIuc2V0QnVuZGxlSWQoYkluZm8uZ2V0QnVuZGxlSWQoKSk7Ci0JCXN1cGVyLnNldExvY2F0aW9uKGJJbmZvLmdldExvY2F0aW9uKCkpOwotCQlzdXBlci5zZXRNYW5pZmVzdChiSW5mby5nZXRNYW5pZmVzdCgpKTsKLQkJc3VwZXIuc2V0TWFya2VkQXNTdGFydGVkKGJJbmZvLmlzTWFya2VkQXNTdGFydGVkKCkpOwotCQlzdXBlci5zZXRSZXNvbHZlZChiSW5mby5pc1Jlc29sdmVkKCkpOwotCQlzdXBlci5zZXRTdGFydExldmVsKGJJbmZvLmdldFN0YXJ0TGV2ZWwoKSk7Ci0JCXN1cGVyLnNldFN5bWJvbGljTmFtZShiSW5mby5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCXN1cGVyLnNldFZlcnNpb24oYkluZm8uZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJhdG9yQnVuZGxlSW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLy8JLyogKG5vbi1KYXZhZG9jKQotCS8vCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JLy8JICovCi0JLy8JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkvLwkJaW50IHJlc3VsdCA9IHN5bWJvbGljTmFtZSA9PSBudWxsID8gMCA6IHN5bWJvbGljTmFtZS5oYXNoQ29kZSgpOwotCS8vCQlyZXN1bHQgPSByZXN1bHQgKyAodmVyc2lvbiA9PSBudWxsID8gMCA6IHZlcnNpb24uaGFzaENvZGUoKSk7Ci0JLy8JCXJlc3VsdCA9IHJlc3VsdCArIChsb2NhdGlvbiA9PSBudWxsID8gMCA6IGxvY2F0aW9uLmhhc2hDb2RlKCkpOwotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCS8vCQlyZXR1cm4gc3ltYm9saWNOYW1lOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkvLwkJcmV0dXJuIHZlcnNpb247Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIGludCBleHBlY3RlZFN0YXRlKCkgewotCS8vCQlyZXR1cm4gZXhwZWN0ZWRTdGF0ZTsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgaW50IGdldFN0YXJ0TGV2ZWwoKSB7Ci0JLy8JCXJldHVybiBzdGFydExldmVsOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JLy8JCXJldHVybiBsb2NhdGlvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIGlkKSB7Ci0JLy8JCXN5bWJvbGljTmFtZSA9IGlkOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkvLwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFN0YXRlKGludCBzdGF0ZSkgewotCS8vCQlleHBlY3RlZFN0YXRlID0gc3RhdGU7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIHZvaWQgc2V0U3RhcnRMZXZlbChpbnQgbGV2ZWwpIHsKLQkvLwkJdGhpcy5zdGFydExldmVsID0gbGV2ZWw7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JLy8JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChTdHJpbmcgbWFuaWZlc3QpIHsKLQkvLwkJdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OwotCS8vCX0KLQkvLwkKLQkvLwlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0KCkgewotCS8vCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JLy8JfQotCS8vCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCkgewotCQlyZXR1cm4gc3BlY2lhbENvbmZpZ0NvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpYWxDb25maWdDb21tYW5kcyhTdHJpbmcgc3BlY2lhbENvbmZpZ0NvbW1hbmRzKSB7Ci0JCXRoaXMuc3BlY2lhbENvbmZpZ0NvbW1hbmRzID0gc3BlY2lhbENvbmZpZ0NvbW1hbmRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoKSB7Ci0JCXJldHVybiBzcGVjaWFsVW5jb25maWdDb21tYW5kczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWFsVW5jb25maWdDb21tYW5kcyhTdHJpbmcgc3BlY2lhbFVuY29uZmlnQ29tbWFuZHMpIHsKLQkJdGhpcy5zcGVjaWFsVW5jb25maWdDb21tYW5kcyA9IHNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzOwotCX0KLQotCS8vCS8qIChub24tSmF2YWRvYykKLQkvLwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JLy8JICovCi0JLy8JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0b0NvbXBhcmUpIHsKLQkvLwkJaWYgKHRvQ29tcGFyZSBpbnN0YW5jZW9mIEdlbmVyYXRvckJ1bmRsZUluZm8pIHsKLQkvLwkJCUdlbmVyYXRvckJ1bmRsZUluZm8gaW5mbyA9IChHZW5lcmF0b3JCdW5kbGVJbmZvKSB0b0NvbXBhcmU7Ci0JLy8JCQlpZiAoaW5mby5zeW1ib2xpY05hbWUuZXF1YWxzKHN5bWJvbGljTmFtZSkgJiYgaW5mby52ZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSAmJiAoaW5mby5sb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uID09IG51bGwgPyB0cnVlIDogaW5mby5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKSkKLQkvLwkJCQlyZXR1cm4gdHJ1ZTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gZmFsc2U7Ci0JLy8JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN1cGVyU3QgPSBzdXBlci50b1N0cmluZygpOwotCQlpZiAoc3VwZXJTdC5sZW5ndGgoKSA+IDApCi0JCQlidWZmZXIuYXBwZW5kKHN1cGVyU3Quc3Vic3RyaW5nKDAsIHN1cGVyU3QubGVuZ3RoKCkgLSAxKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgdGhpcy5zcGVjaWFsQ29uZmlnQ29tbWFuZHM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnNwZWNpYWxDb25maWdDb21tYW5kcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRGcm9tTWFuaWZlc3QoU3RyaW5nIG1hbmlmZXN0KSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5zZXRNYW5pZmVzdChtYW5pZmVzdCk7Ci0JCQlIZWFkZXJzIGhlYWRlcnMgPSBIZWFkZXJzLnBhcnNlTWFuaWZlc3QobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1hbmlmZXN0LmdldEJ5dGVzKCkpKTsKLQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnQgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoImJzbiIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnNldFN5bWJvbGljTmFtZShlbGVtZW50WzBdLmdldFZhbHVlKCkpOwotCQkJc3VwZXIuc2V0VmVyc2lvbigoU3RyaW5nKSBoZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0lHZW5lcmF0b3JJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9JR2VuZXJhdG9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTRmMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL0lHZW5lcmF0b3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkNvbmZpZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUdlbmVyYXRvckluZm8gewotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGRlZmF1bHQgSVVzIHRvIHRoZSBwdWJsaXNoZWQgcmVzdWx0LgotCSAqIFRoZSBkZWZhdWx0IElVcyBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gY29uZmlndXJlIGJ1bmRsZXMsIGZlYXR1cmVzIGFuZCAKLQkgKiBzb3VyY2UgYnVuZGxlcy4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRvIHB1Ymxpc2ggZGVmYXVsdCBJVXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGREZWZhdWx0SVVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRvIGFwcGVuZCB0byBleGlzdGluZyByZXBvc2l0b3JpZXMgb3Igb3ZlcndyaXRlLgotCSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdG8gYXBwZW5kIHRvIGV4aXN0aW5nIHJlcG9zaXRvcmllcyBvciBvdmVyd3JpdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXBwZW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IGludG8gd2hpY2ggYW55IHB1Ymxpc2hhYmxlIGFydGlmYWN0cyBhcmUgcHVibGlzaGVkCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGEgZGVzdGluYXRpb24gYXJ0aWZhY3QgcmVwb3NpdG9yeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYXRpb25zIGluIHdoaWNoIGJ1bmRsZXMgbWF5IGJlIGZvdW5kLiAgVGhlIGxvY2F0aW9ucyBtYXkKLQkgKiBiZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggb3IgYWN0dWFsIGJ1bmRsZSBmaWxlcy4KLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyBob2xkaW5nIGJ1bmRsZXMgdG8gcHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgRmlsZVtdIGdldEJ1bmRsZUxvY2F0aW9ucygpOwotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBkYXRhIHRvIHVzZSBkdXJpbmcgcHVibGlzaGluZyBvciA8Y29kZT5udWxsPC9jb2RlPiAKLQkgKiBpZiBub25lLiAgVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBkZXRhaWxzIHRoZSBmcmFtZXdvcmsgYW5kIGxhdW5jaGVyIHNldHVwLgotCSAqCi0JICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBkYXRhIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbmZpZ0RhdGEgZ2V0Q29uZmlnRGF0YSgpOwotCi0JcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldERlZmF1bHRJVXMoU2V0IGl1cyk7Ci0KLQlwdWJsaWMgRmlsZSBnZXRFeGVjdXRhYmxlTG9jYXRpb24oKTsKLQotCXB1YmxpYyBGaWxlIGdldEZlYXR1cmVzTG9jYXRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmxhdm9yKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc1VwZGF0ZUNvbXBhdGlibGUoKTsKLQotCXB1YmxpYyBGaWxlIGdldEpSRUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gZm9yIHRoZSBkYXRhIHRoaXMgbG9jYXRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBwZGUuYnVpbGQgc3R5bGUgcGxhdGZvcm0gY29uZmlnIGluIHRoZSBmb3JtIG9zX3dzX2FyY2gKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyQ29uZmlnKCk7Ci0KLQlwdWJsaWMgTGF1bmNoZXJEYXRhIGdldExhdW5jaGVyRGF0YSgpOwotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0TWFwcGluZ1J1bGVzKCk7Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRNZXRhZGF0YVJlcG9zaXRvcnkoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJvb3RWZXJzaW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3RGaWxlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25BZHZpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlLnhtbCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QKLQkgKiBnZW5lcmF0aW5nIGZvciBhbiB1cGRhdGUgc2l0ZS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbiBvZiBzaXRlLnhtbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFNpdGVMb2NhdGlvbigpOwotCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaEFydGlmYWN0cygpOwotCi0JcHVibGljIGJvb2xlYW4gcmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcygpOwotCi0JcHVibGljIHZvaWQgcmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcyhib29sZWFuIHB1Ymxpc2hQYWNrKTsKLQotCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0UmVwb3NpdG9yeShJQXJ0aWZhY3RSZXBvc2l0b3J5IHZhbHVlKTsKLQotCXB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgdmFsdWUpOwotCi0JcHVibGljIHZvaWQgc2V0SXNVcGRhdGVDb21wYXRpYmxlKGJvb2xlYW4gaXNDb21wYXRpYmxlKTsKLQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVwb3NpdG9yeShJTWV0YWRhdGFSZXBvc2l0b3J5IHZhbHVlKTsKLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290SWQoU3RyaW5nIHZhbHVlKTsKLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25BZHZpY2UoU3RyaW5nIGFkdmljZSk7Ci0KLQkvLyBUT0RPOiBUaGlzIGlzIGtpbmQgb2YgdWdseS4gSXQncyBwdXJwb3NlIGlzIHRvIGFsbG93IHVzIHRvIGNyYWZ0IENVcyB0aGF0IHdlIGtub3cgYWJvdXQgYW5kIG5lZWQgZm9yIG91ciBidWlsZAotCS8vIFdlIHNob3VsZCB0cnkgdG8gcmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJpYyBwcmlvciB0byByZWxlYXNlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0T3RoZXJJVXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9NZXRhZGF0YUdlbmVyYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE5ZjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcy5TaXRlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyIHsKLQkvKioKLQkgKiBBIGNhcGFiaWxpdHkgbmFtZXNwYWNlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBFY2xpcHNlIHJlc291cmNlIChidW5kbGUsIGZlYXR1cmUsIHNvdXJjZSBidW5kbGUsIGV0YykKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgUHJvdmlkZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0VDTElQU0VfVFlQRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lIGluIHRoZSB7QGxpbmsgI05BTUVTUEFDRV9FQ0xJUFNFX1RZUEV9IG5hbWVzcGFjZSAKLQkgKiByZXByZXNlbnRpbmcgYW5kIE9TR2kgYnVuZGxlIHJlc291cmNlCi0JICogQHNlZSBSZXF1aXJlZENhcGFiaWxpdHkjZ2V0TmFtZSgpCi0JICogQHNlZSBQcm92aWRlZENhcGFiaWxpdHkjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FQ0xJUFNFX0JVTkRMRSA9ICJidW5kbGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWUgaW4gdGhlIHtAbGluayAjTkFNRVNQQUNFX0VDTElQU0VfVFlQRX0gbmFtZXNwYWNlIAotCSAqIHJlcHJlc2VudGluZyBhIGZlYXR1cmUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VDTElQU0VfRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWUgaW4gdGhlIHtAbGluayAjTkFNRVNQQUNFX0VDTElQU0VfVFlQRX0gbmFtZXNwYWNlIAotCSAqIHJlcHJlc2VudGluZyBhIHNvdXJjZSBidW5kbGUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VDTElQU0VfU09VUkNFID0gInNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBsb2NhbGl6YXRpb24gKHRyYW5zbGF0aW9uKQotCSAqIG9mIHN0cmluZ3MgZnJvbSBhIHNwZWNpZmllZCBJVSBpbiBhIHNwZWNpZmllZCBsb2NhbGUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgUHJvdmlkZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICogVE9ETzogdGhpcyBzaG91bGQgYmUgaW4gQVBJLCBwcm9iYWJseSBpbiBJSW5zdGFsbGFibGVVbml0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0lVX0xPQ0FMSVpBVElPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9ubHkgY2VydGFpbiBwcm9wZXJ0aWVzIGluIHRoZSBidW5kbGUgbWFuaWZlc3QgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxpemVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTID0ge0NvbnN0YW50cy5CVU5ETEVfTkFNRSwgQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgQ29uc3RhbnRzLkJVTkRMRV9WRU5ET1IsIENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsIENvbnN0YW50cy5CVU5ETEVfRE9DVVJMLCBDb25zdGFudHMuQlVORExFX1VQREFURUxPQ0FUSU9OfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTE9DQUxJWkFUSU9OX0lOREVYID0gQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTLmxlbmd0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJVTkRMRV9JVV9QUk9QRVJUWV9NQVAgPSB7Q29uc3RhbnRzLkJVTkRMRV9OQU1FLCBJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBDb25zdGFudHMuQlVORExFX1ZFTkRPUiwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST1ZJREVSLCBDb25zdGFudHMuQlVORExFX0NPTlRBQ1RBRERSRVNTLCBJSW5zdGFsbGFibGVVbml0LlBST1BfQ09OVEFDVCwgQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ET0NfVVJMfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX05TX0pBVkFfUEFDS0FHRSA9ICJqYXZhLnBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfT1NHSV9CVU5ETEUgPSAib3NnaS5idW5kbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfT1NHSV9GUkFHTUVOVCA9ICJvc2dpLmZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfVVBEQVRFX0ZFQVRVUkUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIERFRkFVTFRfSlJFX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigiMS42Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VfRkVBVFVSRV9DTEFTU0lGSUVSID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5mZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0lfQlVORExFX0NMQVNTSUZJRVIgPSAib3NnaS5idW5kbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZX0FSVElGQUNUX0NMQVNTSUZJRVIgPSAiYmluYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIgPSAiKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnN0YWxsLmZlYXR1cmVzPXRydWUpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElVX05BTUVTUEFDRSA9IElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX0lEX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0lOU1RBTExfSEFORExFUl9QUk9QID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnN0YWxsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vVE9ETyAtIG5lZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5IHRvIGluZmVyIGxhdW5jaGVyIHZlcnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIExBVU5DSEVSX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gdmVyc2lvbk1heCA9IG5ldyBWZXJzaW9uKEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50VHlwZSBUT1VDSFBPSU5UX05BVElWRSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIFRPVUNIUE9JTlRfT1NHSSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eSBCVU5ETEVfQ0FQQUJJTElUWSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0JVTkRMRSwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5IEZFQVRVUkVfQ0FQQUJJTElUWSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0ZFQVRVUkUsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eSBTT1VSQ0VfQlVORExFX0NBUEFCSUxJVFkgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KE5BTUVTUEFDRV9FQ0xJUFNFX1RZUEUsIFRZUEVfRUNMSVBTRV9TT1VSQ0UsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQJCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfTE9DQUxJWkFUSU9OUyA9ICJlY2xpcHNlLnAyLm1hbmlmZXN0LmxvY2FsaXphdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgTG9jYWxlIERFRkFVTFRfTE9DQUxFID0gbmV3IExvY2FsZSgiZGYiLCAiTFQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgTG9jYWxlIFBTRVVET19MT0NBTEUgPSBuZXcgTG9jYWxlKCJ6eiIsICJaWiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3REZXNjcmlwdG9yIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5LCBGaWxlIHBhdGhPbkRpc2ssIGJvb2xlYW4gYXNJcywgYm9vbGVhbiByZWN1cikgewotCQkvL1RPRE8gdGhpcyBzaXplIGNhbGN1bGF0aW9uIGlzIGJvZ3VzCi0JCUFydGlmYWN0RGVzY3JpcHRvciByZXN1bHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChwYXRoT25EaXNrICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUsIExvbmcudG9TdHJpbmcocGF0aE9uRGlzay5sZW5ndGgoKSkpOwotCQkJLy8gVE9ETyAtIHRoaXMgaXMgd3JvbmcgYnV0IEknbSB0ZXN0aW5nIGEgd29yay1hcm91bmQgZm9yIGJ1ZyAyMDU4NDIKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUsIExvbmcudG9TdHJpbmcocGF0aE9uRGlzay5sZW5ndGgoKSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3REZXNjcmlwdG9yIGNyZWF0ZVBhY2syMDBBcnRpZmFjdERlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSwgRmlsZSBwYXRoT25EaXNrLCBTdHJpbmcgaW5zdGFsbFNpemUpIHsKLQkJZmluYWwgU3RyaW5nIFBBQ0tFRF9GT1JNQVQgPSAicGFja2VkIjsgLy8kTk9OLU5MUy0xJAotCQkvL1RPRE8gdGhpcyBzaXplIGNhbGN1bGF0aW9uIGlzIGJvZ3VzCi0JCUFydGlmYWN0RGVzY3JpcHRvciByZXN1bHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChwYXRoT25EaXNrICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUsIGluc3RhbGxTaXplKTsKLQkJCS8vIFRPRE8gLSB0aGlzIGlzIHdyb25nIGJ1dCBJJ20gdGVzdGluZyBhIHdvcmstYXJvdW5kIGZvciBidWcgMjA1ODQyCi0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFLCBMb25nLnRvU3RyaW5nKHBhdGhPbkRpc2subGVuZ3RoKCkpKTsKLQkJfQotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0UHJvY2Vzc2luZ1N0ZXBzKHN0ZXBzKTsKLQkJcmVzdWx0LnNldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRk9STUFULCBQQUNLRURfRk9STUFUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdEtleSBjcmVhdGVCdW5kbGVBcnRpZmFjdEtleShTdHJpbmcgYnNuLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0S2V5KE9TR0lfQlVORExFX0NMQVNTSUZJRVIsIGJzbiwgbmV3IFZlcnNpb24odmVyc2lvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCdW5kbGVDb25maWd1cmF0aW9uVW5pdChTdHJpbmcgaXVJZCwgVmVyc2lvbiBpdVZlcnNpb24sIGJvb2xlYW4gaXNCdW5kbGVGcmFnbWVudCwgR2VuZXJhdG9yQnVuZGxlSW5mbyBjb25maWdJbmZvLCBTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvciwgU3RyaW5nIGZpbHRlcikgewotCQlpZiAoY29uZmlnSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdVbml0SWQgPSBjb25maWd1cmF0aW9uRmxhdm9yICsgaXVJZDsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJY3Uuc2V0VmVyc2lvbihpdVZlcnNpb24pOwotCi0JCS8vSW5kaWNhdGUgdGhlIElVIHRvIHdoaWNoIHRoaXMgQ1UgYXBwbHkKLQkJY3Uuc2V0SG9zdChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10geyAvLwotCQkJCU1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSwgaXVJZCwgbmV3IFZlcnNpb25SYW5nZShpdVZlcnNpb24sIHRydWUsIHZlcnNpb25NYXgsIHRydWUpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpLCAvLyAKLQkJCQkJCU1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0JVTkRMRSwgbmV3IFZlcnNpb25SYW5nZShuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9KTsKLQotCQkvL0FkZHMgY2FwYWJpbGl0aWVzIGZvciBmcmFnbWVudCwgc2VsZiwgYW5kIGRlc2NyaWJpbmcgdGhlIGZsYXZvciBzdXBwb3J0ZWQKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBpdVZlcnNpb24pLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgY29uZmlndXJhdGlvbkZsYXZvciwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfSk7Ci0KLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgImluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAidW5pbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgiY29uZmlndXJlIiwgY3JlYXRlQ29uZmlnU2NyaXB0KGNvbmZpZ0luZm8sIGlzQnVuZGxlRnJhZ21lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgY3JlYXRlVW5jb25maWdTY3JpcHQoY29uZmlnSW5mbywgaXNCdW5kbGVGcmFnbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQljdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCdW5kbGVJVShCdW5kbGVEZXNjcmlwdGlvbiBiZCwgTWFwIG1hbmlmZXN0LCBib29sZWFuIGlzRm9sZGVyUGx1Z2luLCBJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCU1hcCBtYW5pZmVzdExvY2FsaXphdGlvbnMgPSBudWxsOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBiZC5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCW1hbmlmZXN0TG9jYWxpemF0aW9ucyA9IGdldE1hbmlmZXN0TG9jYWxpemF0aW9ucyhtYW5pZmVzdCwgbmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSkpOwotCQl9Ci0KLQkJcmV0dXJuIGNyZWF0ZUJ1bmRsZUlVKGJkLCBtYW5pZmVzdCwgaXNGb2xkZXJQbHVnaW4sIGtleSwgbWFuaWZlc3RMb2NhbGl6YXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQnVuZGxlSVUoQnVuZGxlRGVzY3JpcHRpb24gYmQsIE1hcCBtYW5pZmVzdCwgYm9vbGVhbiBpc0ZvbGRlclBsdWdpbiwgSUFydGlmYWN0S2V5IGtleSwgTWFwIG1hbmlmZXN0TG9jYWxpemF0aW9ucykgewotCQlib29sZWFuIGlzQmluYXJ5QnVuZGxlID0gdHJ1ZTsKLQkJaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuY29udGFpbnNLZXkoIkVjbGlwc2UtU291cmNlQnVuZGxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaXNCaW5hcnlCdW5kbGUgPSBmYWxzZTsKLQkJfQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0U2luZ2xldG9uKGJkLmlzU2luZ2xldG9uKCkpOwotCQlpdS5zZXRJZChiZC5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWl1LnNldFZlcnNpb24oYmQuZ2V0VmVyc2lvbigpKTsKLQkJaXUuc2V0RmlsdGVyKGJkLmdldFBsYXRmb3JtRmlsdGVyKCkpOwotCi0JCWl1LnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoYmQuZ2V0U3ltYm9saWNOYW1lKCksIG5ldyBWZXJzaW9uUmFuZ2UobmV3IFZlcnNpb24oMCwgMCwgMCksIHRydWUsIGJkLmdldFZlcnNpb24oKSwgZmFsc2UpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBiZC5nZXRIb3N0KCkgIT0gbnVsbDsKLQkJLy8JCWJvb2xlYW4gcmVxdWlyZXNBRnJhZ21lbnQgPSBpc0ZyYWdtZW50ID8gZmFsc2UgOiByZXF1aXJlQUZyYWdtZW50KGJkLCBtYW5pZmVzdCk7Ci0KLQkJLy9Qcm9jZXNzIHRoZSByZXF1aXJlZCBidW5kbGVzCi0JCUJ1bmRsZVNwZWNpZmljYXRpb24gcmVxdWlyZWRCdW5kbGVzW10gPSBiZC5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJQXJyYXlMaXN0IHJlcXNEZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLwkJaWYgKHJlcXVpcmVzQUZyYWdtZW50KQotCQkvLwkJCXJlcXNEZXBzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfVFlQRV9PU0dJX0ZSQUdNRU5UUywgYmQuZ2V0U3ltYm9saWNOYW1lKCksIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKLQkJaWYgKGlzRnJhZ21lbnQpCi0JCQlyZXFzRGVwcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX09TR0lfQlVORExFLCBiZC5nZXRIb3N0KCkuZ2V0TmFtZSgpLCBiZC5nZXRIb3N0KCkuZ2V0VmVyc2lvblJhbmdlKCksIG51bGwsIGZhbHNlLCBmYWxzZSkpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXVpcmVkQnVuZGxlcy5sZW5ndGg7IGorKykKLQkJCXJlcXNEZXBzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfT1NHSV9CVU5ETEUsIHJlcXVpcmVkQnVuZGxlc1tqXS5nZXROYW1lKCksIHJlcXVpcmVkQnVuZGxlc1tqXS5nZXRWZXJzaW9uUmFuZ2UoKSA9PSBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSA/IG51bGwgOiByZXF1aXJlZEJ1bmRsZXNbal0uZ2V0VmVyc2lvblJhbmdlKCksIG51bGwsIHJlcXVpcmVkQnVuZGxlc1tqXS5pc09wdGlvbmFsKCksIGZhbHNlKSk7Ci0KLQkJLy8gUHJvY2VzcyB0aGUgaW1wb3J0IHBhY2thZ2VzCi0JCUltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uIG9zZ2lJbXBvcnRzW10gPSBiZC5nZXRJbXBvcnRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9zZ2lJbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBUT0RPIHdlIG5lZWQgdG8gc29ydCBvdXQgaG93IHdlIHdhbnQgdG8gaGFuZGxlIHdpbGQtY2FyZGVkIGR5bmFtaWMgaW1wb3J0cyAtIGZvciBub3cgd2UgaWdub3JlIHRoZW0KLQkJCUltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uIGltcG9ydFNwZWMgPSBvc2dpSW1wb3J0c1tpXTsKLQkJCVN0cmluZyBpbXBvcnRQYWNrYWdlTmFtZSA9IGltcG9ydFNwZWMuZ2V0TmFtZSgpOwotCQkJaWYgKGltcG9ydFBhY2thZ2VOYW1lLmluZGV4T2YoJyonKSAhPSAtMSkKLQkJCQljb250aW51ZTsKLQotCQkJVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSA9IGltcG9ydFNwZWMuZ2V0VmVyc2lvblJhbmdlKCkgPT0gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgPyBudWxsIDogaW1wb3J0U3BlYy5nZXRWZXJzaW9uUmFuZ2UoKTsKLQotCQkJLy9UT0RPIHRoaXMgbmVlZHMgdG8gYmUgcmVmaW5lZCB0byB0YWtlIGludG8gYWNjb3VudCBhbGwgdGhlIGF0dHJpYnV0ZSBoYW5kbGVkIGJ5IGltcG9ydHMKLQkJCXJlcXNEZXBzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfSkFWQV9QQUNLQUdFLCBpbXBvcnRQYWNrYWdlTmFtZSwgdmVyc2lvblJhbmdlLCBudWxsLCBpc09wdGlvbmFsKGltcG9ydFNwZWMpLCBmYWxzZSkpOwotCQl9Ci0JCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVxc0RlcHMudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXNEZXBzLnNpemUoKV0pKTsKLQotCQkvLyBDcmVhdGUgc2V0IG9mIHByb3ZpZGVkIGNhcGFiaWxpdGllcwotCQlBcnJheUxpc3QgcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChjcmVhdGVTZWxmQ2FwYWJpbGl0eShiZC5nZXRTeW1ib2xpY05hbWUoKSwgYmQuZ2V0VmVyc2lvbigpKSk7Ci0JCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfT1NHSV9CVU5ETEUsIGJkLmdldFN5bWJvbGljTmFtZSgpLCBiZC5nZXRWZXJzaW9uKCkpKTsKLQotCQkvLyBQcm9jZXNzIHRoZSBleHBvcnQgcGFja2FnZQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwb3J0c1tdID0gYmQuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvL1RPRE8gbWFrZSBzdXJlIHRoYXQgd2Ugc3VwcG9ydCBhbGwgdGhlIHJlZmluZW1lbnQgb24gdGhlIGV4cG9ydHMKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfSkFWQV9QQUNLQUdFLCBleHBvcnRzW2ldLmdldE5hbWUoKSwgZXhwb3J0c1tpXS5nZXRWZXJzaW9uKCkgPT0gVmVyc2lvbi5lbXB0eVZlcnNpb24gPyBudWxsIDogZXhwb3J0c1tpXS5nZXRWZXJzaW9uKCkpKTsKLQkJfQotCQkvLyBIZXJlIHdlIGFkZCBhIGJ1bmRsZSBjYXBhYmlsaXR5IHRvIGlkZW50aWZ5IGJ1bmRsZXMKLQkJaWYgKGlzQmluYXJ5QnVuZGxlKQotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKEJVTkRMRV9DQVBBQklMSVRZKTsKLQkJZWxzZQotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKFNPVVJDRV9CVU5ETEVfQ0FQQUJJTElUWSk7Ci0KLQkJaWYgKGlzRnJhZ21lbnQpCi0JCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX09TR0lfRlJBR01FTlQsIGJkLmdldEhvc3QoKS5nZXROYW1lKCksIGJkLmdldFZlcnNpb24oKSkpOwotCi0JCWlmIChtYW5pZmVzdExvY2FsaXphdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWFuaWZlc3RMb2NhbGl6YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBpdGVyLm5leHQoKTsKLQkJCQlQcm9wZXJ0aWVzIHRyYW5zbGF0ZWRTdHJpbmdzID0gKFByb3BlcnRpZXMpIG1hbmlmZXN0TG9jYWxpemF0aW9ucy5nZXQobG9jYWxlKTsKLQkJCQlFbnVtZXJhdGlvbiBwcm9wZXJ0eUtleXMgPSB0cmFuc2xhdGVkU3RyaW5ncy5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQkJd2hpbGUgKHByb3BlcnR5S2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlTdHJpbmcgbmV4dEtleSA9IChTdHJpbmcpIHByb3BlcnR5S2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCQlpdS5zZXRQcm9wZXJ0eShsb2NhbGUudG9TdHJpbmcoKSArICcuJyArIG5leHRLZXksIHRyYW5zbGF0ZWRTdHJpbmdzLmdldFByb3BlcnR5KG5leHRLZXkpKTsKLQkJCQl9Ci0JCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKG1ha2VUcmFuc2xhdGlvbkNhcGFiaWxpdHkoYmQuZ2V0U3ltYm9saWNOYW1lKCksIGxvY2FsZSkpOwotCQkJfQotCQl9Ci0KLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKChQcm92aWRlZENhcGFiaWxpdHlbXSkgcHJvdmlkZWRDYXBhYmlsaXRpZXMudG9BcnJheShuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W3Byb3ZpZGVkQ2FwYWJpbGl0aWVzLnNpemUoKV0pKTsKLQotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX09TR0kpOwotCi0JCS8vIFNldCBjZXJ0YWluIHByb3BlcnRpZXMgZnJvbSB0aGUgbWFuaWZlc3QgaGVhZGVyIGF0dHJpYnV0ZXMgYXMgSVUgcHJvcGVydGllcy4KLQkJLy8gVGhlIHZhbHVlcyBvZiB0aGVzZSBhdHRyaWJ1dGVzIG1heSBiZSBsb2NhbGl6ZWQgKHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCAnJScpCi0JCS8vIHdpdGggdGhlIHRyYW5zbGF0ZWQgdmFsdWVzIGFwcGVhcmluZyBpbiB0aGUgbG9jYWxpemF0aW9uIElVIGZyYWdtZW50cwotCQkvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1bmRsZSBJVS4KLQkJaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgQlVORExFX0lVX1BST1BFUlRZX01BUC5sZW5ndGgpIHsKLQkJCQlpZiAobWFuaWZlc3QuY29udGFpbnNLZXkoQlVORExFX0lVX1BST1BFUlRZX01BUFtpXSkpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KEJVTkRMRV9JVV9QUk9QRVJUWV9NQVBbaV0pOwotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWl1LnNldFByb3BlcnR5KEJVTkRMRV9JVV9QUk9QRVJUWV9NQVBbaSArIDFdLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaSArPSAyOwotCQkJfQotCQl9Ci0KLQkJLy8gRGVmaW5lIHRoZSBpbW11dGFibGUgbWV0YWRhdGEgZm9yIHRoaXMgSVUuIEluIHRoaXMgY2FzZSBpbW11dGFibGUgbWVhbnMKLQkJLy8gdGhhdCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgbm90IGltcGFjdCB0aGUgY29uZmlndXJhdGlvbi4KLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKGlzRm9sZGVyUGx1Z2luKQotCQkJdG91Y2hwb2ludERhdGEucHV0KCJ6aXBwZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJtYW5pZmVzdCIsIHRvTWFuaWZlc3RTdHJpbmcobWFuaWZlc3QpKTsgLy8kTk9OLU5MUy0xJAotCQlpdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhvc3RMb2NhbGl6YXRpb25GcmFnbWVudChJSW5zdGFsbGFibGVVbml0IGJ1bmRsZUlVLCBCdW5kbGVEZXNjcmlwdGlvbiBiZCwgU3RyaW5nIGhvc3RJZCwgU3RyaW5nW10gaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzLCBTZXQgbG9jYWxpemF0aW9uSVVzKSB7Ci0JCU1hcCBob3N0TG9jYWxpemF0aW9ucyA9IGdldEhvc3RMb2NhbGl6YXRpb25zKG5ldyBGaWxlKGJkLmdldExvY2F0aW9uKCkpLCBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMpOwotCQlpZiAoaG9zdExvY2FsaXphdGlvbnMgIT0gbnVsbCkgewotCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGxvY2FsaXphdGlvbkZyYWdtZW50ID0gY3JlYXRlTG9jYWxpemF0aW9uRnJhZ21lbnRPZkhvc3QoYmQsIGhvc3RJZCwgaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzLCBob3N0TG9jYWxpemF0aW9ucyk7Ci0JCQlsb2NhbGl6YXRpb25JVXMuYWRkKGxvY2FsaXphdGlvbkZyYWdtZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHBhcmFtIGhvc3RJZAotCSAqIEBwYXJhbSBiZAotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiBAcGFyYW0gbG9jYWxpemVkU3RyaW5ncwotCSAqIEByZXR1cm4gaW5zdGFsbGFibGVVbml0RnJhZ21lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgY3JlYXRlTG9jYWxpemF0aW9uRnJhZ21lbnRPZkhvc3QoQnVuZGxlRGVzY3JpcHRpb24gYmQsIFN0cmluZyBob3N0SWQsIFN0cmluZ1tdIGhvc3RNYW5pZmVzdFZhbHVlcywgTWFwIGhvc3RMb2NhbGl6YXRpb25zKSB7Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gZnJhZ21lbnQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGZyYWdtZW50SWQgPSBtYWtlSG9zdExvY2FsaXphdGlvbkZyYWdtZW50SWQoYmQuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlmcmFnbWVudC5zZXRJZChmcmFnbWVudElkKTsKLQkJZnJhZ21lbnQuc2V0VmVyc2lvbihiZC5nZXRWZXJzaW9uKCkpOyAvLyBUT0RPOiBpcyB0aGlzIGEgbWVhbmluZ2Z1bCB2ZXJzaW9uPwotCi0JCUhvc3RTcGVjaWZpY2F0aW9uIGhvc3RTcGVjID0gYmQuZ2V0SG9zdCgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSBob3N0UmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaG9zdFNwZWMuZ2V0TmFtZSgpLCBob3N0U3BlYy5nZXRWZXJzaW9uUmFuZ2UoKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9OwotCQlmcmFnbWVudC5zZXRIb3N0KGhvc3RSZXFzKTsKLQotCQlmcmFnbWVudC5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCWZyYWdtZW50LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcHJvdmlkZWQgY2FwYWJpbGl0eSBmb3IgZWFjaCBsb2NhbGUgYW5kIGFkZCB0aGUgdHJhbnNsYXRlZCBwcm9wZXJ0aWVzLgotCQlBcnJheUxpc3QgcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KGhvc3RMb2NhbGl6YXRpb25zLmtleVNldCgpLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGhvc3RMb2NhbGl6YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGl0ZXIubmV4dCgpOwotCQkJUHJvcGVydGllcyB0cmFuc2xhdGVkU3RyaW5ncyA9IChQcm9wZXJ0aWVzKSBob3N0TG9jYWxpemF0aW9ucy5nZXQobG9jYWxlKTsKLQotCQkJRW51bWVyYXRpb24gcHJvcGVydHlLZXlzID0gdHJhbnNsYXRlZFN0cmluZ3MucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKHByb3BlcnR5S2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBuZXh0S2V5ID0gKFN0cmluZykgcHJvcGVydHlLZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkJZnJhZ21lbnQuc2V0UHJvcGVydHkobG9jYWxlLnRvU3RyaW5nKCkgKyAnLicgKyBuZXh0S2V5LCB0cmFuc2xhdGVkU3RyaW5ncy5nZXRQcm9wZXJ0eShuZXh0S2V5KSk7Ci0JCQl9Ci0JCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQobWFrZVRyYW5zbGF0aW9uQ2FwYWJpbGl0eShob3N0SWQsIGxvY2FsZSkpOwotCQl9Ci0JCWZyYWdtZW50LnNldENhcGFiaWxpdGllcygoUHJvdmlkZWRDYXBhYmlsaXR5W10pIHByb3ZpZGVkQ2FwYWJpbGl0aWVzLnRvQXJyYXkobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtwcm92aWRlZENhcGFiaWxpdGllcy5zaXplKCldKSk7Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChmcmFnbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiB0aGUgaWQgZm9yIHRoZSBpdSBmcmFnbWVudCBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcwotCSAqIAkJICAgZm9yIHRoZSBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQkvLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUJ1bmRsZUxvY2FsaXphdGlvbkZyYWdtZW50SWQoU3RyaW5nIGlkKSB7Ci0JLy8JCXJldHVybiBpZCArICIudHJhbnNsYXRlZF9wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCS8vCX0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBpZCBmb3IgdGhlIGl1IGZyYWdtZW50IGNvbnRhaW5pbmcgbG9jYWxpemVkIHByb3BlcnRpZXMKLQkgKiAJCSAgIGZvciB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VIb3N0TG9jYWxpemF0aW9uRnJhZ21lbnRJZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGlkICsgIi50cmFuc2xhdGVkX2hvc3RfcHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgbWFrZVRyYW5zbGF0aW9uQ2FwYWJpbGl0eShTdHJpbmcgaG9zdElkLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KE5BTUVTUEFDRV9JVV9MT0NBTElaQVRJT04sIGxvY2FsZS50b1N0cmluZygpLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJVSBjb3JyZXNwb25kaW5nIHRvIGFuIHVwZGF0ZSBzaXRlIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGZlYXR1cmVJVXMgVGhlIElVcyBvZiB0aGUgZmVhdHVyZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGNhdGVnb3J5Ci0JICogQHBhcmFtIHBhcmVudENhdGVnb3J5IFRoZSBwYXJlbnQgY2F0ZWdvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhbiBJVSByZXByZXNlbnRpbmcgdGhlIGNhdGVnb3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUNhdGVnb3J5SVUoU2l0ZUNhdGVnb3J5IGNhdGVnb3J5LCBTZXQgZmVhdHVyZUlVcywgSUluc3RhbGxhYmxlVW5pdCBwYXJlbnRDYXRlZ29yeSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBjYXQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWNhdC5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCWNhdC5zZXRJZChjYXRlZ29yeS5nZXROYW1lKCkpOwotCQljYXQuc2V0VmVyc2lvbihWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JCWNhdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgY2F0ZWdvcnkuZ2V0TGFiZWwoKSk7Ci0JCWNhdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04sIGNhdGVnb3J5LmdldERlc2NyaXB0aW9uKCkpOwotCi0JCUFycmF5TGlzdCByZXFzQ29uZmlndXJhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlSVVzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlSVVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJVmVyc2lvblJhbmdlIHJhbmdlID0gbmV3IFZlcnNpb25SYW5nZShpdS5nZXRWZXJzaW9uKCksIHRydWUsIGl1LmdldFZlcnNpb24oKSwgdHJ1ZSk7Ci0JCQlyZXFzQ29uZmlndXJhdGlvblVuaXRzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBpdS5nZXRJZCgpLCByYW5nZSwgaXUuZ2V0RmlsdGVyKCksIGZhbHNlLCBmYWxzZSkpOwotCQl9Ci0JCS8vbm90ZSB0aGF0IHVwZGF0ZSBzaXRlcyBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBuZXN0ZWQgY2F0ZWdvcmllcywgYnV0IGl0IG1heSBiZSB1c2VmdWwgdG8gYWRkIGluIHRoZSBmdXR1cmUKLQkJaWYgKHBhcmVudENhdGVnb3J5ICE9IG51bGwpIHsKLQkJCXJlcXNDb25maWd1cmF0aW9uVW5pdHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIHBhcmVudENhdGVnb3J5LmdldElkKCksIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBwYXJlbnRDYXRlZ29yeS5nZXRGaWx0ZXIoKSwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQkJY2F0LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVxc0NvbmZpZ3VyYXRpb25Vbml0cy50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxc0NvbmZpZ3VyYXRpb25Vbml0cy5zaXplKCldKSk7Ci0JCWNhdC5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBjYXRlZ29yeS5nZXROYW1lKCksIFZlcnNpb24uZW1wdHlWZXJzaW9uKX0pOwotCQljYXQuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbMF0pOwotCQljYXQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfQ0FURUdPUlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY2F0KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gY29uZmlnSW5mbywgYm9vbGVhbiBpc0J1bmRsZUZyYWdtZW50KSB7Ci0JCWlmIChjb25maWdJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgY29uZmlnU2NyaXB0ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAoIWlzQnVuZGxlRnJhZ21lbnQgJiYgY29uZmlnSW5mby5nZXRTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkgewotCQkJY29uZmlnU2NyaXB0ICs9ICJzZXRTdGFydExldmVsKHN0YXJ0TGV2ZWw6IiArIGNvbmZpZ0luZm8uZ2V0U3RhcnRMZXZlbCgpICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKCFpc0J1bmRsZUZyYWdtZW50ICYmIGNvbmZpZ0luZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkgewotCQkJY29uZmlnU2NyaXB0ICs9ICJtYXJrU3RhcnRlZChzdGFydGVkOiB0cnVlKTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoY29uZmlnSW5mby5nZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoKSAhPSBudWxsKSB7Ci0JCQljb25maWdTY3JpcHQgKz0gY29uZmlnSW5mby5nZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoKTsKLQkJfQotCi0JCXJldHVybiBjb25maWdTY3JpcHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZURlZmF1bHRCdW5kbGVDb25maWdTY3JpcHQoR2VuZXJhdG9yQnVuZGxlSW5mbyBjb25maWdJbmZvKSB7Ci0JCXJldHVybiBjcmVhdGVDb25maWdTY3JpcHQoY29uZmlnSW5mbywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlndXJhdGlvblVuaXQoR2VuZXJhdG9yQnVuZGxlSW5mbyBjb25maWdJbmZvLCBHZW5lcmF0b3JCdW5kbGVJbmZvIHVuY29uZmlnSW5mbywgU3RyaW5nIGNvbmZpZ3VyYXRpb25GbGF2b3IpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdVbml0SWQgPSBjcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKE9TR0lfQlVORExFX0NMQVNTSUZJRVIsIGNvbmZpZ3VyYXRpb25GbGF2b3IpOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQlWZXJzaW9uIGNvbmZpZ1VuaXRWZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0JCWN1LnNldFZlcnNpb24oY29uZmlnVW5pdFZlcnNpb24pOwotCi0JCS8vIEFkZCBjYXBhYmlsaXRpZXMgZm9yIGZyYWdtZW50LCBzZWxmLCBhbmQgZGVzY3JpYmluZyB0aGUgZmxhdm9yIHN1cHBvcnRlZAotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIGNvbmZpZ1VuaXRWZXJzaW9uKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9GTEFWT1IsIGNvbmZpZ3VyYXRpb25GbGF2b3IsIG5ldyBWZXJzaW9uKDEsIDAsIDApKX0pOwotCi0JCS8vIENyZWF0ZSBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgb24gYnVuZGxlcwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFzID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KE5BTUVTUEFDRV9FQ0xJUFNFX1RZUEUsIFRZUEVfRUNMSVBTRV9CVU5ETEUsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpfTsKLQkJY3Uuc2V0SG9zdChyZXFzKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsICJ1bmluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJjb25maWd1cmUiLCBjcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlnU2NyaXB0KGNvbmZpZ0luZm8pKTsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgY3JlYXRlRGVmYXVsdEJ1bmRsZVVuY29uZmlnU2NyaXB0KHVuY29uZmlnSW5mbykpOyAvLyROT04tTkxTLTEkCi0KLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVmYXVsdEJ1bmRsZVVuY29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gdW5jb25maWdJbmZvKSB7Ci0JCXJldHVybiBjcmVhdGVVbmNvbmZpZ1NjcmlwdCh1bmNvbmZpZ0luZm8sIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkZsYXZvciArICIuIiArIGNsYXNzaWZpZXIgKyAiLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdEZlYXR1cmVDb25maWd1cmF0aW9uVW5pdChTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIsIGNvbmZpZ3VyYXRpb25GbGF2b3IpOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQlWZXJzaW9uIGNvbmZpZ1VuaXRWZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0JCWN1LnNldFZlcnNpb24oY29uZmlnVW5pdFZlcnNpb24pOwotCi0JCS8vIEFkZCBjYXBhYmlsaXRpZXMgZm9yIGZyYWdtZW50LCBzZWxmLCBhbmQgZGVzY3JpYmluZyB0aGUgZmxhdm9yIHN1cHBvcnRlZAotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIGNvbmZpZ1VuaXRWZXJzaW9uKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9GTEFWT1IsIGNvbmZpZ3VyYXRpb25GbGF2b3IsIG5ldyBWZXJzaW9uKDEsIDAsIDApKX0pOwotCi0JCS8vIENyZWF0ZSBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgb24gZmVhdHVyZXMKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfRkVBVFVSRSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIHRydWUsIGZhbHNlKX07Ci0JCWN1LnNldEhvc3QocmVxcyk7Ci0KLQkJY3Uuc2V0RmlsdGVyKElOU1RBTExfRkVBVFVSRVNfRklMVEVSKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgImluc3RhbGxGZWF0dXJlKGZlYXR1cmU6JHthcnRpZmFjdH0sZmVhdHVyZUlkOmRlZmF1bHQsZmVhdHVyZVZlcnNpb246ZGVmYXVsdCkiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAidW5pbnN0YWxsRmVhdHVyZShmZWF0dXJlOiR7YXJ0aWZhY3R9LGZlYXR1cmVJZDpkZWZhdWx0LGZlYXR1cmVWZXJzaW9uOmRlZmF1bHQpIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Vbml0Rm9yU291cmNlQnVuZGxlcyhTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoInNvdXJjZSIsIGNvbmZpZ3VyYXRpb25GbGF2b3IpOyAvLyROT04tTkxTLTEkCi0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCVZlcnNpb24gY29uZmlnVW5pdFZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQkJY3Uuc2V0VmVyc2lvbihjb25maWdVbml0VmVyc2lvbik7Ci0KLQkJLy8gQWRkIGNhcGFiaWxpdGllcyBmb3IgZnJhZ21lbnQsIHNlbGYsIGFuZCBkZXNjcmliaW5nIHRoZSBmbGF2b3Igc3VwcG9ydGVkCi0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgY29uZmlnVW5pdFZlcnNpb24pLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgY29uZmlndXJhdGlvbkZsYXZvciwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSBvbiBzb3VyY2UgcHJvdmlkZXJzCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX1NPVVJDRSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIHRydWUsIGZhbHNlKX07Ci0JCWN1LnNldEhvc3QocmVxcyk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgImFkZFNvdXJjZUJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsICJyZW1vdmVTb3VyY2VCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEV4dHJhUHJvcGVydGllcyhJSW5zdGFsbGFibGVVbml0IGlpdSwgUHJvcGVydGllcyBleHRyYVByb3BlcnRpZXMpIHsKLQkJaWYgKGlpdSBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdCkgewotCQkJSW5zdGFsbGFibGVVbml0IGl1ID0gKEluc3RhbGxhYmxlVW5pdCkgaWl1OwotCi0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJCWl1LnNldFByb3BlcnR5KG5hbWUsIGV4dHJhUHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRbXSBjcmVhdGVFY2xpcHNlSVUoQnVuZGxlRGVzY3JpcHRpb24gYmQsIE1hcCBtYW5pZmVzdCwgYm9vbGVhbiBpc0ZvbGRlclBsdWdpbiwgSUFydGlmYWN0S2V5IGtleSwgUHJvcGVydGllcyBleHRyYVByb3BlcnRpZXMpIHsKLQkJQXJyYXlMaXN0IGl1c0NyZWF0ZWQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBjcmVhdGVCdW5kbGVJVShiZCwgbWFuaWZlc3QsIGlzRm9sZGVyUGx1Z2luLCBrZXkpOwotCQlhZGRFeHRyYVByb3BlcnRpZXMoaXUsIGV4dHJhUHJvcGVydGllcyk7Ci0JCWl1c0NyZWF0ZWQuYWRkKGl1KTsKLQotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgKGl1c0NyZWF0ZWQudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtpdXNDcmVhdGVkLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdEtleSBjcmVhdGVGZWF0dXJlQXJ0aWZhY3RLZXkoU3RyaW5nIGZzbiwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShFQ0xJUFNFX0ZFQVRVUkVfQ0xBU1NJRklFUiwgZnNuLCBuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUZlYXR1cmVKYXJJVShGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gaXNFeHBsb2RlZCkgewotCQlyZXR1cm4gY3JlYXRlRmVhdHVyZUphcklVKGZlYXR1cmUsIGlzRXhwbG9kZWQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVGZWF0dXJlSmFySVUoRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIGlzRXhwbG9kZWQsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBnZXRUcmFuc2Zvcm1lZElkKGZlYXR1cmUuZ2V0SWQoKSwgLyppc1BsdWdpbiovZmFsc2UsIC8qaXNHcm91cCovZmFsc2UpOwotCQlpdS5zZXRJZChpZCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaXUuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihpZCwgbmV3IFZlcnNpb25SYW5nZShuZXcgVmVyc2lvbigwLCAwLCAwKSwgdHJ1ZSwgbmV3IFZlcnNpb24oZmVhdHVyZS5nZXRWZXJzaW9uKCkpLCBmYWxzZSksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCQlpZiAoZmVhdHVyZS5nZXRMaWNlbnNlKCkgIT0gbnVsbCkKLQkJCWl1LnNldExpY2Vuc2UobmV3IExpY2Vuc2UoZmVhdHVyZS5nZXRMaWNlbnNlVVJMKCksIGZlYXR1cmUuZ2V0TGljZW5zZSgpKSk7Ci0JCWlmIChmZWF0dXJlLmdldENvcHlyaWdodCgpICE9IG51bGwpCi0JCQlpdS5zZXRDb3B5cmlnaHQobmV3IENvcHlyaWdodChmZWF0dXJlLmdldENvcHlyaWdodFVSTCgpLCBmZWF0dXJlLmdldENvcHlyaWdodCgpKSk7Ci0KLQkJLy8gVGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyBhcmUgbm90IHNwZWNpZmllZCBhdCB0aGlzIGxldmVsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgZmVhdHVyZSBqYXIgdG8gYmUgYXR0cmFjdGl2ZSB0byBpbnN0YWxsLgotCi0JCWl1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1LnNldEZpbHRlcihJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUik7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQotCQlpZiAoZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlcigpICE9IG51bGwgJiYgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlcigpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBpbnN0YWxsSGFuZGxlclByb3BlcnR5ID0gImhhbmRsZXI9IiArIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXIoKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoKSAhPSBudWxsKQotCQkJCWluc3RhbGxIYW5kbGVyUHJvcGVydHkgKz0gIiwgbGlicmFyeT0iICsgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlclVSTCgpICE9IG51bGwpCi0JCQkJaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSArPSAiLCB1cmw9IiArIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJVUkwoKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpdS5zZXRQcm9wZXJ0eShFQ0xJUFNFX0lOU1RBTExfSEFORExFUl9QUk9QLCBpbnN0YWxsSGFuZGxlclByb3BlcnR5KTsKLQkJfQotCi0JCWl1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGlkLCB2ZXJzaW9uKSwgRkVBVFVSRV9DQVBBQklMSVRZLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfVVBEQVRFX0ZFQVRVUkUsIGZlYXR1cmUuZ2V0SWQoKSwgdmVyc2lvbil9KTsKLQkJaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7Y3JlYXRlRmVhdHVyZUFydGlmYWN0S2V5KGZlYXR1cmUuZ2V0SWQoKSwgdmVyc2lvbi50b1N0cmluZygpKX0pOwotCi0JCWlmIChpc0V4cGxvZGVkKSB7Ci0JCQkvLyBEZWZpbmUgdGhlIGltbXV0YWJsZSBtZXRhZGF0YSBmb3IgdGhpcyBJVS4gSW4gdGhpcyBjYXNlIGltbXV0YWJsZSBtZWFucwotCQkJLy8gdGhhdCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgbm90IGltcGFjdCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl0b3VjaHBvaW50RGF0YS5wdXQoInppcHBlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXUuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCX0KLQotCQlpZiAoZXh0cmFQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVHcm91cElVKEZlYXR1cmUgZmVhdHVyZSwgSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUpIHsKLQkJcmV0dXJuIGNyZWF0ZUdyb3VwSVUoZmVhdHVyZSwgZmVhdHVyZUlVLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlR3JvdXBJVShGZWF0dXJlIGZlYXR1cmUsIElJbnN0YWxsYWJsZVVuaXQgZmVhdHVyZUlVLCBQcm9wZXJ0aWVzIGV4dHJhUHJvcGVydGllcykgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGlkID0gZ2V0VHJhbnNmb3JtZWRJZChmZWF0dXJlLmdldElkKCksIC8qaXNQbHVnaW4qL2ZhbHNlLCAvKmlzR3JvdXAqL3RydWUpOwotCQlpdS5zZXRJZChpZCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaXUuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX05BTUUsIGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCWlmIChmZWF0dXJlLmdldExpY2Vuc2UoKSAhPSBudWxsKQotCQkJaXUuc2V0TGljZW5zZShuZXcgTGljZW5zZShmZWF0dXJlLmdldExpY2Vuc2VVUkwoKSwgZmVhdHVyZS5nZXRMaWNlbnNlKCkpKTsKLQkJaWYgKGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkgIT0gbnVsbCkKLQkJCWl1LnNldENvcHlyaWdodChuZXcgQ29weXJpZ2h0KGZlYXR1cmUuZ2V0Q29weXJpZ2h0VVJMKCksIGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkpKTsKLQkJaXUuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihpZCwgbmV3IFZlcnNpb25SYW5nZShuZXcgVmVyc2lvbigwLCAwLCAwKSwgdHJ1ZSwgbmV3IFZlcnNpb24oZmVhdHVyZS5nZXRWZXJzaW9uKCkpLCBmYWxzZSksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCi0JCUZlYXR1cmVFbnRyeSBlbnRyaWVzW10gPSBmZWF0dXJlLmdldEVudHJpZXMoKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W2VudHJpZXMubGVuZ3RoICsgMV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJVmVyc2lvblJhbmdlIHJhbmdlID0gZ2V0VmVyc2lvblJhbmdlKGVudHJpZXNbaV0pOwotCQkJcmVxdWlyZWRbaV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElVX05BTUVTUEFDRSwgZ2V0VHJhbnNmb3JtZWRJZChlbnRyaWVzW2ldLmdldElkKCksIGVudHJpZXNbaV0uaXNQbHVnaW4oKSwgLyppc0dyb3VwKi90cnVlKSwgcmFuZ2UsIGdldEZpbHRlcihlbnRyaWVzW2ldKSwgZW50cmllc1tpXS5pc09wdGlvbmFsKCksIGZhbHNlKTsKLQkJfQotCQlyZXF1aXJlZFtlbnRyaWVzLmxlbmd0aF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElVX05BTUVTUEFDRSwgZmVhdHVyZUlVLmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2UoZmVhdHVyZUlVLmdldFZlcnNpb24oKSwgdHJ1ZSwgZmVhdHVyZUlVLmdldFZlcnNpb24oKSwgdHJ1ZSksIElOU1RBTExfRkVBVFVSRVNfRklMVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKFRvdWNocG9pbnRUeXBlLk5PTkUpOwotCQlpdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9HUk9VUCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQkvLyBUT0RPOiBzaG91bGRuJ3QgdGhlIGZpbHRlciBmb3IgdGhlIGdyb3VwIGJlIGNvbnN0cnVjdGVkIGZyb20gb3MsIHdzLCBhcmNoLCBubAotCQkvLyAJCSBvZiB0aGUgZmVhdHVyZT8KLQkJLy8gaXUuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWl1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGlkLCB2ZXJzaW9uKX0pOwotCi0JCWlmIChleHRyYVByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZSA9IGV4dHJhUHJvcGVydGllcy5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJCWl1LnNldFByb3BlcnR5KG5hbWUsIGV4dHJhUHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBJVXMgYW5kIGFydGlmYWN0IGRlc2NyaXB0b3JzIGZvciB0aGUgSlJFLiAgVGhlIHJlc3VsdGluZyBJVXMgYXJlIGFkZGVkCi0JICogdG8gdGhlIGdpdmVuIHNldCwgYW5kIHRoZSByZXN1bHRpbmcgYXJ0aWZhY3QgZGVzY3JpcHRvciwgaWYgYW55LCBpcyByZXR1cm5lZC4KLQkgKiBJZiB0aGUganJlTG9jYXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4sIGRlZmF1bHQgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0RGVzY3JpcHRvciBjcmVhdGVKUkVEYXRhKEZpbGUganJlTG9jYXRpb24sIFNldCByZXN1bHRhbnRJVXMpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbihmYWxzZSk7Ci0JCVN0cmluZyBpZCA9ICJhLmpyZSI7IC8vJE5PTi1OTFMtMSQKLQkJVmVyc2lvbiB2ZXJzaW9uID0gREVGQVVMVF9KUkVfVkVSU0lPTjsKLQkJaXUuc2V0SWQoaWQpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX05BVElWRSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdJZCA9ICJjb25maWcuIiArIGlkOy8vJE5PTi1OTFMtMSQKLQkJY3Uuc2V0SWQoY29uZmlnSWQpOwotCQljdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaWQsIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbk1heCwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnSWQsIHZlcnNpb24pfSk7Ci0JCWN1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZiAoanJlTG9jYXRpb24gPT0gbnVsbCB8fCAhanJlTG9jYXRpb24uZXhpc3RzKCkpIHsKLQkJCS8vc2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cwotCQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJCWl1LnNldENhcGFiaWxpdGllcyhnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoaWQsIHZlcnNpb24sIG51bGwpKTsKLQkJCXJlc3VsdGFudElVcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSkpOwotCi0JCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCQlyZXN1bHRhbnRJVXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWdlbmVyYXRlSlJFSVVEYXRhKGl1LCBpZCwgdmVyc2lvbiwganJlTG9jYXRpb24pOwotCi0JCS8vR2VuZXJhdGUgYXJ0aWZhY3QgZm9yIEpSRQotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KEJJTkFSWV9BUlRJRkFDVF9DTEFTU0lGSUVSLCBpZCwgdmVyc2lvbik7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCQlyZXN1bHRhbnRJVXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpKTsKLQotCQkvL0NyZWF0ZSBjb25maWcgaW5mbyBmb3IgdGhlIENVCi0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXN1bHRhbnRJVXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpKTsKLQotCQkvL0NyZWF0ZSB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvcgotCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGtleSwganJlTG9jYXRpb24sIGZhbHNlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0S2V5IGNyZWF0ZUxhdW5jaGVyQXJ0aWZhY3RLZXkoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShCSU5BUllfQVJUSUZBQ1RfQ0xBU1NJRklFUiwgaWQsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgSVVzIGFuZCBhcnRpZmFjdHMgZm9yIHRoZSBMYXVuY2hlciBleGVjdXRhYmxlLiBUaGUgcmVzdWx0aW5nIElVcyBhcmUgYWRkZWQKLQkgKiB0byB0aGUgZ2l2ZW4gc2V0LCBhbmQgdGhlIHJlc3VsdGluZyBhcnRpZmFjdCBkZXNjcmlwdG9yIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0RGVzY3JpcHRvciBjcmVhdGVMYXVuY2hlcklVKEZpbGUgbGF1bmNoZXIsIFN0cmluZyBjb25maWd1cmF0aW9uRmxhdm9yLCBTZXQgcmVzdWx0YW50SVVzKSB7Ci0JCWlmIChsYXVuY2hlciA9PSBudWxsIHx8ICFsYXVuY2hlci5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vQ3JlYXRlIHRoZSBJVQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0U2luZ2xldG9uKHRydWUpOwotCQlTdHJpbmcgbGF1bmNoZXJJZCA9IExBVU5DSEVSX0lEX1BSRUZJWCArICdfJyArIGxhdW5jaGVyLmdldE5hbWUoKTsKLQkJaXUuc2V0SWQobGF1bmNoZXJJZCk7Ci0JCWl1LnNldFZlcnNpb24oTEFVTkNIRVJfVkVSU0lPTik7Ci0KLQkJSUFydGlmYWN0S2V5IGtleSA9IGNyZWF0ZUxhdW5jaGVyQXJ0aWZhY3RLZXkobGF1bmNoZXJJZCwgTEFVTkNIRVJfVkVSU0lPTik7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShsYXVuY2hlcklkLCBMQVVOQ0hFUl9WRVJTSU9OKX0pOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX05BVElWRSk7Ci0JCXJlc3VsdGFudElVcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSkpOwotCi0JCS8vQ3JlYXRlIHRoZSBDVQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNvbmZpZ3VyYXRpb25GbGF2b3IgKyBsYXVuY2hlcklkOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQljdS5zZXRWZXJzaW9uKExBVU5DSEVSX1ZFUlNJT04pOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbGF1bmNoZXJJZCwgbmV3IFZlcnNpb25SYW5nZShMQVVOQ0hFUl9WRVJTSU9OLCB0cnVlLCB2ZXJzaW9uTWF4LCB0cnVlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0pOwotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIExBVU5DSEVSX1ZFUlNJT04pfSk7Ci0JCWN1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gInVuemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVudmlyb25tZW50SW5mby5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoIWluZm8uZ2V0T1MoKS5lcXVhbHMob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMikpIHsKLQkJCWlmIChpbmZvLmdldE9TKCkuZXF1YWxzKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfTUFDT1NYKSkgewotCQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICIgY2htb2QodGFyZ2V0RGlyOiR7aW5zdGFsbEZvbGRlcn0vRWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MsIHRhcmdldEZpbGU6ZWNsaXBzZSwgcGVybWlzc2lvbnM6NzU1KTsiOyAvLyROT04tTkxTLTEkCi0JCQkJZ2VuZXJhdGVMYXVuY2hlclNldHRlcigiRWNsaXBzZSIsIGxhdW5jaGVySWQsIExBVU5DSEVSX1ZFUlNJT04sICJtYWNvc3giLCBudWxsLCBudWxsLCByZXN1bHRhbnRJVXMpOwotCQkJfSBlbHNlCi0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfSwgdGFyZ2V0RmlsZToiICsgbGF1bmNoZXIuZ2V0TmFtZSgpICsgIiwgcGVybWlzc2lvbnM6NzU1KTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYXRlTGF1bmNoZXJTZXR0ZXIoImVjbGlwc2UiLCBsYXVuY2hlcklkLCBMQVVOQ0hFUl9WRVJTSU9OLCAid2luMzIiLCBudWxsLCBudWxsLCByZXN1bHRhbnRJVXMpOwotCQl9Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsIGNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5Db25maWd1cmF0aW9uRGF0YSA9ICJjbGVhbnVwemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgdW5Db25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJlc3VsdGFudElVcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KGN1KSk7Ci0KLQkJLy9DcmVhdGUgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IKLQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXksIGxhdW5jaGVyLCBmYWxzZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlTGF1bmNoZXJTZXR0ZXIoU3RyaW5nIGxhdW5jaGVyTmFtZSwgU3RyaW5nIGl1SWQsIFZlcnNpb24gdmVyc2lvbiwgU3RyaW5nIG9zLCBTdHJpbmcgd3MsIFN0cmluZyBhcmNoLCBTZXQgcmVzdWx0KSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ZCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXVkLnNldElkKGl1SWQgKyAnLicgKyBsYXVuY2hlck5hbWUpOwotCQlpdWQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaXVkLnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfT1NHSSk7Ci0KLQkJaWYgKG9zICE9IG51bGwgfHwgd3MgIT0gbnVsbCB8fCBhcmNoICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWx0ZXJPcyA9IG9zICE9IG51bGwgPyAiKG9zPSIgKyBvcyArICIpIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGZpbHRlcldzID0gd3MgIT0gbnVsbCA/ICIod3M9IiArIHdzICsgIikiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTdHJpbmcgZmlsdGVyQXJjaCA9IGFyY2ggIT0gbnVsbCA/ICIoYXJjaD0iICsgYXJjaCArICIpIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJaXVkLnNldEZpbHRlcigiKCYgIiArIGZpbHRlck9zICsgZmlsdGVyV3MgKyBmaWx0ZXJBcmNoICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJjb25maWd1cmUiLCAic2V0TGF1bmNoZXJOYW1lKG5hbWU6IiArIGxhdW5jaGVyTmFtZSArICIpIik7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5jb25maWd1cmUiLCAic2V0TGF1bmNoZXJOYW1lKCkiKTsKLQkJaXVkLmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXN1bHQuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXVkKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgY3JlYXRlU2VsZkNhcGFiaWxpdHkoU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSVVfTkFNRVNQQUNFLCBpbnN0YWxsYWJsZVVuaXRJZCwgaW5zdGFsbGFibGVVbml0VmVyc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuY29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gdW5jb25maWdJbmZvLCBib29sZWFuIGlzQnVuZGxlRnJhZ21lbnQpIHsKLQkJaWYgKHVuY29uZmlnSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bmNvbmZpZ1NjcmlwdCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKCFpc0J1bmRsZUZyYWdtZW50ICYmIHVuY29uZmlnSW5mby5nZXRTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gInNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbDoiICsgQnVuZGxlSW5mby5OT19MRVZFTCArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghaXNCdW5kbGVGcmFnbWVudCAmJiB1bmNvbmZpZ0luZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gIm1hcmtTdGFydGVkKHN0YXJ0ZWQ6IGZhbHNlKTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAodW5jb25maWdJbmZvLmdldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCkgIT0gbnVsbCkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gdW5jb25maWdJbmZvLmdldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCk7Ci0JCX0KLQkJcmV0dXJuIHVuY29uZmlnU2NyaXB0OwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2VuZXJhdGVKUkVDYXBhYmlsaXR5KFN0cmluZyBpbnN0YWxsYWJsZVVuaXRJZCwgVmVyc2lvbiBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uLCBJbnB1dFN0cmVhbSBwcm9maWxlU3RyZWFtKSB7Ci0JCWlmIChwcm9maWxlU3RyZWFtID09IG51bGwpIHsKLQkJCS8vdXNlIHRoZSAxLjYgcHJvZmlsZSBzdG9yZWQgaW4gdGhlIGdlbmVyYXRvciBidW5kbGUKLQkJCXRyeSB7Ci0JCQkJcHJvZmlsZVN0cmVhbSA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIkphdmFTRS0xLjYucHJvZmlsZSIpLm9wZW5TdHJlYW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlwLmxvYWQocHJvZmlsZVN0cmVhbSk7Ci0JCQlNYW5pZmVzdEVsZW1lbnRbXSBqcmVQYWNrYWdlcyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIsIChTdHJpbmcpIHAuZ2V0KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGV4cG9ydGVkUGFja2FnZUFzQ2FwYWJpbGl0aWVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtqcmVQYWNrYWdlcy5sZW5ndGggKyAxXTsKLQkJCWV4cG9ydGVkUGFja2FnZUFzQ2FwYWJpbGl0aWVzWzBdID0gY3JlYXRlU2VsZkNhcGFiaWxpdHkoaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0ganJlUGFja2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllc1tpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19KQVZBX1BBQ0tBR0UsIGpyZVBhY2thZ2VzW2kgLSAxXS5nZXRWYWx1ZSgpLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllczsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvZmlsZVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvZmlsZVN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUgc2Vjb25kYXJ5IGZhaWx1cmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBQcm92aWRlZENhcGFiaWxpdHlbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUpSRUlVRGF0YShJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSwgU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIEZpbGUganJlTG9jYXRpb24pIHsKLQkJLy9Mb29rIGZvciBhIEpSRSBwcm9maWxlIGZpbGUgdG8gc2V0IHZlcnNpb24gYW5kIGNhcGFiaWxpdGllcwotCQlGaWxlW10gcHJvZmlsZXMgPSBqcmVMb2NhdGlvbi5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiBwYXRobmFtZS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLnByb2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJaWYgKHByb2ZpbGVzLmxlbmd0aCAhPSAxKSB7Ci0JCQlpdS5zZXRWZXJzaW9uKERFRkFVTFRfSlJFX1ZFUlNJT04pOwotCQkJaXUuc2V0Q2FwYWJpbGl0aWVzKGdlbmVyYXRlSlJFQ2FwYWJpbGl0eShpbnN0YWxsYWJsZVVuaXRJZCwgaW5zdGFsbGFibGVVbml0VmVyc2lvbiwgbnVsbCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBwcm9maWxlTmFtZSA9IHByb2ZpbGVzWzBdLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhwcm9maWxlc1swXS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZignLycpKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gREVGQVVMVF9KUkVfVkVSU0lPTjsKLQkJLy9UT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSBKUkUgdmVyc2lvbgotCQlpZiAocHJvZmlsZU5hbWUuaW5kZXhPZigiMS42IikgPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbigiMS42Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9maWxlTmFtZS5pbmRleE9mKCIxLjUiKSA+IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJdmVyc2lvbiA9IG5ldyBWZXJzaW9uKCIxLjUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb2ZpbGVOYW1lLmluZGV4T2YoIjEuNCIpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQl2ZXJzaW9uID0gbmV3IFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJdHJ5IHsKLQkJCWl1LnNldENhcGFiaWxpdGllcyhnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvZmlsZXNbMF0pKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1Nob3VsZG4ndCBoYXBwZW4sIGJ1dCBpZ25vcmUgYW5kIGZhbGwgdGhyb3VnaCB0byB1c2UgZGVmYXVsdAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsdGVyKEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXN1bHQuYXBwZW5kKCIoJiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXRGaWx0ZXIoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZChlbnRyeS5nZXRGaWx0ZXIoKSk7Ci0JCWlmIChlbnRyeS5nZXRPUygpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5vcz0iICsgZW50cnkuZ2V0T1MoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0V1MoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kud3M9IiArIGVudHJ5LmdldFdTKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldEFyY2goKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kuYXJjaD0iICsgZW50cnkuZ2V0QXJjaCgpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXROTCgpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5ubD0iICsgZW50cnkuZ2V0TkwoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lmxlbmd0aCgpID09IDIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZWRJZChTdHJpbmcgb3JpZ2luYWwsIGJvb2xlYW4gaXNQbHVnaW4sIGJvb2xlYW4gaXNHcm91cCkgewotCQlyZXR1cm4gKGlzUGx1Z2luID8gb3JpZ2luYWwgOiBvcmlnaW5hbCArIChpc0dyb3VwID8gIi5mZWF0dXJlLmdyb3VwIiA6ICIuZmVhdHVyZS5qYXIiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBWZXJzaW9uUmFuZ2UgZ2V0VmVyc2lvblJhbmdlKEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlTdHJpbmcgdmVyc2lvblNwZWMgPSBlbnRyeS5nZXRWZXJzaW9uKCk7Ci0JCWlmICh2ZXJzaW9uU3BlYyA9PSBudWxsKQotCQkJLy8gVE9ETyBzaG91bGQgcmVhbGx5IGJlIHJldHVybmluZyBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSBoZXJlLi4uCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24odmVyc2lvblNwZWMpOwotCQlpZiAoIWVudHJ5LmlzUmVxdWlyZXMoKSkgewotCQkJaWYgKCIwLjAuMCIuZXF1YWxzKGVudHJ5LmdldFZlcnNpb24oKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2U7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKTsKLQkJfQotCQlTdHJpbmcgbWF0Y2ggPSBlbnRyeS5nZXRNYXRjaCgpOwotCQlpZiAobWF0Y2ggPT0gbnVsbCkKLQkJCS8vIFRPRE8gc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgaGVyZS4uLgotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChtYXRjaC5lcXVhbHMoInBlcmZlY3QiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCWlmIChtYXRjaC5lcXVhbHMoImVxdWl2YWxlbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlWZXJzaW9uIHVwcGVyID0gbmV3IFZlcnNpb24odmVyc2lvbi5nZXRNYWpvcigpLCB2ZXJzaW9uLmdldE1pbm9yKCkgKyAxLCAwKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHVwcGVyLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKG1hdGNoLmVxdWFscygiY29tcGF0aWJsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVZlcnNpb24gdXBwZXIgPSBuZXcgVmVyc2lvbih2ZXJzaW9uLmdldE1ham9yKCkgKyAxLCAwLCAwKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHVwcGVyLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKG1hdGNoLmVxdWFscygiZ3JlYXRlck9yRXF1YWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgbmV3IFZlcnNpb25SYW5nZShudWxsKS5nZXRNYXhpbXVtKCksIHRydWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT3B0aW9uYWwoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24gaW1wb3J0ZWRQYWNrYWdlKSB7Ci0JCWlmIChpbXBvcnRlZFBhY2thZ2UuZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSkuZXF1YWxzKEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uLlJFU09MVVRJT05fRFlOQU1JQykgfHwgaW1wb3J0ZWRQYWNrYWdlLmdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpLmVxdWFscyhJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbi5SRVNPTFVUSU9OX09QVElPTkFMKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvTWFuaWZlc3RTdHJpbmcoTWFwIHApIHsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb2xsZWN0aW9uIHByb3BlcnRpZXMgPSBwLmVudHJ5U2V0KCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBhUHJvcGVydHkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYVByb3BlcnR5LmdldEtleSgpLmVxdWFscyhCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuQlVORExFX0ZJTEVfS0VZKSkKLQkJCQljb250aW51ZTsKLQkJCXJlc3VsdC5hcHBlbmQoYVByb3BlcnR5LmdldEtleSgpKS5hcHBlbmQoIjogIikuYXBwZW5kKGFQcm9wZXJ0eS5nZXRWYWx1ZSgpKS5hcHBlbmQoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gUmV0dXJuIGEgbWFwIGZyb20gbG9jYWxlIHRvIHByb3BlcnR5IHNldCBmb3IgdGhlIG1hbmlmZXN0IGxvY2FsaXphdGlvbnMKLQkvLyBmcm9tIHRoZSBnaXZlbiBidW5kbGUgZGlyZWN0b3J5IGFuZCBnaXZlbiBidW5kbGUgbG9jYWxpemF0aW9uIHBhdGgvbmFtZQotCS8vIG1hbmlmZXN0IHByb3BlcnR5IHZhbHVlLgotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRNYW5pZmVzdExvY2FsaXphdGlvbnMoTWFwIG1hbmlmZXN0LCBGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCU1hcCBsb2NhbGl6YXRpb25zOwotCQlMb2NhbGUgZGVmYXVsdExvY2FsZSA9IG51bGw7IC8vID0gTG9jYWxlLkVOR0xJU0g7IC8vIFRPRE86IGdldCB0aGlzIGZyb20gR2VuZXJhdG9ySW5mbwotCQlTdHJpbmdbXSBidW5kbGVNYW5pZmVzdFZhbHVlcyA9IGdldE1hbmlmZXN0Q2FjaGVkVmFsdWVzKG1hbmlmZXN0KTsKLQkJU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiA9IGJ1bmRsZU1hbmlmZXN0VmFsdWVzW0JVTkRMRV9MT0NBTElaQVRJT05fSU5ERVhdOwotCi0JCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKG5ldyBQYXRoKGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJYnVuZGxlTG9jYXRpb24uaXNGaWxlKCkpIHsKLQkJCWxvY2FsaXphdGlvbnMgPSBnZXRKYXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uLCBkZWZhdWx0TG9jYWxlLCBidW5kbGVNYW5pZmVzdFZhbHVlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2NhbGl6YXRpb25zID0gZ2V0RGlyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbiwgZGVmYXVsdExvY2FsZSwgYnVuZGxlTWFuaWZlc3RWYWx1ZXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRNYW5pZmVzdENhY2hlZFZhbHVlcyhNYXAgbWFuaWZlc3QpIHsKLQkJU3RyaW5nW10gY2FjaGVkVmFsdWVzID0gbmV3IFN0cmluZ1tCVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVMubGVuZ3RoICsgMV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTLmxlbmd0aDsgaisrKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTW2pdKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMSAmJiB2YWx1ZS5jaGFyQXQoMCkgPT0gJyUnKSB7Ci0JCQkJY2FjaGVkVmFsdWVzW2pdID0gdmFsdWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBsb2NhbGl6YXRpb25GaWxlID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTik7Ci0JCWNhY2hlZFZhbHVlc1tCVU5ETEVfTE9DQUxJWkFUSU9OX0lOREVYXSA9IChsb2NhbGl6YXRpb25GaWxlICE9IG51bGwgPyBsb2NhbGl6YXRpb25GaWxlIDogREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OKTsKLQkJcmV0dXJuIGNhY2hlZFZhbHVlczsKLQl9Ci0KLQkvLyBSZXR1cm4gYSBtYXAgZnJvbSBsb2NhbGUgdG8gcHJvcGVydHkgc2V0IGZvciB0aGUgbWFuaWZlc3QgbG9jYWxpemF0aW9ucwotCS8vIGZyb20gdGhlIGdpdmVuIGJ1bmRsZSBkaXJlY3RvcnkgYW5kIGdpdmVuIGJ1bmRsZSBsb2NhbGl6YXRpb24gcGF0aC9uYW1lCi0JLy8gbWFuaWZlc3QgcHJvcGVydHkgdmFsdWUuCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0SG9zdExvY2FsaXphdGlvbnMoRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nW10gaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzKSB7Ci0JCU1hcCBsb2NhbGl6YXRpb25zOwotCQlMb2NhbGUgZGVmYXVsdExvY2FsZSA9IG51bGw7IC8vID0gTG9jYWxlLkVOR0xJU0g7IC8vIFRPRE86IGdldCB0aGlzIGZyb20gR2VuZXJhdG9ySW5mbwotCQlTdHJpbmcgaG9zdEJ1bmRsZUxvY2FsaXphdGlvbiA9IGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlc1tCVU5ETEVfTE9DQUxJWkFUSU9OX0lOREVYXTsKLQotCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShuZXcgUGF0aChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCWJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7Ci0JCQlsb2NhbGl6YXRpb25zID0gZ2V0SmFyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGhvc3RCdW5kbGVMb2NhbGl6YXRpb24sIGRlZmF1bHRMb2NhbGUsIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2NhbGl6YXRpb25zID0gZ2V0RGlyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGhvc3RCdW5kbGVMb2NhbGl6YXRpb24sIGRlZmF1bHRMb2NhbGUsIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0SmFyTWFuaWZlc3RMb2NhbGl6YXRpb24oRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiwgTG9jYWxlIGRlZmF1bHRMb2NhbGUsIFN0cmluZ1tdIGJ1bmRsZU1hbmlmZXN0VmFsdWVzKSB7Ci0JCVppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCU1hcCBsb2NhbGl6YXRpb25zID0gbmV3IEhhc2hNYXAoNCk7Ci0JCXRyeSB7Ci0JCQlqYXJGaWxlID0gbmV3IFppcEZpbGUoYnVuZGxlTG9jYXRpb24sIFppcEZpbGUuT1BFTl9SRUFEKTsKLQkJCWZvciAoRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOyBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVppcEVudHJ5IG5leHRFbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbnRyeS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGxvY2FsZVN0cmluZyA9IGdldExvY2FsZVN0cmluZyhuZXh0TmFtZSwgYnVuZGxlTG9jYWxpemF0aW9uKTsKLQotCQkJCWlmICghbmV4dEVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgbG9jYWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJTG9jYWxlIG5leHRMb2NhbGUgPSBnZXRMb2NhbGUobG9jYWxlU3RyaW5nKTsKLQkJCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0obmV4dEVudHJ5KTsKLQkJCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQlwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLQkJCQkJCVByb3BlcnRpZXMgbG9jYWxpemVkU3RyaW5ncyA9IGdldExvY2FsaXplZFByb3BlcnRpZXMoYnVuZGxlTWFuaWZlc3RWYWx1ZXMsIHByb3BlcnRpZXMpOwotCQkJCQkJaWYgKGxvY2FsaXplZFN0cmluZ3Muc2l6ZSgpID4gMCkgewotCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCQkJCQkJCWlmIChERUZBVUxUX0xPQ0FMRS5lcXVhbHMobmV4dExvY2FsZSkgJiYgZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChzdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoamFyRmlsZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJamFyRmlsZS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldERpck1hbmlmZXN0TG9jYWxpemF0aW9uKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24sIExvY2FsZSBkZWZhdWx0TG9jYWxlLCBTdHJpbmdbXSBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMpIHsKLQkJRmlsZSBsb2NhbGl6YXRpb25QYXRoID0gbmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbik7Ci0JCUZpbGUgbG9jYWxpemF0aW9uRGlyID0gbG9jYWxpemF0aW9uUGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCWZpbmFsIFN0cmluZyBsb2NhbGl6YXRpb25GaWxlID0gbG9jYWxpemF0aW9uUGF0aC5nZXROYW1lKCk7Ci0JCU1ldGFkYXRhR2VuZXJhdG9ySGVscGVyIGZvbyA9IG5ldyBNZXRhZGF0YUdlbmVyYXRvckhlbHBlcigpOwotCQlTdHJpbmdbXSBsb2NhbGl6YXRpb25GaWxlcyA9IGxvY2FsaXphdGlvbkRpci5saXN0KGZvby5uZXcgTG9jYWxpemF0aW9uRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCQkJcmV0dXJuIChnZXRMb2NhbGVTdHJpbmcoZmlsZW5hbWUsIGxvY2FsaXphdGlvbkZpbGUpICE9IG51bGwgPyB0cnVlIDogZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQlIYXNoTWFwIGxvY2FsaXphdGlvbnMgPSBudWxsOwotCi0JCWlmIChsb2NhbGl6YXRpb25GaWxlcyAhPSBudWxsKSB7Ci0JCQlsb2NhbGl6YXRpb25zID0gbmV3IEhhc2hNYXAobG9jYWxpemF0aW9uRmlsZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxpemF0aW9uRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmV4dEZpbGUgPSBsb2NhbGl6YXRpb25GaWxlc1tpXTsKLQkJCQlMb2NhbGUgbmV4dExvY2FsZSA9IGdldExvY2FsZShnZXRMb2NhbGVTdHJpbmcobmV4dEZpbGUsIGxvY2FsaXphdGlvbkZpbGUpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGJ1bmRsZUxvY2F0aW9uLCBuZXh0RmlsZSk7Ci0JCQkJCVByb3BlcnRpZXMgbG9jYWxpemVkU3RyaW5ncyA9IGdldExvY2FsaXplZFByb3BlcnRpZXMoaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzLCBwcm9wZXJ0aWVzKTsKLQkJCQkJaWYgKGxvY2FsaXplZFN0cmluZ3Muc2l6ZSgpID4gMCkgewotCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JCQkJCQlpZiAoREVGQVVMVF9MT0NBTEUuZXF1YWxzKG5leHRMb2NhbGUpICYmIGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgewotCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIExvY2FsaXphdGlvbkZpbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0KLQkJcHVibGljIExvY2FsaXphdGlvbkZpbGVGaWx0ZXIoKSB7Ci0JCQkvLyBOb3RoaW5nIHRvIGRvCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5pby5GaWxlbmFtZUZpbHRlciNhY2NlcHQoamF2YS5pby5GaWxlLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgZmlsZW5hbWUpOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldExvY2FsZVN0cmluZyhTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBmaWxlbmFtZVByZWZpeCkgewotCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gbnVsbDsKLQkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoZmlsZW5hbWVQcmVmaXgpICYmIGZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04pKSB7Ci0JCQlpZiAoZmlsZW5hbWUubGVuZ3RoKCkgPiBmaWxlbmFtZVByZWZpeC5sZW5ndGgoKSArIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04ubGVuZ3RoKCkpIHsKLQkJCQlsb2NhbGVTdHJpbmcgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWVQcmVmaXgubGVuZ3RoKCkgKyAxLCBmaWxlbmFtZS5sZW5ndGgoKSAtIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04ubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2NhbGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbGVTdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQlJbnB1dFN0cmVhbSBwcm9wZXJ0eVN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWlmIChidW5kbGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpKQotCQkJCQlwcm9wZXJ0eVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIGxvY2FsaXphdGlvbkZpbGUpKTsKLQkJCQllbHNlIHsKLQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTCgiamFyOiIgKyBidW5kbGVMb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIS8iICsgbG9jYWxpemF0aW9uRmlsZSkub3BlbkNvbm5lY3Rpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCQkJcHJvcGVydHlTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiB0aGVyZSBpcyBubyBtZXNzYWdlcyBmaWxlIHRoZW4ganVzdCByZXR1cm47Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXJlc3VsdC5sb2FkKHByb3BlcnR5U3RyZWFtKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwcm9wZXJ0eVN0cmVhbSAhPSBudWxsKQotCQkJCXByb3BlcnR5U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBMb2NhbGUgZ2V0TG9jYWxlKFN0cmluZyBsb2NhbGVTdHJpbmcpIHsKLQkJTG9jYWxlIGxvY2FsZSA9IERFRkFVTFRfTE9DQUxFOwotCQlpZiAobG9jYWxlU3RyaW5nLmxlbmd0aCgpID09IDUgJiYgbG9jYWxlU3RyaW5nLmluZGV4T2YoJ18nKSA9PSAyKSB7Ci0JCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMCwgMiksIGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMywgNSkpOwotCQl9IGVsc2UgaWYgKGxvY2FsZVN0cmluZy5sZW5ndGgoKSA9PSAyKSB7Ci0JCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMCwgMikpOwotCQl9Ci0JCXJldHVybiBsb2NhbGU7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgUHJvcGVydGllcyBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKFN0cmluZ1tdIGJ1bmRsZU1hbmlmZXN0S2V5cywgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVByb3BlcnRpZXMgbG9jYWxpemVkUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcga2V5ID0gYnVuZGxlTWFuaWZlc3RLZXlzW2ldOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCWlmIChsb2NhbGl6ZWRWYWx1ZSAhPSBudWxsKQotCQkJCQlsb2NhbGl6ZWRQcm9wZXJ0aWVzLnB1dChrZXksIGxvY2FsaXplZFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9jYWxpemVkUHJvcGVydGllczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL1VSTEVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9VUkxFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTkyOGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL1VSTEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjsKLQotcHVibGljIGNsYXNzIFVSTEVudHJ5IHsKLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCXB1YmxpYyBVUkxFbnRyeSgpIHsKLQl9Ci0KLQlwdWJsaWMgVVJMRW50cnkoU3RyaW5nIHVybCwgU3RyaW5nIGFubm90YXRpb24pIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbikgewotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9HZW5lcmF0b3JUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L0dlbmVyYXRvclRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlMzVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L0dlbmVyYXRvclRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yLkdlbmVyYXRvclJlc3VsdDsKLQotLyoqCi0gKiBBbiBBbnQgdGFzayB0byBjYWxsIHRoZSBwMiBNZXRhZGF0YSBHZW5lcmF0b3IgYXBwbGljYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRvclRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotCXByb3RlY3RlZCBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbiBnZW5lcmF0b3IgPSBudWxsOwotCi0Jc3RhdGljIHByaXZhdGUgR2VuZXJhdG9yUmVzdWx0IHJlc3VsdDsKLQlwcml2YXRlIFN0cmluZyBtb2RlOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmICgiaW5jcmVtZW50YWwiLmVxdWFscyhtb2RlKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBuZXcgR2VuZXJhdG9yUmVzdWx0KCk7Ci0JCQkJZ2VuZXJhdG9yLnNldEluY3JlbWVudGFsUmVzdWx0KHJlc3VsdCk7Ci0JCQkJZ2VuZXJhdG9yLnNldEdlbmVyYXRvclJvb3RJVShmYWxzZSk7Ci0JCQl9IGVsc2UgaWYgKCJmaW5hbCIuZXF1YWxzKG1vZGUpICYmIHJlc3VsdCAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZW5lcmF0b3Iuc2V0SW5jcmVtZW50YWxSZXN1bHQocmVzdWx0KTsKLQkJCQlnZW5lcmF0b3Iuc2V0R2VuZXJhdG9yUm9vdElVKHRydWUpOwotCQkJfQotCi0JCQlnZW5lcmF0b3IucnVuKHByb3ZpZGVyKTsKLQotCQkJaWYgKCEiaW5jcmVtZW50YWwiLmVxdWFscyhtb2RlKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHJvdmlkZXIgPSBudWxsOwotCQkJCWdlbmVyYXRvciA9IG51bGw7Ci0JCQkJcmVzdWx0ID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihUYXNrTWVzc2FnZXMuZXhjZXB0aW9uX2Vycm9yT2NjdXJyZWRDYWxsaW5nR2VuZXJhdG9yLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGVuZChTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlwcm92aWRlciA9IG5ldyBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRBcHBlbmQoQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpCi0JCQlnZW5lcmF0b3IgPSBuZXcgRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uKCk7Ci0JCWdlbmVyYXRvci5zZXRBcnRpZmFjdExvY2F0aW9uKGxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYXNlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpCi0JCQlnZW5lcmF0b3IgPSBuZXcgRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uKCk7Ci0JCWdlbmVyYXRvci5zZXRCYXNlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdW5kbGVzKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpCi0JCQlnZW5lcmF0b3IgPSBuZXcgRWNsaXBzZUdlbmVyYXRvckFwcGxpY2F0aW9uKCk7Ci0JCWdlbmVyYXRvci5zZXRCdW5kbGVzKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJZ2VuZXJhdG9yID0gbmV3IEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbigpOwotCQlnZW5lcmF0b3Iuc2V0Q29tcHJlc3ModmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJZ2VuZXJhdG9yID0gbmV3IEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbigpOwotCQlnZW5lcmF0b3Iuc2V0T3BlcmF0aW9uKCItY29uZmlnIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wbGFjZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJZ2VuZXJhdG9yID0gbmV3IEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbigpOwotCQlnZW5lcmF0b3Iuc2V0T3BlcmF0aW9uKCItaW5wbGFjZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJZ2VuZXJhdG9yID0gbmV3IEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbigpOwotCQlnZW5lcmF0b3Iuc2V0T3BlcmF0aW9uKCItc291cmNlIiwgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJZ2VuZXJhdG9yID0gbmV3IEVjbGlwc2VHZW5lcmF0b3JBcHBsaWNhdGlvbigpOwotCQlnZW5lcmF0b3Iuc2V0T3BlcmF0aW9uKCItdXBkYXRlIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldEV4ZWN1dGFibGVMb2NhdGlvbih2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkKLQkJCWdlbmVyYXRvciA9IG5ldyBFY2xpcHNlR2VuZXJhdG9yQXBwbGljYXRpb24oKTsKLQkJZ2VuZXJhdG9yLnNldEZlYXR1cmVzKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGbGF2b3IoU3RyaW5nIGZsYXZvcikgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcihmbGF2b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyQ29uZmlnKFN0cmluZyBsYXVuY2hlckNvbmZpZykgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldExhdW5jaGVyQ29uZmlnKGxhdW5jaGVyQ29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkKLQkJCWdlbmVyYXRvciA9IG5ldyBFY2xpcHNlR2VuZXJhdG9yQXBwbGljYXRpb24oKTsKLQkJZ2VuZXJhdG9yLnNldE1ldGFkYXRhTG9jYXRpb24obG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vRGVmYXVsdElVcyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlwcm92aWRlciA9IG5ldyBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRBZGREZWZhdWx0SVVzKCFCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQMk9TKFN0cmluZyB2YWx1ZSkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldE9TKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9kdWN0RmlsZShTdHJpbmcgZmlsZSkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFByb2R1Y3RGaWxlKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKQotCQkJcHJvdmlkZXIgPSBuZXcgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0UHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeShCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQXJ0aWZhY3RzKFN0cmluZyB2YWx1ZSkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFB1Ymxpc2hBcnRpZmFjdHMoQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdChTdHJpbmcgcm9vdCkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFJvb3RJZChyb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290VmVyc2lvbihTdHJpbmcgcm9vdFZlcnNpb24pIHsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlwcm92aWRlciA9IG5ldyBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRSb290VmVyc2lvbihyb290VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewotCQl0aGlzLm1vZGUgPSBtb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25BZHZpY2UoU3RyaW5nIGFkdmljZSkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZlcnNpb25BZHZpY2UoYWR2aWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9UYXNrTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNzEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5hbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVGFza01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZXJyb3JPY2N1cnJlZENhbGxpbmdHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Vycm9yQXJ0aWZhY3RSZXBvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9lcnJvck1ldGFkYXRhUmVwbzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBUYXNrTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Ivc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyZWIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1leGNlcHRpb25fZXJyb3JPY2N1cnJlZENhbGxpbmdHZW5lcmF0b3IgPSBBbiBlcnJvciBvY2N1cnJlZCB3aGVuIGNhbGxpbmcgZ2VuZXJhdG9yLgotZXhjZXB0aW9uX2Vycm9yQXJ0aWZhY3RSZXBvID0gRXJyb3Igc2V0dGluZyBhcnRpZmFjdCByZXBvc2l0b3J5IHswfS4KLWV4Y2VwdGlvbl9lcnJvck1ldGFkYXRhUmVwbyA9IEVycm9yIHNldHRpbmcgbWV0YWRhdGEgcmVwb3NpdG9yeSB7MH0uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiYjdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODJiYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0ZGYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotI0ZyaSBGZWIgMjIgMTE6MjI6NTkgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzU4MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU4OjIyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGQ3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wcmVmczt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLnhtbC5zYXgKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BY3RpdmF0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnksCi0gb3JnLmVjbGlwc2UuZWNmO2J1bmRsZS12ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcjtidW5kbGUtdmVyc2lvbj0iMi4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2k7YnVuZGxlLXZlcnNpb249IjMuNC4wIgotRWNsaXBzZS1CdWRkeVBvbGljeTogcmVnaXN0ZXJlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlYmExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIwOTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBNZXRhZGF0YSBSZXBvc2l0b3J5Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGI2MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtZXRhZGF0YVJlcG9zaXRvcmllcyIgbmFtZT0iTWV0YWRhdGEgUmVwb3NpdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9tZXRhZGF0YVJlcG9zaXRvcmllcy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJzaW1wbGVSZXBvc2l0b3J5IiAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS5tZXRhZGF0YVJlcG9zaXRvcmllcyI+Ci0JCTxmaWx0ZXIgc3VmZml4PSJjb250ZW50LnhtbCIvPgotCQk8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5TaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc2NoZW1hL21ldGFkYXRhUmVwb3NpdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zY2hlbWEvbWV0YWRhdGFSZXBvc2l0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxMjM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zY2hlbWEvbWV0YWRhdGFSZXBvc2l0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIgaWQ9Im1ldGFkYXRhUmVwb3NpdG9yaWVzIiBuYW1lPSJNZXRhZGF0YSBSZXBvc2l0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGFydGlmYWN0IHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyAKLSZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5Jmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbHRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN1ZmZpeCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IDAuMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSBtdXN0IHJlcHJlc2VudCBhbiAKLWltcGxlbWVudG9yIG9mICZsdDt0dCZndDtvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeSZsdDsvdHQmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLWFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzOWM5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9fUFJPVklERVJfWFBUID0gSUQgKyAnLicgKyAibWV0YWRhdGFSZXBvc2l0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBidW5kbGVDb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5idW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5idW5kbGVDb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvRUNGTWV0YWRhdGFUcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvRUNGTWV0YWRhdGFUcmFuc3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmNWRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0VDRk1ldGFkYXRhVHJhbnNwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmlkZW50aXR5LkZpbGVDcmVhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5pZGVudGl0eS5GaWxlSURGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuc2VydmljZS5JUmV0cmlldmVGaWxlVHJhbnNmZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIHRyYW5zcG9ydCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCBpbnN0YW5jZTsKLQotCXByaXZhdGUgZmluYWwgU2VydmljZVRyYWNrZXIgcmV0cmlldmFsRmFjdG9yeVRyYWNrZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEVDRk1ldGFkYXRhVHJhbnNwb3J0KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgRUNGTWV0YWRhdGFUcmFuc3BvcnQoKSB7Ci0JCXJldHJpZXZhbEZhY3RvcnlUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJcmV0cmlldmFsRmFjdG9yeVRyYWNrZXIub3BlbigpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGRvd25sb2FkKFN0cmluZyB0b0Rvd25sb2FkLCBPdXRwdXRTdHJlYW0gdGFyZ2V0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeSBmYWN0b3J5ID0gKElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkpIHJldHJpZXZhbEZhY3RvcnlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVDRiBUcmFuc2ZlciBtYW5hZ2VyIG5vdCBhdmFpbGFibGUiKTsKLQotCQlyZXR1cm4gdHJhbnNmZXIoZmFjdG9yeS5uZXdJbnN0YW5jZSgpLCB0b0Rvd25sb2FkLCB0YXJnZXQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBVUkwgbG9jYXRpb24gb2YgdGhlIGZpbGUuCi0JICogQHJldHVybiBBIDxjb2RlPmxvbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgZGF0ZS4gUmV0dXJucyA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKFN0cmluZyBsb2NhdGlvbikgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkJdHJ5IHsKLQkJCWNvbnRhaW5lciA9IENvbnRhaW5lckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZUNvbnRhaW5lcigpOwotCQl9IGNhdGNoIChDb250YWluZXJDcmVhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJSVJlbW90ZUZpbGVTeXN0ZW1Ccm93c2VyQ29udGFpbmVyQWRhcHRlciBhZGFwdGVyID0gKElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIpIGNvbnRhaW5lci5nZXRBZGFwdGVyKElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlJUmVtb3RlRmlsZSByZW1vdGVGaWxlID0gY2hlY2tGaWxlKGFkYXB0ZXIsIGxvY2F0aW9uKTsKLQkJaWYgKHJlbW90ZUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHJlbW90ZUZpbGUuZ2V0SW5mbygpLmdldExhc3RNb2RpZmllZCgpOwotCX0KLQotCXByaXZhdGUgSVJlbW90ZUZpbGUgY2hlY2tGaWxlKGZpbmFsIElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIgcmV0cmlldmFsQ29udGFpbmVyLCBmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJZmluYWwgQm9vbGVhbltdIGRvbmUgPSBuZXcgQm9vbGVhblsxXTsKLQkJZG9uZVswXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJSVJlbW90ZUZpbGVTeXN0ZW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUmVtb3RlRmlsZVN5c3RlbUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlUmVtb3RlRmlsZUV2ZW50KElSZW1vdGVGaWxlU3lzdGVtRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZUV2ZW50KSB7Ci0JCQkJCUlSZW1vdGVGaWxlU3lzdGVtQnJvd3NlRXZlbnQgZnNiZSA9IChJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZUV2ZW50KSBldmVudDsKLQkJCQkJSVJlbW90ZUZpbGVbXSByZW1vdGVGaWxlcyA9IGZzYmUuZ2V0UmVtb3RlRmlsZXMoKTsKLQkJCQkJaWYgKHJlbW90ZUZpbGVzICE9IG51bGwgJiYgcmVtb3RlRmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCQlyZXN1bHRbMF0gPSByZW1vdGVGaWxlc1swXTsKLQkJCQkJCQlkb25lWzBdID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCQkJCQkJcmVzdWx0Lm5vdGlmeSgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCQlyZXN1bHRbMF0gPSBudWxsOwotCQkJCQkJCWRvbmVbMF0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCQkJCQlyZXN1bHQubm90aWZ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlyZXRyaWV2YWxDb250YWluZXIuc2VuZEJyb3dzZVJlcXVlc3QoRmlsZUlERmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlRmlsZUlEKHJldHJpZXZhbENvbnRhaW5lci5nZXRCcm93c2VOYW1lc3BhY2UoKSwgbG9jYXRpb24pLCBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJlbW90ZUZpbGVTeXN0ZW1FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEZpbGVDcmVhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCXdoaWxlICghZG9uZVswXS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWJvb2xlYW4gbG9nZ2VkID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0LndhaXQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICghbG9nZ2VkKQotCQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAiVW5leHBlY3RlZCBpbnRlcnJ1cHQgd2hpbGUgd2FpdGluZyBvbiBFQ0YgYnJvd3NlIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVJlbW90ZUZpbGUpIHJlc3VsdFswXTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdHJhbnNmZXIoZmluYWwgSVJldHJpZXZlRmlsZVRyYW5zZmVyQ29udGFpbmVyQWRhcHRlciByZXRyaWV2YWxDb250YWluZXIsIGZpbmFsIFN0cmluZyB0b0Rvd25sb2FkLCBmaW5hbCBPdXRwdXRTdHJlYW0gdGFyZ2V0LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHJlc3VsdCA9IG5ldyBJU3RhdHVzWzFdOwotCQlJRmlsZVRyYW5zZmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUZpbGVUcmFuc2Zlckxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVUcmFuc2ZlckV2ZW50KElGaWxlVHJhbnNmZXJFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50IHJzZSA9IChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCkgZXZlbnQ7Ci0JCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyc2UucmVjZWl2ZSh0YXJnZXQpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY29udmVydFRvU3RhdHVzKGUpOwotCQkJCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQkJCXJlc3VsdFswXSA9IHN0YXR1czsKLQkJCQkJCQkJcmVzdWx0Lm5vdGlmeSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRGF0YUV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlciBzb3VyY2UgPSAoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEYXRhRXZlbnQpIGV2ZW50KS5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCXNvdXJjZS5jYW5jZWwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRG9uZUV2ZW50KSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gY29udmVydFRvU3RhdHVzKCgoSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZURvbmVFdmVudCkgZXZlbnQpLmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCXJlc3VsdFswXSA9IHN0YXR1czsKLQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNlbmRSZXRyaWV2ZVJlcXVlc3QoRmlsZUlERmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlRmlsZUlEKHJldHJpZXZhbENvbnRhaW5lci5nZXRSZXRyaWV2ZU5hbWVzcGFjZSgpLCB0b0Rvd25sb2FkKSwgbGlzdGVuZXIsIG51bGwpOwotCQl9IGNhdGNoIChJbmNvbWluZ0ZpbGVUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfSBjYXRjaCAoRmlsZUNyZWF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJd2hpbGUgKHJlc3VsdFswXSA9PSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBsb2dnZWQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQud2FpdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCFsb2dnZWQpCi0JCQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsICJVbmV4cGVjdGVkIGludGVycnVwdCB3aGlsZSB3YWl0aW5nIG9uIEVDRiB0cmFuc2ZlciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgY29udmVydFRvU3RhdHVzKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGUgaW5zdGFuY2VvZiBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIEFjdGl2YXRvci5JRCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0xvY2FsTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0xvY2FsTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOWU4MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBQcmFzaGFudCBEZXZhIC0gQnVnIDE5NDY3NCBbcHJvdl0gUHJvdmlkZSB3cml0ZSBhY2Nlc3MgdG8gbWV0YWRhdGEgcmVwb3NpdG9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgbWV0YWRhdGEgcmVwb3NpdG9yeSB0aGF0IHJlc2lkZXMgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiAgSWYgdGhlIHJlcG9zaXRvcnkKLSAqIGxvY2F0aW9uIGlzIGEgZGlyZWN0b3J5LCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKLSAqIGFuZCBjb21iaW5lIGFueSBtZXRhZGF0YSByZXBvc2l0b3J5IGZpbGVzIHRoYXQgYXJlIGZvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSB7Ci0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIENPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUkVQT1NJVE9SWV9UWVBFID0gTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpOwotCXN0YXRpYyBmaW5hbCBwcml2YXRlIEludGVnZXIgUkVQT1NJVE9SWV9WRVJTSU9OID0gbmV3IEludGVnZXIoMSk7Ci0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgWE1MX0VYVEVOU0lPTiA9ICIueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEhhc2hTZXQgdW5pdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRBY3R1YWxMb2NhdGlvbihVUkwgbG9jYXRpb24sIFN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIHNwZWMgPSBsb2NhdGlvbi5nZXRGaWxlKCk7Ci0JCWlmIChzcGVjLmVuZHNXaXRoKENPTlRFTlRfRklMRU5BTUUgKyBleHRlbnNpb24pKQotCQkJcmV0dXJuIG5ldyBGaWxlKHNwZWMgKyBleHRlbnNpb24pOwotCQlpZiAoc3BlYy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlzcGVjICs9IENPTlRFTlRfRklMRU5BTUU7Ci0JCWVsc2UKLQkJCXNwZWMgKz0gIi8iICsgQ09OVEVOVF9GSUxFTkFNRTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IEZpbGUoc3BlYyArIGV4dGVuc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEFjdHVhbExvY2F0aW9uKFVSTCBsb2NhdGlvbikgewotCQlyZXR1cm4gZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIFhNTF9FWFRFTlNJT04pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gcmVzdG9yaW5nIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGxvY2FsIHJlcG9zaXRvcnkuCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5Ci0JICovCi0JcHVibGljIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSA9PSBudWxsID8gKGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpIDogIiIpIDogbmFtZSwgUkVQT1NJVE9SWV9UWVBFLCBSRVBPU0lUT1JZX1ZFUlNJT04udG9TdHJpbmcoKSwgbG9jYXRpb24sIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlmICghbG9jYXRpb24uZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBsb2NhbCByZXBvc2l0b3J5IGxvY2F0aW9uOiAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCS8vd2hlbiBjcmVhdGluZyBhIHJlcG9zaXRvcnksIHdlIG11c3QgZW5zdXJlIGl0IGV4aXN0cyBvbiBkaXNrIHNvIGEgc3Vic2VxdWVudCBsb2FkIHdpbGwgc3VjY2VlZAotCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gaW5zdGFsbGFibGVVbml0cykgewotCQlpZiAoaW5zdGFsbGFibGVVbml0cyA9PSBudWxsIHx8IGluc3RhbGxhYmxlVW5pdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCXVuaXRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGluc3RhbGxhYmxlVW5pdHMpKTsKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUmVwb3NpdG9yeVN0YXRlIHN0YXRlKSB7Ci0JCXRoaXMubmFtZSA9IHN0YXRlLk5hbWU7Ci0JCXRoaXMudHlwZSA9IHN0YXRlLlR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHN0YXRlLlZlcnNpb24udG9TdHJpbmcoKTsKLQkJdGhpcy5wcm92aWRlciA9IHN0YXRlLlByb3ZpZGVyOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gc3RhdGUuRGVzY3JpcHRpb247Ci0JCXRoaXMubG9jYXRpb24gPSBzdGF0ZS5Mb2NhdGlvbjsKLQkJdGhpcy5wcm9wZXJ0aWVzID0gc3RhdGUuUHJvcGVydGllczsKLQkJdGhpcy51bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5Vbml0cykpOwotCX0KLQotCS8vIHVzZSB0aGlzIG1ldGhvZCB0byBzZXR1cCBhbnkgdHJhbnNpZW50IGZpZWxkcyBldGMgYWZ0ZXIgdGhlIG9iamVjdCBoYXMgYmVlbiByZXN0b3JlZCBmcm9tIGEgc3RyZWFtCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFmdGVyTG9hZChVUkwgYUxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBhTG9jYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHF1ZXJ5LnBlcmZvcm0odW5pdHMuaXRlcmF0b3IoKSwgY29sbGVjdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXVuaXRzLmNsZWFyKCk7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnN0YWxsYWJsZVVuaXRzKFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB1bml0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJaWYgKHF1ZXJ5LmlzTWF0Y2goaXQubmV4dCgpKSkgewotCQkJCWl0LnJlbW92ZSgpOwotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQlpZiAoY2hhbmdlZCkKLQkJCXNhdmUoKTsKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0VG9CYWNrdXAoTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkgYmFja3VwKSB7Ci0JCW5hbWUgPSBiYWNrdXAubmFtZTsKLQkJdHlwZSA9IGJhY2t1cC50eXBlOwotCQl2ZXJzaW9uID0gYmFja3VwLnZlcnNpb247Ci0JCWxvY2F0aW9uID0gYmFja3VwLmxvY2F0aW9uOwotCQlkZXNjcmlwdGlvbiA9IGJhY2t1cC5kZXNjcmlwdGlvbjsKLQkJcHJvdmlkZXIgPSBiYWNrdXAucHJvdmlkZXI7Ci0JCXByb3BlcnRpZXMgPSBiYWNrdXAucHJvcGVydGllczsKLQkJdW5pdHMgPSBiYWNrdXAudW5pdHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCUZpbGUgZmlsZSA9IGdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJRmlsZSBqYXJGaWxlID0gZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIEpBUl9FWFRFTlNJT04pOwotCQlib29sZWFuIGNvbXByZXNzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgcHJvcGVydGllcy5nZXQoUFJPUF9DT01QUkVTU0VEKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCQkJaWYgKCFjb21wcmVzcykgewotCQkJCWlmIChqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoIWZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKQotCQkJCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCQlvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0JCQkJaWYgKCFqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmICghamFyRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpCi0JCQkJCQlqYXJGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJamFyRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCQkJCUphckVudHJ5IGphckVudHJ5ID0gbmV3IEphckVudHJ5KGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlKYXJPdXRwdXRTdHJlYW0gak91dHB1dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyRmlsZSkpOwotCQkJCWpPdXRwdXQucHV0TmV4dEVudHJ5KGphckVudHJ5KTsKLQkJCQlvdXRwdXQgPSBqT3V0cHV0OwotCQkJfQotCQkJc3VwZXIuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9USU1FU1RBTVAsIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLQkJCW5ldyBNZXRhZGF0YVJlcG9zaXRvcnlJTygpLndyaXRlKHRoaXMsIG91dHB1dCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9XUklURSwgIkVycm9yIHNhdmluZyBtZXRhZGF0YSByZXBvc2l0b3J5OiAiICsgbG9jYXRpb24sIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gc3VwZXIuc2V0UHJvcGVydHkoa2V5LCBuZXdWYWx1ZSk7Ci0JCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSkKLQkJCXJldHVybiBvbGRWYWx1ZTsKLQkJc2F2ZSgpOwotCQkvL2ZvcmNlIHJlcG9zaXRvcnkgbWFuYWdlciB0byByZWxvYWQgdGhpcyByZXBvc2l0b3J5IGJlY2F1c2UgaXQgY2FjaGVzIHByb3BlcnRpZXMKLQkJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KGdldExvY2F0aW9uKCkpKQotCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHRoaXMpOwotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGYwZmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZXMKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2ZhaWxlZFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fZmFpbGVkV3JpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fSW5jb21wYXRpYmxlVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19wYXJzZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVQT19MT0FESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUE9NR1JfQURESU5HX1JFUE87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2V4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2ZhaWxlZFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9pbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fbm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fdW5rbm93blR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9pbnZhbGlkTG9jYXRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWV0YWRhdGFSZXBvc2l0b3J5SU8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWV0YWRhdGFSZXBvc2l0b3J5SU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4OTdjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeUlPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFByYXNoYW50IERldmEgLSBCdWcgMTk0Njc0IFtwcm92XSBQcm92aWRlIHdyaXRlIGFjY2VzcyB0byBtZXRhZGF0YSByZXBvc2l0b3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uTWV0YWRhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvLk1ldGFkYXRhV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5LlJlcG9zaXRvcnlTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCB3cml0ZXMgcHJvdmlzaW9uaW5nIG1ldGFkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFSZXBvc2l0b3J5SU8gewotCi0JLyoqCi0JICogUmVhZHMgbWV0YWRhdGEgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgY29udGFpbmVkIGFycmF5Ci0JICogb2YgYWJzdHJhY3QgbWV0YWRhdGEgcmVwb3NpdG9yaWVzLgotCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGJ1ZmZlcmluZywgYW5kIGNsb3NlcyB0aGUgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICovCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVhZChVUkwgbG9jYXRpb24sIElucHV0U3RyZWFtIGlucHV0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmZlcmVkSW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlidWZmZXJlZElucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXQpOwotCi0JCQkJUGFyc2VyIHJlcG9zaXRvcnlQYXJzZXIgPSBuZXcgUGFyc2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFjdGl2YXRvci5JRCk7Ci0JCQkJcmVwb3NpdG9yeVBhcnNlci5wYXJzZShpbnB1dCwgbW9uaXRvcik7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSByZXBvc2l0b3J5UGFyc2VyLmdldFN0YXR1cygpOwotCQkJCXN3aXRjaCAocmVzdWx0LmdldFNldmVyaXR5KCkpIHsKLQkJCQkJY2FzZSBJU3RhdHVzLkNBTkNFTCA6Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24ocmVzdWx0KTsKLQkJCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXBvc2l0b3J5UGFyc2VyLmdldFJlcG9zaXRvcnkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJ1ZmZlcmVkSW5wdXQgIT0gbnVsbCkKLQkJCQkJYnVmZmVyZWRJbnB1dC5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBpb2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gYnVmZmVyZWRPdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJYnVmZmVyZWRPdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJCVdyaXRlciByZXBvc2l0b3J5V3JpdGVyID0gbmV3IFdyaXRlcihidWZmZXJlZE91dHB1dCwgcmVwb3NpdG9yeS5nZXRDbGFzcygpKTsKLQkJCXJlcG9zaXRvcnlXcml0ZXIud3JpdGUocmVwb3NpdG9yeSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYnVmZmVyZWRPdXRwdXQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlcmVkT3V0cHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBYTUxDb25zdGFudHMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uWE1MQ29uc3RhbnRzIHsKLQotCQkvLyBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgWE1MIGZvciBhIE1ldGFkYXRhUmVwb3NpdG9yeQotCi0JCS8vIEEgZm9ybWF0IHZlcnNpb24gbnVtYmVyIGZvciBtZXRhZGF0YSByZXBvc2l0b3J5IFhNTC4KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT04gPSAiMS4wLjAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvbiBDVVJSRU5UX1ZFUlNJT04gPSBuZXcgVmVyc2lvbihYTUxfVkVSU0lPTik7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblJhbmdlIFhNTF9UT0xFUkFOQ0UgPSBuZXcgVmVyc2lvblJhbmdlKENVUlJFTlRfVkVSU0lPTiwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQotCQkvLyBDb25zdGFudHMgZm9yIHByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1JFUE9TSVRPUllfVEFSR0VUID0gIm1ldGFkYXRhUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb25zdGFudHMgZm9yIG1ldGFkYXRhIHJlcG9zaXRvcnkgZWxlbWVudHMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9FTEVNRU5UID0gInJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIGNyZWF0ZVBJKENsYXNzIHJlcG9zaXRvcnlDbGFzcykgewotCQkvL1RPRE8gV2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGJ1dCBjdXJyZW50bHkgb2xkIGNsaWVudHMgcmVseSBvbiB0aGlzLiBTZWUgYnVnIDIxMDQ1MC4KLQkJcmV0dXJuIG5ldyBYTUxXcml0ZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uW10ge1hNTFdyaXRlci5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ubWFrZUNsYXNzVmVyc2lvbkluc3RydWN0aW9uKFhNTENvbnN0YW50cy5QSV9SRVBPU0lUT1JZX1RBUkdFVCwgcmVwb3NpdG9yeUNsYXNzLCBYTUxDb25zdGFudHMuQ1VSUkVOVF9WRVJTSU9OKX07Ci0JfQotCi0JLy8gWE1MIHdyaXRlciBmb3IgYSBJTWV0YWRhdGFSZXBvc2l0b3J5Ci0JcHJvdGVjdGVkIGNsYXNzIFdyaXRlciBleHRlbmRzIE1ldGFkYXRhV3JpdGVyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCQlwdWJsaWMgV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQsIENsYXNzIHJlcG9zaXRvcnlDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKG91dHB1dCwgY3JlYXRlUEkocmVwb3NpdG9yeUNsYXNzKSk7Ci0JCX0KLQotCQkvKioKLQkJICogV3JpdGUgdGhlIGdpdmVuIG1ldGFkYXRhIHJlcG9zaXRvcnkgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3cml0ZShJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN0YXJ0KFJFUE9TSVRPUllfRUxFTUVOVCk7Ci0JCQlhdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0TmFtZSgpKTsKLQkJCWF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSwgcmVwb3NpdG9yeS5nZXRUeXBlKCkpOwotCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldFZlcnNpb24oKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChQUk9WSURFUl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0UHJvdmlkZXIoKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChERVNDUklQVElPTl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7IC8vIFRPRE86IGNvdWxkIGJlIGNkYXRhPwotCi0JCQl3cml0ZVByb3BlcnRpZXMocmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJQ29sbGVjdG9yIHVuaXRzID0gcmVwb3NpdG9yeS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCQl3cml0ZUluc3RhbGxhYmxlVW5pdHModW5pdHMuaXRlcmF0b3IoKSwgdW5pdHMuc2l6ZSgpKTsKLQotCQkJZW5kKFJFUE9TSVRPUllfRUxFTUVOVCk7Ci0JCQlmbHVzaCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAJUGFyc2VyIGZvciB0aGUgY29udGVudHMgb2YgYSBtZXRhZGF0YSByZXBvc2l0b3J5LAotCSAqIAlhcyB3cml0dGVuIGJ5IHRoZSBXcml0ZXIgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQYXJzZXIgZXh0ZW5kcyBNZXRhZGF0YVBhcnNlciBpbXBsZW1lbnRzIFhNTENvbnN0YW50cyB7Ci0KLQkJcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5IHRoZVJlcG9zaXRvcnkgPSBudWxsOwotCQlwcm90ZWN0ZWQgQ2xhc3MgdGhlUmVwb3NpdG9yeUNsYXNzID0gbnVsbDsKLQotCQlwdWJsaWMgUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aGlzLnN0YXR1cyA9IG51bGw7Ci0JCQlzZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5SRVBPX0xPQURJTkcsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE86IGN1cnJlbnRseSBub3QgY2FjaGluZyB0aGUgcGFyc2VyIHNpbmNlIHdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMKLQkJCQkvLwkJIG9yIHJlc3RyaWN0aW9ucyBvbiBjb25jdXJyZW50IHBhcnNpbmcKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlSZXBvc2l0b3J5SGFuZGxlciByZXBvc2l0b3J5SGFuZGxlciA9IG5ldyBSZXBvc2l0b3J5SGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUmVwb3NpdG9yeURvY0hhbmRsZXIoUkVQT1NJVE9SWV9FTEVNRU5ULCByZXBvc2l0b3J5SGFuZGxlcikpOwotCQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQl0aGVSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeUhhbmRsZXIuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKLQkJCXJldHVybiB0aGVSZXBvc2l0b3J5OwotCQl9Ci0KLQkJcHVibGljIENsYXNzIGdldFJlcG9zaXRvcnlDbGFzcygpIHsKLQkJCXJldHVybiB0aGVSZXBvc2l0b3J5Q2xhc3M7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhlUmVwb3NpdG9yeTsKLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgUmVwb3NpdG9yeURvY0hhbmRsZXIgZXh0ZW5kcyBEb2NIYW5kbGVyIHsKLQotCQkJcHVibGljIFJlcG9zaXRvcnlEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChQSV9SRVBPU0lUT1JZX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlWZXJzaW9uIHJlcG9zaXRvcnlWZXJzaW9uID0gZXh0cmFjdFBJVmVyc2lvbih0YXJnZXQsIGRhdGEpOwotCQkJCQlpZiAoIU1ldGFkYXRhUmVwb3NpdG9yeUlPLlhNTENvbnN0YW50cy5YTUxfVE9MRVJBTkNFLmlzSW5jbHVkZWQocmVwb3NpdG9yeVZlcnNpb24pKSB7Ci0JCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmlvX0luY29tcGF0aWJsZVZlcnNpb24sIHJlcG9zaXRvcnlWZXJzaW9uLCBNZXRhZGF0YVJlcG9zaXRvcnlJTy5YTUxDb25zdGFudHMuWE1MX1RPTEVSQU5DRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlwcml2YXRlIGZpbmFsIGNsYXNzIFJlcG9zaXRvcnlIYW5kbGVyIGV4dGVuZHMgUm9vdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtOQU1FX0FUVFJJQlVURSwgVFlQRV9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQkJCXByaXZhdGUgZmluYWwgU3RyaW5nW10gb3B0aW9uYWwgPSBuZXcgU3RyaW5nW10ge0RFU0NSSVBUSU9OX0FUVFJJQlVURSwgUFJPVklERVJfQVRUUklCVVRFfTsKLQotCQkJcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRzSGFuZGxlciB1bml0c0hhbmRsZXIgPSBudWxsOwotCQkJcHJpdmF0ZSBQcm9wZXJ0aWVzSGFuZGxlciBwcm9wZXJ0aWVzSGFuZGxlciA9IG51bGw7Ci0KLQkJCXByaXZhdGUgQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG51bGw7Ci0KLQkJCXByaXZhdGUgUmVwb3NpdG9yeVN0YXRlIHN0YXRlID0gbmV3IFJlcG9zaXRvcnlTdGF0ZSgpOwotCi0JCQlwdWJsaWMgUmVwb3NpdG9yeUhhbmRsZXIoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKLQkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUm9vdEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBvcHRpb25hbCk7Ci0JCQkJVmVyc2lvbiB2ZXJzaW9uID0gY2hlY2tWZXJzaW9uKHRoaXMuZWxlbWVudEhhbmRsZWQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJCXN0YXRlLk5hbWUgPSB2YWx1ZXNbMF07Ci0JCQkJc3RhdGUuVHlwZSA9IHZhbHVlc1sxXTsKLQkJCQlzdGF0ZS5WZXJzaW9uID0gdmVyc2lvbjsKLQkJCQlzdGF0ZS5EZXNjcmlwdGlvbiA9IHZhbHVlc1szXTsKLQkJCQlzdGF0ZS5Qcm92aWRlciA9IHZhbHVlc1s0XTsKLQkJCQlzdGF0ZS5Mb2NhdGlvbiA9IG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJY2hlY2tDYW5jZWwoKTsKLQkJCQlpZiAoUFJPUEVSVElFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAocHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJcHJvcGVydGllc0hhbmRsZXIgPSBuZXcgUHJvcGVydGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChJTlNUQUxMQUJMRV9VTklUU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAodW5pdHNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCXVuaXRzSGFuZGxlciA9IG5ldyBJbnN0YWxsYWJsZVVuaXRzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJc3RhdGUuUHJvcGVydGllcyA9IChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKDApIC8vCi0JCQkJCQkJOiBwcm9wZXJ0aWVzSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJCQlzdGF0ZS5Vbml0cyA9ICh1bml0c0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBJSW5zdGFsbGFibGVVbml0WzBdIC8vCi0JCQkJCQkJOiB1bml0c0hhbmRsZXIuZ2V0VW5pdHMoKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL2Nhbid0IGNyZWF0ZSByZXBvc2l0b3J5IGlmIG1pc3NpbmcgdHlwZSAtIHRoaXMgaXMgYWxyZWFkeSBsb2dnZWQgd2hlbiBwYXJzaW5nIGF0dHJpYnV0ZXMKLQkJCQkJCWlmIChzdGF0ZS5UeXBlID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy9taWdyYXRpb24gc3VwcG9ydCBmb3IgY2hhbmdlIHRvIE1ldGFkYXRhQ2FjaGUgKGJ1ZyAyMTE5MzQpCi0JCQkJCQlpZiAoc3RhdGUuVHlwZS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbHJlZ2lzdHJ5Lk1ldGFkYXRhQ2FjaGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXRlLlR5cGUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkxvY2FsTWV0YWRhdGFSZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHN0YXRlLlR5cGUpOwotCQkJCQkJT2JqZWN0IHJlcG9zaXRvcnlPYmplY3QgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQkJCQkJaWYgKHJlcG9zaXRvcnlPYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSkgewotCQkJCQkJCXJlcG9zaXRvcnkgPSAoQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkpIHJlcG9zaXRvcnlPYmplY3Q7Ci0JCQkJCQkJcmVwb3NpdG9yeS5pbml0aWFsaXplKHN0YXRlKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLmlvX3BhcnNlRXJyb3I7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJLy8gVE9ETzoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4ZWJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkNvbmZpZ3VyYXRpb25TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgaW1wbGVtZW50cyBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciwgUHJvdmlzaW9uaW5nTGlzdGVuZXIgewotCXN0YXRpYyBjbGFzcyBSZXBvc2l0b3J5SW5mbyB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJYm9vbGVhbiBpc1N5c3RlbSA9IGZhbHNlOwotCQlVUkwgbG9jYXRpb247Ci0JCVN0cmluZyBuYW1lOwotCQlTb2Z0UmVmZXJlbmNlIHJlcG9zaXRvcnk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VGRklYID0gInN1ZmZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVUZGSVggPSAiY29udGVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUk9WSURFUiA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NZU1RFTSA9ICJpc1N5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SRVBPU0lUT1JJRVMgPSAicmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFwIG9mIFN0cmluZy0+UmVwb3NpdG9yeUluZm8sIHdoZXJlIFN0cmluZyBpcyB0aGUgcmVwb3NpdG9yeSBrZXkKLQkgKiBvYnRhaW5lZCB2aWEgZ2V0S2V5KFVSTCkuCi0JICovCi0JcHJpdmF0ZSBNYXAgcmVwb3NpdG9yaWVzID0gbnVsbDsKLQotCS8vbG9jayBvYmplY3QgdG8gYmUgaGVsZCB3aGVuIHJlZmVycmluZyB0byB0aGUgcmVwb3NpdG9yaWVzIGZpZWxkCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVwb3NpdG9yeUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBDYWNoZSBMaXN0IG9mIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLiBNYWludGFpbiBjYWNoZQotCSAqIGZvciBzaG9ydCBkdXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgbWF5IGJlY29tZSBhdmFpbGFibGUgYXQgYW55IHRpbWUuCi0JICovCi0JcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzOwotCi0JcHVibGljIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJLy9pbml0aWFsaXplIHJlcG9zaXRvcmllcyBsYXppbHkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvKCk7Ci0JCWluZm8ucmVwb3NpdG9yeSA9IG5ldyBTb2Z0UmVmZXJlbmNlKHJlcG9zaXRvcnkpOwotCQlpbmZvLm5hbWUgPSByZXBvc2l0b3J5LmdldE5hbWUoKTsKLQkJaW5mby5kZXNjcmlwdGlvbiA9IHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaW5mby5sb2NhdGlvbiA9IHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNKTsKLQkJaW5mby5pc1N5c3RlbSA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCWJvb2xlYW4gYWRkZWQgPSB0cnVlOwotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJYWRkZWQgPSByZXBvc2l0b3JpZXMucHV0KGdldEtleShyZXBvc2l0b3J5KSwgaW5mbykgPT0gbnVsbDsKLQkJfQotCQkvLyBzYXZlIHRoZSBnaXZlbiByZXBvc2l0b3J5IGluIHRoZSBwcmVmZXJlbmNlcy4KLQkJcmVtZW1iZXIocmVwb3NpdG9yeSk7Ci0JCWlmIChhZGRlZCkKLQkJCWJyb2FkY2FzdENoYW5nZUV2ZW50KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LkFEREVEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGxvY2F0aW9uKTsKLQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mbygpOwotCQlpbmZvLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWJvb2xlYW4gYWRkZWQgPSB0cnVlOwotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJYWRkZWQgPSByZXBvc2l0b3JpZXMucHV0KGdldEtleShsb2NhdGlvbiksIGluZm8pID09IG51bGw7Ci0JCX0KLQkJLy8gc2F2ZSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBpbiB0aGUgcHJlZmVyZW5jZXMuCi0JCXJlbWVtYmVyKGluZm8pOwotCQlpZiAoYWRkZWQpCi0JCQlicm9hZGNhc3RDaGFuZ2VFdmVudChsb2NhdGlvbiwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LkFEREVEKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIEVsaW1pbmF0ZSBkdXBsaWNhdGlvbiB3aXRoIEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlRXZlbnQoVVJMIGxvY2F0aW9uLCBpbnQgcmVwb3NpdG9yeVR5cGUsIGludCBraW5kKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChsb2NhdGlvbiwgcmVwb3NpdG9yeVR5cGUsIGtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB3ZSByZWNlbnRseSBhdHRlbXB0ZWQgdG8gbG9hZCB0aGUgZ2l2ZW4gbG9jYXRpb24gYW5kIGZhaWxlZAotCSAqIHRvIGZpbmQgYW55dGhpbmcuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlcG9zaXRvcnkgd2FzIG5vdAotCSAqIGZvdW5kLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgYmFkUmVwb3MgPSAoTGlzdCkgdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMuZ2V0KCk7Ci0JCWlmIChiYWRSZXBvcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYmFkUmVwb3MuY29udGFpbnMobG9jYXRpb24pOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBmYWN0IHRoYXQgd2UgdHJpZWQgdG8gbG9hZCBhIHJlcG9zaXRvcnkgYXQgdGhpcyBsb2NhdGlvbiBhbmQgZGlkIG5vdCBmaW5kIGFueXRoaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhck5vdEZvdW5kKFVSTCBsb2NhdGlvbikgewotCQlMaXN0IGJhZFJlcG9zOwotCQlpZiAodW5hdmFpbGFibGVSZXBvc2l0b3JpZXMgIT0gbnVsbCkgewotCQkJYmFkUmVwb3MgPSAoTGlzdCkgdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMuZ2V0KCk7Ci0JCQlpZiAoYmFkUmVwb3MgIT0gbnVsbCkgewotCQkJCWJhZFJlcG9zLnJlbW92ZShsb2NhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogd2FzIG5vIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uLCBvciBhbiBlcnJvciBvY2N1cnJlZCBsb2FkaW5nIGl0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCUNvcmVFeGNlcHRpb24gZmFpbHVyZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciBsb2FkaW5nIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZmFpbHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiTWFsZm9ybWVkIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyI2NyZWF0ZVJlcG9zaXRvcnkoamF2YS5uZXQuVVJMLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGxvY2F0aW9uKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0eXBlKTsKLQkJdHJ5IHsKLQkJCS8vcmVwb3NpdG9yeSBzaG91bGQgbm90IGFscmVhZHkgZXhpc3QKLQkJCWxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCAoSVByb2dyZXNzTW9uaXRvcikgbnVsbCk7Ci0JCQlmYWlsKGxvY2F0aW9uLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9FWElTVFMpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZCAtIGZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIHRoZSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uKEFjdGl2YXRvci5SRVBPX1BST1ZJREVSX1hQVCwgdHlwZSk7Ci0JCWlmIChleHRlbnNpb24gPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX1VOS05PV05fVFlQRSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkpIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZXh0ZW5zaW9uLCBGQUNUT1JZKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFEKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZShsb2NhdGlvbiwgbmFtZSwgdHlwZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFEKTsKLQkJY2xlYXJOb3RGb3VuZChsb2NhdGlvbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZhaWwoVVJMIGxvY2F0aW9uLCBpbnQgY29kZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oZmFpbFN0YXR1cyhsb2NhdGlvbiwgY29kZSkpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBmYWlsU3RhdHVzKFVSTCBsb2NhdGlvbiwgaW50IGNvZGUpIHsKLQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9FWElTVFMgOgotCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5fZXhpc3RzLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX1VOS05PV05fVFlQRSA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl91bmtub3duVHlwZSwgbG9jYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9ub3RFeGlzdHMsIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnZhbGlkTG9jYXRpb24sIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAobXNnID09IG51bGwpCi0JCQltc2cgPSBNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3I7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgY29kZSwgbXNnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElFeHRlbnNpb25bXSBmaW5kTWF0Y2hpbmdSZXBvc2l0b3J5RXh0ZW5zaW9ucyhTdHJpbmcgc3VmZml4KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsdCA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsdFtpXS5nZXROYW1lKCkuZXF1YWxzKCJmaWx0ZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFlbHRbaV0uZ2V0QXR0cmlidXRlKCJzdWZmaXgiKS5lcXVhbHMoc3VmZml4KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWVsdFtpXSA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVsdFtpXSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJSUV4dGVuc2lvbltdIHJlc3VsdHMgPSBuZXcgSUV4dGVuc2lvbltjb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWx0W2ldICE9IG51bGwpCi0JCQkJcmVzdWx0c1stLWNvdW50XSA9IGVsdFtpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldEFsbFN1ZmZpeGVzKCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOwotCQlyZXN1bHQuYWRkKERFRkFVTFRfU1VGRklYKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoRUxfRklMVEVSKSkgewotCQkJCVN0cmluZyBzdWZmaXggPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoQVRUUl9TVUZGSVgpOwotCQkJCWlmICghcmVzdWx0LmNvbnRhaW5zKHN1ZmZpeCkpCi0JCQkJCXJlc3VsdC5hZGQoc3VmZml4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyBrZXkgYmFzZWQgb24gdGhlIGdpdmVuIHJlcG9zaXRvcnkgd2hpY2gKLQkgKiBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgcHJlZmVyZW5jZSBub2RlIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlyZXR1cm4gZ2V0S2V5KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcga2V5IGJhc2VkIG9uIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uIHdoaWNoCi0JICogaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhIHByZWZlcmVuY2Ugbm9kZSBuYW1lLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEtleShVUkwgbG9jYXRpb24pIHsKLQkJcmV0dXJuIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZSgnLycsICdfJyk7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldEtub3duUmVwb3NpdG9yaWVzKGludCBmbGFncykgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG1hdGNoZXNGbGFncyhpbmZvLCBmbGFncykpCi0JCQkJCXJlc3VsdC5hZGQoaW5mby5sb2NhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKFVSTFtdKSByZXN1bHQudG9BcnJheShuZXcgVVJMW3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlIG5vZGUgd2hpY2ggaXMgdGhlIHJvb3QgZm9yIHdoZXJlIHdlIHN0b3JlIHRoZSByZXBvc2l0b3J5IGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblNjb3BlKCkuZ2V0Tm9kZShBY3RpdmF0b3IuSUQpLm5vZGUoTk9ERV9SRVBPU0lUT1JJRVMpOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFVSTFV0aWwuc2FtZVVSTChpbmZvLmxvY2F0aW9uLCBsb2NhdGlvbikpIHsKLQkJCQkJaWYgKGluZm8ucmVwb3NpdG9yeSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IChJTWV0YWRhdGFSZXBvc2l0b3J5KSBpbmZvLnJlcG9zaXRvcnkuZ2V0KCk7Ci0JCQkJCS8vdXBkYXRlIG91ciByZXBvc2l0b3J5IGluZm8gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBtYXkgaGF2ZSBjaGFuZ2VkCi0JCQkJCWlmIChyZXBvICE9IG51bGwpCi0JCQkJCQlhZGRSZXBvc2l0b3J5KHJlcG8pOwotCQkJCQlyZXR1cm4gcmVwbzsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyI2dldFJlcG9zaXRvcnlQcm9wZXJ0eShqYXZhLm5ldC5VUkwsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5UHJvcGVydHkoVVJMIGxvY2F0aW9uLCBTdHJpbmcga2V5KSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFVSTFV0aWwuc2FtZVVSTChpbmZvLmxvY2F0aW9uLCBsb2NhdGlvbikpIHsKLQkJCQkJaWYgKElSZXBvc2l0b3J5LlBST1BfREVTQ1JJUFRJT04uZXF1YWxzKGtleSkpCi0JCQkJCQlyZXR1cm4gaW5mby5kZXNjcmlwdGlvbjsKLQkJCQkJaWYgKElSZXBvc2l0b3J5LlBST1BfTkFNRS5lcXVhbHMoa2V5KSkKLQkJCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQkJCS8vIEtleSBub3Qga25vd24sIHJldHVybiBudWxsCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCS8vIFJlcG9zaXRvcnkgbm90IGZvdW5kLCByZXR1cm4gbnVsbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwobG9jYXRpb24pOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlc3VsdCA9IGdldFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlNdWx0aVN0YXR1cyBub3RGb3VuZFN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9ub3RFeGlzdHMsIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpLCBudWxsKTsKLQkJaWYgKGNoZWNrTm90Rm91bmQobG9jYXRpb24pKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihub3RGb3VuZFN0YXR1cyk7Ci0JCVN0cmluZ1tdIHN1ZmZpeGVzID0gZ2V0QWxsU3VmZml4ZXMoKTsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgTWVzc2FnZXMuUkVQT01HUl9BRERJTkdfUkVQTywgc3VmZml4ZXMubGVuZ3RoICogMTAwKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VmZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXN1bHQgPSBsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgc3VmZml4ZXNbaV0sIHN1Yi5uZXdDaGlsZCgxMDApLCBub3RGb3VuZFN0YXR1cyk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCWFkZFJlcG9zaXRvcnkocmVzdWx0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWIuZG9uZSgpOwotCQl9Ci0JCXJlbWVtYmVyTm90Rm91bmQobG9jYXRpb24pOwotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5vdEZvdW5kU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gbG9hZCBhIHByZS1leGlzdGluZyByZXBvIGF0IHRoZSBnaXZlbiBsb2NhdGlvbgotCSAqLwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIFN0cmluZyBzdWZmaXgsIFN1Yk1vbml0b3IgbW9uaXRvciwgTXVsdGlTdGF0dXMgZmFpbHVyZXMpIHsKLQkJSUV4dGVuc2lvbltdIHByb3ZpZGVycyA9IGZpbmRNYXRjaGluZ1JlcG9zaXRvcnlFeHRlbnNpb25zKHN1ZmZpeCk7Ci0JCS8vIExvb3Agb3ZlciB0aGUgY2FuZGlkYXRlcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBzdWNjZXNzZnVsbHkgbG9hZHMKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHByb3ZpZGVycy5sZW5ndGggKiAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkpIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24ocHJvdmlkZXJzW2ldLCBGQUNUT1JZKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhY3RvcnkubG9hZChsb2NhdGlvbiwgbW9uaXRvci5uZXdDaGlsZCgxMCkpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCQlmYWlsdXJlcy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJLy9rZWVwIHRyeWluZyB3aXRoIG90aGVyIGZhY3RvcmllcwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgdCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzRmxhZ3MoUmVwb3NpdG9yeUluZm8gaW5mbywgaW50IGZsYWdzKSB7Ci0JCWlmICgoZmxhZ3MgJiBSRVBPU0lUT1JJRVNfU1lTVEVNKSA9PSBSRVBPU0lUT1JJRVNfU1lTVEVNKQotCQkJaWYgKCFpbmZvLmlzU3lzdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKChmbGFncyAmIFJFUE9TSVRPUklFU19OT05fU1lTVEVNKSA9PSBSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSkKLQkJCWlmIChpbmZvLmlzU3lzdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKChmbGFncyAmIFJFUE9TSVRPUklFU19MT0NBTCkgPT0gUkVQT1NJVE9SSUVTX0xPQ0FMKQotCQkJcmV0dXJuICJmaWxlIi5lcXVhbHMoaW5mby5sb2NhdGlvbi5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKihub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5Qcm92aXNpb25pbmdMaXN0ZW5lciNub3RpZnkoamF2YS51dGlsLkV2ZW50T2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgUmVwb3NpdG9yeUV2ZW50KSB7Ci0JCQlSZXBvc2l0b3J5RXZlbnQgZXZlbnQgPSAoUmVwb3NpdG9yeUV2ZW50KSBvOwotCQkJaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBSZXBvc2l0b3J5RXZlbnQuRElTQ09WRVJFRCAmJiBldmVudC5nZXRSZXBvc2l0b3J5VHlwZSgpID09IElSZXBvc2l0b3J5LlRZUEVfTUVUQURBVEEpCi0JCQkJYWRkUmVwb3NpdG9yeShldmVudC5nZXRSZXBvc2l0b3J5TG9jYXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgcHJlZmVyZW5jZSBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZQotCSAqIHdhcyBhY3R1YWxseSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwdXRWYWx1ZShQcmVmZXJlbmNlcyBub2RlLCBTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbm9kZS5nZXQoa2V5LCBudWxsKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8IChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5vZGUucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCW5vZGUucHV0KGtleSwgbmV3VmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHF1ZXJ5IGFnYWluc3QgYWxsIG9mIHRoZSBpbnN0YWxsYWJsZSB1bml0cyBvZiBlYWNoIGtub3duIAotCSAqIHJlcG9zaXRvcnksIGFjY3VtdWxhdGluZyBhbnkgb2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IGluIHRoZSAKLQkgKiBwcm92aWRlZCBjb2xsZWN0b3IuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSBxdWl0ZSBleHBlbnNpdmUsIGFzIGV2ZXJ5IGtub3duCi0JICogbWV0YWRhdGEgcmVwb3NpdG9yeSB3aWxsIGJlIGxvYWRlZCBpbiBvcmRlciB0byBxdWVyeSBlYWNoIG9uZS4gIElmIGEKLQkgKiBjbGllbnQgd2lzaGVzIHRvIHF1ZXJ5IG9ubHkgY2VydGFpbiByZXBvc2l0b3JpZXMsIGl0IGlzIGJldHRlciB0byB1c2UKLQkgKiB7QGxpbmsgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCl9IHRvIGZpbHRlciB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMKLQkgKiBsb2FkZWQgYW5kIHRoZW4gcXVlcnkgZWFjaCBvZiB0aGUgcmV0dXJuZWQgcmVwb3NpdG9yaWVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKLQkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4gCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBwZXJmb3JtIGFnYWluc3QgZWFjaCBpbnN0YWxsYWJsZSB1bml0IGluIGVhY2gga25vd24gcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBjb2xsZWN0b3IgQ29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gVGhlIGNvbGxlY3RvciBhcmd1bWVudAotCSAqLwotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlVUkxbXSBsb2NhdGlvbnMgPSBnZXRLbm93blJlcG9zaXRvcmllcyhSRVBPU0lUT1JJRVNfQUxMKTsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgbG9jYXRpb25zLmxlbmd0aCAqIDEwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbG9hZFJlcG9zaXRvcnkobG9jYXRpb25zW2ldLCBzdWIubmV3Q2hpbGQoOSkpLnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIHN1Yi5uZXdDaGlsZCgxKSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIHRoaXMgcmVwb3NpdG9yeSBmb3IgdGhpcyBxdWVyeQotCQkJfQotCQl9Ci0JCXN1Yi5kb25lKCk7Ci0JCXJldHVybiBjb2xsZWN0b3I7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVmcmVzaFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQljbGVhck5vdEZvdW5kKGxvY2F0aW9uKTsKLQkJaWYgKCFyZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uKSkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCk7Ci0JCXJldHVybiBsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiBTYXZlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVtZW1iZXIoSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlQcmVmZXJlbmNlcyBub2RlID0gZ2V0UHJlZmVyZW5jZXMoKS5ub2RlKGdldEtleShyZXBvc2l0b3J5KSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1VSTCwgcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9ERVNDUklQVElPTiwgcmVwb3NpdG9yeS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfTkFNRSwgcmVwb3NpdG9yeS5nZXROYW1lKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9QUk9WSURFUiwgcmVwb3NpdG9yeS5nZXRQcm92aWRlcigpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfVFlQRSwgcmVwb3NpdG9yeS5nZXRUeXBlKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9WRVJTSU9OLCByZXBvc2l0b3J5LmdldFZlcnNpb24oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1NZU1RFTSwgKFN0cmluZykgcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNKSk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoKLQkgKiBTYXZlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVtZW1iZXIoUmVwb3NpdG9yeUluZm8gaW5mbykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByZWZlcmVuY2VzKCkubm9kZShnZXRLZXkoaW5mby5sb2NhdGlvbikpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9VUkwsIGluZm8ubG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1NZU1RFTSwgQm9vbGVhbi50b1N0cmluZyhpbmZvLmlzU3lzdGVtKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX0RFU0NSSVBUSU9OLCBpbmZvLmRlc2NyaXB0aW9uKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfTkFNRSwgaW5mby5uYW1lKTsKLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlVG9QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgZmFjdCB0aGF0IHdlIHRyaWVkIHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IHRoaXMgbG9jYXRpb24gYW5kIGRpZCBub3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtZW1iZXJOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJTGlzdCBiYWRSZXBvczsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCWJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQkJaWYgKGJhZFJlcG9zICE9IG51bGwpIHsKLQkJCQliYWRSZXBvcy5hZGQobG9jYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQliYWRSZXBvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYmFkUmVwb3MuYWRkKGxvY2F0aW9uKTsKLQkJdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMgPSBuZXcgU29mdFJlZmVyZW5jZShiYWRSZXBvcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUmVwb3NpdG9yeShVUkwgdG9SZW1vdmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0b1JlbW92ZSk7Ci0JCWZpbmFsIFN0cmluZyByZXBvS2V5ID0gZ2V0S2V5KHRvUmVtb3ZlKTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvc2l0b3JpZXMucmVtb3ZlKHJlcG9LZXkpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIHJlbW92ZSB0aGUgcmVwb3NpdG9yeSBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCXRyeSB7Ci0JCQlnZXRQcmVmZXJlbmNlcygpLm5vZGUocmVwb0tleSkucmVtb3ZlTm9kZSgpOwotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igc2F2aW5nIHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlicm9hZGNhc3RDaGFuZ2VFdmVudCh0b1JlbW92ZSwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LlJFTU9WRUQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVByZWZlcmVuY2VzKCkgewotCQkvLyByZXN0b3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmdbXSBjaGlsZHJlbjsKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbk5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHJlc3RvcmluZyByZXBvc2l0b3JpZXMgZnJvbSBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJUHJlZmVyZW5jZXMgY2hpbGQgPSBub2RlLm5vZGUoY2hpbGRyZW5baV0pOwotCQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gY2hpbGQuZ2V0KEtFWV9VUkwsIG51bGwpOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJCQlpbmZvLmxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvblN0cmluZyk7Ci0JCQkJaW5mby5uYW1lID0gY2hpbGQuZ2V0KEtFWV9OQU1FLCBudWxsKTsKLQkJCQlpbmZvLmRlc2NyaXB0aW9uID0gY2hpbGQuZ2V0KEtFWV9ERVNDUklQVElPTiwgbnVsbCk7Ci0JCQkJaW5mby5pc1N5c3RlbSA9IGNoaWxkLmdldEJvb2xlYW4oS0VZX1NZU1RFTSwgZmFsc2UpOwotCQkJCXJlcG9zaXRvcmllcy5wdXQoZ2V0S2V5KGluZm8ubG9jYXRpb24pLCBpbmZvKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKCJFcnJvciB3aGlsZSByZXN0b3JpbmcgcmVwb3NpdG9yeTogIiArIGxvY2F0aW9uU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgbWV0YWRhdGEgcmVwb3NpdG9yaWVzIHNwZWNpZmllZCBhcyBzeXN0ZW0gcHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUZyb21TeXN0ZW1Qcm9wZXJ0eSgpIHsKLQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5tZXRhZGF0YVJlcG9zaXRvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobG9jYXRpb25TdHJpbmcsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBwYXRoU3RyaW5nID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdHJ5IHsKLQkJCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvKCk7Ci0JCQkJaW5mby5sb2NhdGlvbiA9IG5ldyBVUkwocGF0aFN0cmluZyk7Ci0JCQkJcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkoaW5mby5sb2NhdGlvbiksIGluZm8pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coIkVycm9yIHdoaWxlIHJlc3RvcmluZyByZXBvc2l0b3J5ICIgKyBwYXRoU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlcG9zaXRvcnkgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUmVwb3NpdG9yaWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlyZXBvc2l0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVzdG9yZUZyb21TeXN0ZW1Qcm9wZXJ0eSgpOwotCQkJcmVzdG9yZUZyb21QcmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTYXZlIHRoZSByZXBvc2l0b3J5IGxpc3QgaW4gdGhlIGZpbGUtc3lzdGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVUb1ByZWZlcmVuY2VzKCkgewotCQl0cnkgewotCQkJZ2V0UHJlZmVyZW5jZXMoKS5mbHVzaCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJbG9nKCJFcnJvciB3aGlsZSBzYXZpbmcgcmVwb3NpdG9yaWVzIGluIHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUmVwb3NpdG9yeUxvY2F0aW9uKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobG9jYXRpb24pOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlc3VsdCA9IGdldFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJU3RyaW5nW10gc3VmZml4ZXMgPSBnZXRBbGxTdWZmaXhlcygpOwotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBNZXNzYWdlcy5SRVBPX0xPQURJTkcsIHN1ZmZpeGVzLmxlbmd0aCAqIDEwMCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9ub3RFeGlzdHMsIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpLCBudWxsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJU3ViTW9uaXRvciBsb29wTW9uaXRvciA9IHN1Yi5uZXdDaGlsZCgxMDApOwotCQkJSUV4dGVuc2lvbltdIHByb3ZpZGVycyA9IGZpbmRNYXRjaGluZ1JlcG9zaXRvcnlFeHRlbnNpb25zKHN1ZmZpeGVzW2ldKTsKLQkJCS8vIExvb3Agb3ZlciB0aGUgY2FuZGlkYXRlcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBzdWNjZXNzZnVsbHkgbG9hZHMKLQkJCWxvb3BNb25pdG9yLmJlZ2luVGFzaygiIiwgcHJvdmlkZXJzLmxlbmd0aCAqIDEwKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm92aWRlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKHByb3ZpZGVyc1tqXSwgRkFDVE9SWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBmYWN0b3J5LnZhbGlkYXRlKGxvY2F0aW9uLCBsb29wTW9uaXRvci5uZXdDaGlsZCgxMCkpOwotCQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkJc3ViLmRvbmUoKTsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlzdWIuZG9uZSgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9VUkxNZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjQ1ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9VUkxNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBQcmFzaGFudCBEZXZhIC0gQnVnIDE5NDY3NCBbcHJvdl0gUHJvdmlkZSB3cml0ZSBhY2Nlc3MgdG8gbWV0YWRhdGEgcmVwb3NpdG9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgbWV0YWRhdGEgcmVwb3NpdG9yeSBiYWNrZWQgYnkgYW4gYXJiaXRyYXJ5IFVSTC4KLSAqLwotcHVibGljIGNsYXNzIFVSTE1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfVFlQRSA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBSRVBPU0lUT1JZX1ZFUlNJT04gPSBuZXcgSW50ZWdlcigxKTsKLQotCXRyYW5zaWVudCBwcm90ZWN0ZWQgVVJMIGNvbnRlbnQ7Ci0JcHJvdGVjdGVkIEhhc2hTZXQgdW5pdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0QWN0dWFsTG9jYXRpb24oVVJMIGJhc2UpIHsKLQkJcmV0dXJuIGdldEFjdHVhbExvY2F0aW9uKGJhc2UsIFhNTF9FWFRFTlNJT04pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEFjdHVhbExvY2F0aW9uKFVSTCBiYXNlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChleHRlbnNpb24gPT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uID0gWE1MX0VYVEVOU0lPTjsKLQkJfQotCQlTdHJpbmcgc3BlYyA9IGJhc2UudG9FeHRlcm5hbEZvcm0oKTsKLQkJaWYgKHNwZWMuZW5kc1dpdGgoQ09OVEVOVF9GSUxFTkFNRSArIGV4dGVuc2lvbikpCi0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKHNwZWMgKyBleHRlbnNpb24pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCWlmIChzcGVjLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXNwZWMgKz0gQ09OVEVOVF9GSUxFTkFNRTsKLQkJZWxzZQotCQkJc3BlYyArPSAiLyIgKyBDT05URU5UX0ZJTEVOQU1FOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzcGVjICsgZXh0ZW5zaW9uKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFVSTE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSA9PSBudWxsID8gKGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpIDogIiIpIDogbmFtZSwgUkVQT1NJVE9SWV9UWVBFLCBSRVBPU0lUT1JZX1ZFUlNJT04udG9TdHJpbmcoKSwgbG9jYXRpb24sIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRlbnQgPSBnZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFVSTCBnZXRDb250ZW50VVJMKCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFJlcG9zaXRvcnlTdGF0ZSBzdGF0ZSkgewotCQl0aGlzLm5hbWUgPSBzdGF0ZS5OYW1lOwotCQl0aGlzLnR5cGUgPSBzdGF0ZS5UeXBlOwotCQl0aGlzLnZlcnNpb24gPSBzdGF0ZS5WZXJzaW9uLnRvU3RyaW5nKCk7Ci0JCXRoaXMucHJvdmlkZXIgPSBzdGF0ZS5Qcm92aWRlcjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IHN0YXRlLkRlc2NyaXB0aW9uOwotCQl0aGlzLmxvY2F0aW9uID0gc3RhdGUuTG9jYXRpb247Ci0JCXRoaXMucHJvcGVydGllcyA9IHN0YXRlLlByb3BlcnRpZXM7Ci0JCXRoaXMudW5pdHMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuVW5pdHMpKTsKLQl9Ci0KLQkvLyBVc2UgdGhpcyBtZXRob2QgdG8gc2V0dXAgYW55IHRyYW5zaWVudCBmaWVsZHMgZXRjIGFmdGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIHN0cmVhbQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlckxvYWQoVVJMIHJlcG9Mb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gcmVwb0xvY2F0aW9uOwotCQljb250ZW50ID0gZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcXVlcnkucGVyZm9ybSh1bml0cy5pdGVyYXRvcigpLCBjb2xsZWN0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vTWV0YWRhdGFQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vTWV0YWRhdGFQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMjdlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW87Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGFkYXRhUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBNZXRhZGF0YVBhcnNlcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBidW5kbGVJZCkgewotCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluc3RhbGxhYmxlVW5pdHNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlwcml2YXRlIEFycmF5TGlzdCB1bml0czsKLQotCQlwdWJsaWMgSW5zdGFsbGFibGVVbml0c0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQl1bml0cyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldFVuaXRzKCkgewotCQkJaW50IHNpemUgPSB1bml0cy5zaXplKCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0W10gcmVzdWx0ID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbc2l6ZV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdW5pdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjID0gKEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJcmVzdWx0W2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChkZXNjKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCkpIHsKLQkJCQluZXcgSW5zdGFsbGFibGVVbml0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCB1bml0cyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluc3RhbGxhYmxlVW5pdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge0lEX0FUVFJJQlVURSwgVkVSU0lPTl9BVFRSSUJVVEV9OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG9wdGlvbmFsID0gbmV3IFN0cmluZ1tdIHtTSU5HTEVUT05fQVRUUklCVVRFfTsKLQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBjdXJyZW50VW5pdCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0aWVzSGFuZGxlciBwcm9wZXJ0aWVzSGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgUHJvdmlkZWRDYXBhYmlsaXRpZXNIYW5kbGVyIHByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyIHJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgSG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciBob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBUZXh0SGFuZGxlciBmaWx0ZXJIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBBcnRpZmFjdHNIYW5kbGVyIGFydGlmYWN0c0hhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIFRvdWNocG9pbnRUeXBlSGFuZGxlciB0b3VjaHBvaW50VHlwZUhhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIFRvdWNocG9pbnREYXRhSGFuZGxlciB0b3VjaHBvaW50RGF0YUhhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIFVwZGF0ZURlc2NyaXB0b3JIYW5kbGVyIHVwZGF0ZURlc2NyaXB0b3JIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBMaWNlbnNlc0hhbmRsZXIgbGljZW5zZXNIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBDb3B5cmlnaHRIYW5kbGVyIGNvcHlyaWdodEhhbmRsZXIgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIGlkOwotCQlwcml2YXRlIFZlcnNpb24gdmVyc2lvbjsKLQkJcHJpdmF0ZSBib29sZWFuIHNpbmdsZXRvbjsKLQotCQlwcml2YXRlIExpc3QgdW5pdHM7Ci0KLQkJcHVibGljIEluc3RhbGxhYmxlVW5pdEhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCB1bml0cykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgSU5TVEFMTEFCTEVfVU5JVF9FTEVNRU5UKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCwgb3B0aW9uYWwpOwotCQkJdGhpcy51bml0cyA9IHVuaXRzOwotCQkJLy9za2lwIGVudGlyZSBJVSBpZiB0aGUgaWQgaXMgbWlzc2luZwotCQkJaWYgKHZhbHVlc1swXSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJaWQgPSB2YWx1ZXNbMF07Ci0JCQl2ZXJzaW9uID0gY2hlY2tWZXJzaW9uKElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCwgVkVSU0lPTl9BVFRSSUJVVEUsIHZhbHVlc1sxXSk7Ci0JCQlzaW5nbGV0b24gPSBjaGVja0Jvb2xlYW4oSU5TVEFMTEFCTEVfVU5JVF9FTEVNRU5ULCBTSU5HTEVUT05fQVRUUklCVVRFLCB2YWx1ZXNbMl0sIHRydWUpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0SW5zdGFsbGFibGVVbml0KCkgewotCQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3VycmVudFVuaXQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWNoZWNrQ2FuY2VsKCk7Ci0JCQlpZiAoUFJPUEVSVElFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCXByb3BlcnRpZXNIYW5kbGVyID0gbmV3IFByb3BlcnRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChQUk9WSURFRF9DQVBBQklMSVRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAocHJvdmlkZWRDYXBhYmlsaXRpZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXNIYW5kbGVyID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoUkVRVUlSRURfQ0FQQUJJTElUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKHJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEhPU1RfUkVRVUlSRURfQ0FQQUJJTElUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKGhvc3RSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyID0gbmV3IEhvc3RSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKElVX0ZJTFRFUl9FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChmaWx0ZXJIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJZmlsdGVySGFuZGxlciA9IG5ldyBUZXh0SGFuZGxlcih0aGlzLCBJVV9GSUxURVJfRUxFTUVOVCwgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEFSVElGQUNUX0tFWVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCWFydGlmYWN0c0hhbmRsZXIgPSBuZXcgQXJ0aWZhY3RzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoVE9VQ0hQT0lOVF9UWVBFX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKHRvdWNocG9pbnRUeXBlSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCXRvdWNocG9pbnRUeXBlSGFuZGxlciA9IG5ldyBUb3VjaHBvaW50VHlwZUhhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFRPVUNIUE9JTlRfREFUQV9FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmICh0b3VjaHBvaW50RGF0YUhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQl0b3VjaHBvaW50RGF0YUhhbmRsZXIgPSBuZXcgVG91Y2hwb2ludERhdGFIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChVUERBVEVfREVTQ1JJUFRPUl9FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmICh1cGRhdGVEZXNjcmlwdG9ySGFuZGxlciA9PSBudWxsKQotCQkJCQl1cGRhdGVEZXNjcmlwdG9ySGFuZGxlciA9IG5ldyBVcGRhdGVEZXNjcmlwdG9ySGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCX0gZWxzZSBpZiAoTElDRU5TRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAobGljZW5zZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJbGljZW5zZXNIYW5kbGVyID0gbmV3IExpY2Vuc2VzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQ09QWVJJR0hUX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKGNvcHlyaWdodEhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQljb3B5cmlnaHRIYW5kbGVyID0gbmV3IENvcHlyaWdodEhhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJaWYgKGhvc3RSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPT0gbnVsbCB8fCBob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyLmdldEhvc3RSZXF1aXJlZENhcGFiaWxpdGllcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCWN1cnJlbnRVbml0ID0gbmV3IEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudFVuaXQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJKChJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKSBjdXJyZW50VW5pdCkuc2V0SG9zdChob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyLmdldEhvc3RSZXF1aXJlZENhcGFiaWxpdGllcygpKTsKLQkJCQl9Ci0JCQkJY3VycmVudFVuaXQuc2V0SWQoaWQpOwotCQkJCWN1cnJlbnRVbml0LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCQkJY3VycmVudFVuaXQuc2V0U2luZ2xldG9uKHNpbmdsZXRvbik7Ci0JCQkJT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcyA9IChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKDApIDogcHJvcGVydGllc0hhbmRsZXIuZ2V0UHJvcGVydGllcygpKTsKLQkJCQlTdHJpbmcgdXBkYXRlRnJvbSA9IG51bGw7Ci0JCQkJVmVyc2lvblJhbmdlIHVwZGF0ZVJhbmdlID0gbnVsbDsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBwcm9wZXJ0aWVzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCQkvL0JhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJCQkJaWYgKGtleS5lcXVhbHMoImVxdWlub3gucDIudXBkYXRlLmZyb20iKSkgewotCQkJCQkJdXBkYXRlRnJvbSA9IHZhbHVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGtleS5lcXVhbHMoImVxdWlub3gucDIudXBkYXRlLnJhbmdlIikpIHsKLQkJCQkJCXVwZGF0ZVJhbmdlID0gbmV3IFZlcnNpb25SYW5nZSh2YWx1ZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkvL0VuZCBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCQkJCWN1cnJlbnRVbml0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCQkJCX0KLQkJCQkvL0JhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJCQlpZiAodXBkYXRlRnJvbSAhPSBudWxsICYmIHVwZGF0ZVJhbmdlICE9IG51bGwpCi0JCQkJCWN1cnJlbnRVbml0LnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IodXBkYXRlRnJvbSwgdXBkYXRlUmFuZ2UsIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCQkJCS8vRW5kIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQotCQkJCWlmIChsaWNlbnNlc0hhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlMaWNlbnNlIGxpY2Vuc2UgPSBsaWNlbnNlc0hhbmRsZXIuZ2V0TGljZW5zZSgpOwotCQkJCQljdXJyZW50VW5pdC5zZXRMaWNlbnNlKGxpY2Vuc2UpOwotCQkJCX0KLQotCQkJCWlmIChjb3B5cmlnaHRIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJQ29weXJpZ2h0IGNvcHlyaWdodCA9IGNvcHlyaWdodEhhbmRsZXIuZ2V0Q29weXJpZ2h0KCk7Ci0JCQkJCWN1cnJlbnRVbml0LnNldENvcHlyaWdodChjb3B5cmlnaHQpOwotCQkJCX0KLQotCQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gKHByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVswXSA6IHByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlci5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpKTsKLQkJCQljdXJyZW50VW5pdC5zZXRDYXBhYmlsaXRpZXMocHJvdmlkZWRDYXBhYmlsaXRpZXMpOwotCQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gKHJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVswXSA6IHJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlci5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKTsKLQkJCQljdXJyZW50VW5pdC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZENhcGFiaWxpdGllcyk7Ci0JCQkJaWYgKGZpbHRlckhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQljdXJyZW50VW5pdC5zZXRGaWx0ZXIoZmlsdGVySGFuZGxlci5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsID8gbmV3IElBcnRpZmFjdEtleVswXSA6IGFydGlmYWN0c0hhbmRsZXIuZ2V0QXJ0aWZhY3RLZXlzKCkpOwotCQkJCWN1cnJlbnRVbml0LnNldEFydGlmYWN0cyhhcnRpZmFjdHMpOwotCQkJCWlmICh0b3VjaHBvaW50VHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQljdXJyZW50VW5pdC5zZXRUb3VjaHBvaW50VHlwZSh0b3VjaHBvaW50VHlwZUhhbmRsZXIuZ2V0VG91Y2hwb2ludFR5cGUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVE9ETzogY3JlYXRlIGFuIGVycm9yCi0JCQkJfQotCQkJCVRvdWNocG9pbnREYXRhW10gdG91Y2hwb2ludERhdGEgPSAodG91Y2hwb2ludERhdGFIYW5kbGVyID09IG51bGwgPyBuZXcgVG91Y2hwb2ludERhdGFbMF0gOiB0b3VjaHBvaW50RGF0YUhhbmRsZXIuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3VjaHBvaW50RGF0YS5sZW5ndGg7IGkrKykKLQkJCQkJY3VycmVudFVuaXQuYWRkVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGFbaV0pOwotCQkJCWlmICh1cGRhdGVEZXNjcmlwdG9ySGFuZGxlciAhPSBudWxsKQotCQkJCQljdXJyZW50VW5pdC5zZXRVcGRhdGVEZXNjcmlwdG9yKHVwZGF0ZURlc2NyaXB0b3JIYW5kbGVyLmdldFVwZGF0ZURlc2NyaXB0b3IoKSk7Ci0JCQkJdW5pdHMuYWRkKGN1cnJlbnRVbml0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBQcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgTGlzdCBwcm92aWRlZENhcGFiaWxpdGllczsKLQotCQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXRpZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFBST1ZJREVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZXRQcm92aWRlZENhcGFiaWxpdGllcygpIHsKLQkJCXJldHVybiAoUHJvdmlkZWRDYXBhYmlsaXR5W10pIHByb3ZpZGVkQ2FwYWJpbGl0aWVzLnRvQXJyYXkobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtwcm92aWRlZENhcGFiaWxpdGllcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJPVklERURfQ0FQQUJJTElUWV9FTEVNRU5UKSkgewotCQkJCW5ldyBQcm92aWRlZENhcGFiaWxpdHlIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHByb3ZpZGVkQ2FwYWJpbGl0aWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZWRDYXBhYmlsaXR5SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRVNQQUNFX0FUVFJJQlVURSwgTkFNRV9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQotCQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0IGNhcGFiaWxpdGllcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUFJPVklERURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkKTsKLQkJCVZlcnNpb24gdmVyc2lvbiA9IGNoZWNrVmVyc2lvbihQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJY2FwYWJpbGl0aWVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2ZXJzaW9uKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlZENhcGFiaWxpdGllczsKLQotCQlwdWJsaWMgSG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCQlyZXR1cm4gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXF1aXJlZENhcGFiaWxpdGllcy50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZWRDYXBhYmlsaXRpZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCkpIHsKLQkJCQluZXcgUmVxdWlyZWRDYXBhYmlsaXR5SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCByZXF1aXJlZENhcGFiaWxpdGllcyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlZENhcGFiaWxpdGllczsKLQotCQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpIHsKLQkJCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXF1aXJlZENhcGFiaWxpdGllcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKSkgewotCQkJCW5ldyBSZXF1aXJlZENhcGFiaWxpdHlIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVxdWlyZWRDYXBhYmlsaXR5SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRVNQQUNFX0FUVFJJQlVURSwgTkFNRV9BVFRSSUJVVEUsIFZFUlNJT05fUkFOR0VfQVRUUklCVVRFfTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBvcHRpb25hbCA9IG5ldyBTdHJpbmdbXSB7Q0FQQUJJTElUWV9PUFRJT05BTF9BVFRSSUJVVEUsIENBUEFCSUxJVFlfTVVMVElQTEVfQVRUUklCVVRFLCBDQVBBQklMSVRZX0dSRUVEX0FUVFJJQlVURX07Ci0KLQkJcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgY3VycmVudENhcGFiaWxpdHkgPSBudWxsOwotCi0JCXByaXZhdGUgVGV4dEhhbmRsZXIgZmlsdGVySGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgQ2FwYWJpbGl0eVNlbGVjdG9yc0hhbmRsZXIgc2VsZWN0b3JzSGFuZGxlciA9IG51bGw7Ci0KLQkJcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBjYXBhYmlsaXRpZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQsIG9wdGlvbmFsKTsKLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IGNoZWNrVmVyc2lvblJhbmdlKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCwgVkVSU0lPTl9SQU5HRV9BVFRSSUJVVEUsIHZhbHVlc1syXSk7Ci0JCQlib29sZWFuIGlzT3B0aW9uYWwgPSBjaGVja0Jvb2xlYW4oUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5ULCBDQVBBQklMSVRZX09QVElPTkFMX0FUVFJJQlVURSwgdmFsdWVzWzNdLCBmYWxzZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlib29sZWFuIGlzTXVsdGlwbGUgPSBjaGVja0Jvb2xlYW4oUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5ULCBDQVBBQklMSVRZX01VTFRJUExFX0FUVFJJQlVURSwgdmFsdWVzWzRdLCBmYWxzZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlib29sZWFuIGlzR3JlZWR5ID0gY2hlY2tCb29sZWFuKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCwgQ0FQQUJJTElUWV9HUkVFRF9BVFRSSUJVVEUsIHZhbHVlc1s1XSwgdHJ1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQljdXJyZW50Q2FwYWJpbGl0eSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHJhbmdlLCBudWxsLCBpc09wdGlvbmFsLCBpc011bHRpcGxlLCBpc0dyZWVkeSk7Ci0JCQljYXBhYmlsaXRpZXMuYWRkKGN1cnJlbnRDYXBhYmlsaXR5KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoQ0FQQUJJTElUWV9GSUxURVJfRUxFTUVOVCkpIHsKLQkJCQlmaWx0ZXJIYW5kbGVyID0gbmV3IFRleHRIYW5kbGVyKHRoaXMsIENBUEFCSUxJVFlfRklMVEVSX0VMRU1FTlQsIGF0dHJpYnV0ZXMpOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhDQVBBQklMSVRZX1NFTEVDVE9SU19FTEVNRU5UKSkgewotCQkJCXNlbGVjdG9yc0hhbmRsZXIgPSBuZXcgQ2FwYWJpbGl0eVNlbGVjdG9yc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYXBhYmlsaXR5ICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbHRlckhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudENhcGFiaWxpdHkuc2V0RmlsdGVyKGZpbHRlckhhbmRsZXIuZ2V0VGV4dCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0b3JzSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQljdXJyZW50Q2FwYWJpbGl0eS5zZXRTZWxlY3RvcnMoc2VsZWN0b3JzSGFuZGxlci5nZXRTZWxlY3RvcnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQXJ0aWZhY3RzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBMaXN0IGFydGlmYWN0czsKLQotCQlwdWJsaWMgQXJ0aWZhY3RzSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBBUlRJRkFDVF9LRVlTX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJYXJ0aWZhY3RzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKSB7Ci0JCQlyZXR1cm4gKElBcnRpZmFjdEtleVtdKSBhcnRpZmFjdHMudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W2FydGlmYWN0cy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoQVJUSUZBQ1RfS0VZX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IEFydGlmYWN0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBhcnRpZmFjdHMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBcnRpZmFjdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge0NMQVNTSUZJRVJfQVRUUklCVVRFLCBJRF9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQotCQlwdWJsaWMgQXJ0aWZhY3RIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgYXJ0aWZhY3RzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBBUlRJRkFDVF9LRVlfRUxFTUVOVCk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCk7Ci0JCQlWZXJzaW9uIHZlcnNpb24gPSBjaGVja1ZlcnNpb24oQVJUSUZBQ1RfS0VZX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJYXJ0aWZhY3RzLmFkZChuZXcgQXJ0aWZhY3RLZXkodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZlcnNpb24pKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBDYXBhYmlsaXR5U2VsZWN0b3JzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBMaXN0IHNlbGVjdG9yczsKLQotCQlwdWJsaWMgQ2FwYWJpbGl0eVNlbGVjdG9yc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgQ0FQQUJJTElUWV9TRUxFQ1RPUlNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQlzZWxlY3RvcnMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEFycmF5TGlzdChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBBcnJheUxpc3QoNCkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZ1tdIGdldFNlbGVjdG9ycygpIHsKLQkJCXJldHVybiAoU3RyaW5nW10pIHNlbGVjdG9ycy50b0FycmF5KG5ldyBTdHJpbmdbc2VsZWN0b3JzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhDQVBBQklMSVRZX1NFTEVDVE9SX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IFRleHRIYW5kbGVyKHRoaXMsIENBUEFCSUxJVFlfU0VMRUNUT1JfRUxFTUVOVCwgYXR0cmlidXRlcywgc2VsZWN0b3JzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG91Y2hwb2ludFR5cGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtJRF9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQotCQlUb3VjaHBvaW50VHlwZSB0b3VjaHBvaW50VHlwZSA9IG51bGw7Ci0KLQkJcHVibGljIFRvdWNocG9pbnRUeXBlSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCk7Ci0JCQlWZXJzaW9uIHZlcnNpb24gPSBjaGVja1ZlcnNpb24oVE9VQ0hQT0lOVF9UWVBFX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMV0pOwotCQkJdG91Y2hwb2ludFR5cGUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludFR5cGUodmFsdWVzWzBdLCB2ZXJzaW9uKTsKLQkJfQotCi0JCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJCXJldHVybiB0b3VjaHBvaW50VHlwZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb3VjaHBvaW50RGF0YUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCVRvdWNocG9pbnREYXRhIHRvdWNocG9pbnREYXRhID0gbnVsbDsKLQotCQlMaXN0IGRhdGEgPSBudWxsOwotCi0JCXB1YmxpYyBUb3VjaHBvaW50RGF0YUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgVE9VQ0hQT0lOVF9EQVRBX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJZGF0YSA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgVG91Y2hwb2ludERhdGFbXSBnZXRUb3VjaHBvaW50RGF0YSgpIHsKLQkJCVRvdWNocG9pbnREYXRhW10gcmVzdWx0ID0gbmV3IFRvdWNocG9pbnREYXRhW2RhdGEuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotCQkJCXJlc3VsdFtpXSA9ICgoVG91Y2hwb2ludEluc3RydWN0aW9uc0hhbmRsZXIpIGRhdGEuZ2V0KGkpKS5nZXRUb3VjaHBvaW50RGF0YSgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OU19FTEVNRU5UKSkgewotCQkJCWRhdGEuYWRkKG5ldyBUb3VjaHBvaW50SW5zdHJ1Y3Rpb25zSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBkYXRhKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvdWNocG9pbnRJbnN0cnVjdGlvbnNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlNYXAgaW5zdHJ1Y3Rpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgVG91Y2hwb2ludEluc3RydWN0aW9uc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBkYXRhKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05TX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJaW5zdHJ1Y3Rpb25zID0gKHNpemUgIT0gbnVsbCA/IG5ldyBMaW5rZWRIYXNoTWFwKG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IExpbmtlZEhhc2hNYXAoNCkpOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnREYXRhIGdldFRvdWNocG9pbnREYXRhKCkgewotCQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YShpbnN0cnVjdGlvbnMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05fRUxFTUVOVCkpIHsKLQkJCQluZXcgVG91Y2hwb2ludEluc3RydWN0aW9uSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBpbnN0cnVjdGlvbnMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb3VjaHBvaW50SW5zdHJ1Y3Rpb25IYW5kbGVyIGV4dGVuZHMgVGV4dEhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge1RPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9LRVlfQVRUUklCVVRFfTsKLQotCQlNYXAgaW5zdHJ1Y3Rpb25zID0gbnVsbDsKLQkJU3RyaW5nIGtleSA9IG51bGw7Ci0KLQkJcHVibGljIFRvdWNocG9pbnRJbnN0cnVjdGlvbkhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTWFwIGluc3RydWN0aW9ucykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OX0VMRU1FTlQpOwotCQkJa2V5ID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpWzBdOwotCQkJdGhpcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQkJaW5zdHJ1Y3Rpb25zLnB1dChrZXksIGdldFRleHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFVwZGF0ZURlc2NyaXB0b3JIYW5kbGVyIGV4dGVuZHMgVGV4dEhhbmRsZXIgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtJRF9BVFRSSUJVVEUsIFZFUlNJT05fUkFOR0VfQVRUUklCVVRFfTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBvcHRpb25hbCA9IG5ldyBTdHJpbmdbXSB7VVBEQVRFX0RFU0NSSVBUT1JfU0VWRVJJVFksIERFU0NSSVBUSU9OX0FUVFJJQlVURX07Ci0KLQkJcHJpdmF0ZSBJVXBkYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JCXB1YmxpYyBVcGRhdGVEZXNjcmlwdG9ySGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBvcHRpb25hbCk7Ci0JCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBjaGVja1ZlcnNpb25SYW5nZShSRVFVSVJFRF9DQVBBQklMSVRZX0VMRU1FTlQsIFZFUlNJT05fUkFOR0VfQVRUUklCVVRFLCB2YWx1ZXNbMV0pOwotCQkJaW50IHNldmVyaXR5ID0gbmV3IEludGVnZXIodmFsdWVzWzJdKS5pbnRWYWx1ZSgpOwotCQkJZGVzY3JpcHRvciA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKHZhbHVlc1swXSwgcmFuZ2UsIHNldmVyaXR5LCB2YWx1ZXNbM10pOwotCQl9Ci0KLQkJcHVibGljIElVcGRhdGVEZXNjcmlwdG9yIGdldFVwZGF0ZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBhIGxpc3Qgb2YgbGljZW5zZXMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExpY2Vuc2VzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCS8vIE5vdGUgdGhpcyBoYW5kbGVyIGlzIHNldCB1cCB0byBoYW5kbGUgbXVsdGlwbGUgbGljZW5zZSBlbGVtZW50cywgYnV0IGZvciBub3cKLQkJLy8gdGhlIEFQSSBmb3IgSUluc3RhbGxhYmxlVW5pdCBvbmx5IHJlZmxlY3RzIG9uZS4KLQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY5MTEKLQkJcHJpdmF0ZSBMaXN0IGxpY2Vuc2VzOwotCi0JCXB1YmxpYyBMaWNlbnNlc0hhbmRsZXIoQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBMSUNFTlNFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCWxpY2Vuc2VzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDIpKTsKLQkJfQotCi0JCXB1YmxpYyBMaWNlbnNlIGdldExpY2Vuc2UoKSB7Ci0JCQlpZiAobGljZW5zZXMuc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKExpY2Vuc2UpIGxpY2Vuc2VzLmdldCgwKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoTElDRU5TRV9FTEVNRU5UKSkgewotCQkJCW5ldyBMaWNlbnNlSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBsaWNlbnNlcyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAJSGFuZGxlciBmb3IgYSBsaWNlbnNlIGluIGFuIGxpc3Qgb2YgbGljZW5zZXMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExpY2Vuc2VIYW5kbGVyIGV4dGVuZHMgVGV4dEhhbmRsZXIgewotCi0JCVN0cmluZyB1cmwgPSBudWxsOwotCi0JCXByaXZhdGUgZmluYWwgTGlzdCBsaWNlbnNlczsKLQotCQlwdWJsaWMgTGljZW5zZUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBsaWNlbnNlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgTElDRU5TRV9FTEVNRU5UKTsKLQkJCXVybCA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgVVJMX0FUVFJJQlVURSk7Ci0JCQl0aGlzLmxpY2Vuc2VzID0gbGljZW5zZXM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQlsaWNlbnNlcy5hZGQobmV3IExpY2Vuc2UodXJsLCBnZXRUZXh0KCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBhIGNvcHlyaWdodC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29weXJpZ2h0SGFuZGxlciBleHRlbmRzIFRleHRIYW5kbGVyIHsKLQotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJcHJpdmF0ZSBDb3B5cmlnaHQgY29weXJpZ2h0OwotCi0JCXB1YmxpYyBDb3B5cmlnaHRIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIENPUFlSSUdIVF9FTEVNRU5UKTsKLQkJCXVybCA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgVVJMX0FUVFJJQlVURSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQljb3B5cmlnaHQgPSBuZXcgQ29weXJpZ2h0KHVybCwgZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBDb3B5cmlnaHQgZ2V0Q29weXJpZ2h0KCkgewotCQkJcmV0dXJuIGNvcHlyaWdodDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vTWV0YWRhdGFXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vTWV0YWRhdGFXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1OTMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW87Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlLlhNTFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRhZGF0YVdyaXRlciBleHRlbmRzIFhNTFdyaXRlciBpbXBsZW1lbnRzIFhNTENvbnN0YW50cyB7Ci0KLQlwdWJsaWMgTWV0YWRhdGFXcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dCwgUHJvY2Vzc2luZ0luc3RydWN0aW9uW10gcGlFbGVtZW50cykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlzdXBlcihvdXRwdXQsIHBpRWxlbWVudHMpOwotCQkvLyBUT0RPOiBhZGQgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGZvciB0aGUgbWV0YWRhdGEgdmVyc2lvbgotCX0KLQotCS8qKgotCSAqIFdyaXRlcyBhIGxpc3Qgb2Yge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9LgotCSAqIEBwYXJhbSB1bml0cyBBbiBJdGVyYXRvciBvZiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0uCi0JICogQHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiB1bml0cyB0byB3cml0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlSW5zdGFsbGFibGVVbml0cyhJdGVyYXRvciB1bml0cywgaW50IHNpemUpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybjsKLQkJc3RhcnQoSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCk7Ci0JCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBzaXplKTsKLQkJd2hpbGUgKHVuaXRzLmhhc05leHQoKSkKLQkJCXdyaXRlSW5zdGFsbGFibGVVbml0KChJSW5zdGFsbGFibGVVbml0KSB1bml0cy5uZXh0KCkpOwotCQllbmQoSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVJbnN0YWxsYWJsZVVuaXQoSUluc3RhbGxhYmxlVW5pdCByZXNvbHZlZElVKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSByZXNvbHZlZElVLnVucmVzb2x2ZWQoKTsKLQkJc3RhcnQoSU5TVEFMTEFCTEVfVU5JVF9FTEVNRU5UKTsKLQkJYXR0cmlidXRlKElEX0FUVFJJQlVURSwgaXUuZ2V0SWQoKSk7Ci0JCWF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQlVURSwgaXUuZ2V0VmVyc2lvbigpKTsKLQkJYXR0cmlidXRlKFNJTkdMRVRPTl9BVFRSSUJVVEUsIGl1LmlzU2luZ2xldG9uKCksIHRydWUpOwotCQkvLwkJYXR0cmlidXRlKEZSQUdNRU5UX0FUVFJJQlVURSwgaXUuaXNGcmFnbWVudCgpLCBmYWxzZSk7Ci0KLQkJaWYgKGl1LmlzRnJhZ21lbnQoKSAmJiBpdSBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgewotCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGZyYWdtZW50ID0gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgaXU7Ci0JCQl3cml0ZUhvc3RSZXF1aXJlZENhcGFiaWxpdGllcyhmcmFnbWVudC5nZXRIb3N0KCkpOwotCQl9Ci0KLQkJd3JpdGVVcGRhdGVEZXNjcmlwdG9yKHJlc29sdmVkSVUsIHJlc29sdmVkSVUuZ2V0VXBkYXRlRGVzY3JpcHRvcigpKTsKLQkJd3JpdGVQcm9wZXJ0aWVzKGl1LmdldFByb3BlcnRpZXMoKSk7Ci0JCXdyaXRlUHJvdmlkZWRDYXBhYmlsaXRpZXMoaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCXdyaXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCXdyaXRlVHJpbW1lZENkYXRhKElVX0ZJTFRFUl9FTEVNRU5ULCBpdS5nZXRGaWx0ZXIoKSk7Ci0KLQkJd3JpdGVBcnRpZmFjdEtleXMoaXUuZ2V0QXJ0aWZhY3RzKCkpOwotCQl3cml0ZVRvdWNocG9pbnRUeXBlKGl1LmdldFRvdWNocG9pbnRUeXBlKCkpOwotCQl3cml0ZVRvdWNocG9pbnREYXRhKGl1LmdldFRvdWNocG9pbnREYXRhKCkpOwotCQl3cml0ZUxpY2Vuc2VzKGl1LmdldExpY2Vuc2UoKSk7Ci0JCXdyaXRlQ29weXJpZ2h0KGl1LmdldENvcHlyaWdodCgpKTsKLQotCQllbmQoSU5TVEFMTEFCTEVfVU5JVF9FTEVNRU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUhvc3RSZXF1aXJlZENhcGFiaWxpdGllcyhSZXF1aXJlZENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMpIHsKLQkJaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsICYmIGNhcGFiaWxpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlzdGFydChIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoY2FwYWJpbGl0aWVzW2ldKTsKLQkJCX0KLQkJCWVuZChIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlUHJvdmlkZWRDYXBhYmlsaXRpZXMoUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzKSB7Ci0JCWlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCAmJiBjYXBhYmlsaXRpZXMubGVuZ3RoID4gMCkgewotCQkJc3RhcnQoUFJPVklERURfQ0FQQUJJTElUSUVTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIGNhcGFiaWxpdGllcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGFydChQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQpOwotCQkJCWF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotCQkJCWF0dHJpYnV0ZShOQU1FX0FUVFJJQlVURSwgY2FwYWJpbGl0aWVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCBjYXBhYmlsaXRpZXNbaV0uZ2V0VmVyc2lvbigpKTsKLQkJCQllbmQoUFJPVklERURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChQUk9WSURFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcykgewotCQlpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwgJiYgY2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KFJFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoY2FwYWJpbGl0aWVzW2ldKTsKLQkJCX0KLQkJCWVuZChSRVFVSVJFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVVwZGF0ZURlc2NyaXB0b3IoSUluc3RhbGxhYmxlVW5pdCBpdSwgSVVwZGF0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN0YXJ0KFVQREFURV9ERVNDUklQVE9SX0VMRU1FTlQpOwotCQlhdHRyaWJ1dGUoSURfQVRUUklCVVRFLCBkZXNjcmlwdG9yLmdldElkKCkpOwotCQlhdHRyaWJ1dGUoVkVSU0lPTl9SQU5HRV9BVFRSSUJVVEUsIGRlc2NyaXB0b3IuZ2V0UmFuZ2UoKSk7Ci0JCWF0dHJpYnV0ZShVUERBVEVfREVTQ1JJUFRPUl9TRVZFUklUWSwgZGVzY3JpcHRvci5nZXRTZXZlcml0eSgpKTsKLQkJYXR0cmlidXRlKERFU0NSSVBUSU9OX0FUVFJJQlVURSwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKTsKLQkJZW5kKFVQREFURV9ERVNDUklQVE9SX0VMRU1FTlQpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLQkJc3RhcnQoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJYXR0cmlidXRlKE5BTUVTUEFDRV9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlKFZFUlNJT05fUkFOR0VfQVRUUklCVVRFLCBjYXBhYmlsaXR5LmdldFJhbmdlKCkpOwotCQlhdHRyaWJ1dGUoQ0FQQUJJTElUWV9PUFRJT05BTF9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuaXNPcHRpb25hbCgpLCBmYWxzZSk7Ci0JCWF0dHJpYnV0ZShDQVBBQklMSVRZX01VTFRJUExFX0FUVFJJQlVURSwgY2FwYWJpbGl0eS5pc011bHRpcGxlKCksIGZhbHNlKTsKLQkJYXR0cmlidXRlKENBUEFCSUxJVFlfR1JFRURfQVRUUklCVVRFLCBjYXBhYmlsaXR5LmlzR3JlZWR5KCksIHRydWUpOwotCQl3cml0ZVRyaW1tZWRDZGF0YShDQVBBQklMSVRZX0ZJTFRFUl9FTEVNRU5ULCBjYXBhYmlsaXR5LmdldEZpbHRlcigpKTsKLQotCQlTdHJpbmdbXSBzZWxlY3RvcnMgPSBjYXBhYmlsaXR5LmdldFNlbGVjdG9ycygpOwotCQlpZiAoc2VsZWN0b3JzLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KENBUEFCSUxJVFlfU0VMRUNUT1JTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHNlbGVjdG9ycy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWxlY3RvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQl3cml0ZVRyaW1tZWRDZGF0YShDQVBBQklMSVRZX1NFTEVDVE9SX0VMRU1FTlQsIHNlbGVjdG9yc1tqXSk7Ci0JCQl9Ci0JCQllbmQoQ0FQQUJJTElUWV9TRUxFQ1RPUlNfRUxFTUVOVCk7Ci0JCX0KLQotCQllbmQoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFydGlmYWN0S2V5cyhJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdEtleXMpIHsKLQkJaWYgKGFydGlmYWN0S2V5cyAhPSBudWxsICYmIGFydGlmYWN0S2V5cy5sZW5ndGggPiAwKSB7Ci0JCQlzdGFydChBUlRJRkFDVF9LRVlTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIGFydGlmYWN0S2V5cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGFydChBUlRJRkFDVF9LRVlfRUxFTUVOVCk7Ci0JCQkJYXR0cmlidXRlKEFSVElGQUNUX0tFWV9DTEFTU0lGSUVSX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldENsYXNzaWZpZXIoKSk7Ci0JCQkJYXR0cmlidXRlKElEX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldElkKCkpOwotCQkJCWF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldFZlcnNpb24oKSk7Ci0JCQkJZW5kKEFSVElGQUNUX0tFWV9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChBUlRJRkFDVF9LRVlTX0VMRU1FTlQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZSB0b3VjaHBvaW50VHlwZSkgewotCQlzdGFydChUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCk7Ci0JCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIHRvdWNocG9pbnRUeXBlLmdldElkKCkpOwotCQlhdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJVVEUsIHRvdWNocG9pbnRUeXBlLmdldFZlcnNpb24oKSk7Ci0JCWVuZChUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVUb3VjaHBvaW50RGF0YShUb3VjaHBvaW50RGF0YVtdIHRvdWNocG9pbnREYXRhKSB7Ci0JCWlmICh0b3VjaHBvaW50RGF0YSAhPSBudWxsICYmIHRvdWNocG9pbnREYXRhLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KFRPVUNIUE9JTlRfREFUQV9FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCB0b3VjaHBvaW50RGF0YS5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3VjaHBvaW50RGF0YS5sZW5ndGg7IGkrKykgewotCQkJCVRvdWNocG9pbnREYXRhIG5leHREYXRhID0gdG91Y2hwb2ludERhdGFbaV07Ci0JCQkJTWFwIGluc3RydWN0aW9ucyA9IG5leHREYXRhLmdldEluc3RydWN0aW9ucygpOwotCQkJCWlmIChpbnN0cnVjdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJCQlzdGFydChUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05TX0VMRU1FTlQpOwotCQkJCQlhdHRyaWJ1dGUoQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSwgaW5zdHJ1Y3Rpb25zLnNpemUoKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluc3RydWN0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlzdGFydChUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05fRUxFTUVOVCk7Ci0JCQkJCQlhdHRyaWJ1dGUoVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OX0tFWV9BVFRSSUJVVEUsIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJCWNkYXRhKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCksIHRydWUpOwotCQkJCQkJZW5kKFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVuZChUT1VDSFBPSU5UX0RBVEFfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUcmltbWVkQ2RhdGEoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBmaWx0ZXIpIHsKLQkJU3RyaW5nIHRyaW1tZWQ7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiAodHJpbW1lZCA9IGZpbHRlci50cmltKCkpLmxlbmd0aCgpID4gMCkgewotCQkJc3RhcnQoZWxlbWVudCk7Ci0JCQljZGF0YSh0cmltbWVkKTsKLQkJCWVuZChlbGVtZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUxpY2Vuc2VzKExpY2Vuc2UgbGljZW5zZSkgewotCQlpZiAobGljZW5zZSAhPSBudWxsKSB7Ci0JCQkvLyBJbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGxpY2Vuc2UsIHNvIHdlIHdyaXRlIHRoaXMgCi0JCQkvLyBhcyBhIGNvbGxlY3Rpb24gb2Ygb25lLgotCQkJLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2OTExCi0JCQlzdGFydChMSUNFTlNFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCAxKTsKLQkJCXN0YXJ0KExJQ0VOU0VfRUxFTUVOVCk7Ci0JCQlpZiAobGljZW5zZS5nZXRVUkwoKSAhPSBudWxsKQotCQkJCWF0dHJpYnV0ZShVUkxfQVRUUklCVVRFLCBsaWNlbnNlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJY2RhdGEobGljZW5zZS5nZXRCb2R5KCksIHRydWUpOwotCQkJZW5kKExJQ0VOU0VfRUxFTUVOVCk7Ci0JCQllbmQoTElDRU5TRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDb3B5cmlnaHQoQ29weXJpZ2h0IGNvcHlyaWdodCkgewotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwpIHsKLQkJCXN0YXJ0KENPUFlSSUdIVF9FTEVNRU5UKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvcHlyaWdodC5nZXRVUkwoKSAhPSBudWxsKQotCQkJCQlhdHRyaWJ1dGUoVVJMX0FUVFJJQlVURSwgY29weXJpZ2h0LmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEFjdGl2YXRvci5JRCwgIkVycm9yIHdyaXRpbmcgdGhlIGNvcHlyaWdodCBVUkw6ICIgKyBjb3B5cmlnaHQuZ2V0VVJMKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2RhdGEoY29weXJpZ2h0LmdldEJvZHkoKSwgdHJ1ZSk7Ci0JCQllbmQoQ09QWVJJR0hUX0VMRU1FTlQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9YTUxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vWE1MQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzk1N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9YTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbnN0YW50cyBleHRlbmRzIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MQ29uc3RhbnRzIHsKLQotCS8vIENvbnN0YW50cyBkZWZpbmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBYTUwgZm9yIG1ldGFkYXRhIG9iamVjdHMKLQotCS8vIEEgZm9ybWF0IHZlcnNpb24gbnVtYmVyIGZvciBtZXRhZGF0YSBYTUwuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uIENVUlJFTlRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDAsIDAsIDEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblJhbmdlIFhNTF9UT0xFUkFOQ0UgPSBuZXcgVmVyc2lvblJhbmdlKENVUlJFTlRfVkVSU0lPTiwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQotCS8vIENvbnN0YW50cyBmb3IgcHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9NRVRBREFUQV9UQVJHRVQgPSAibWV0YWRhdGEiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIG1ldGFkYXRhIGVsZW1lbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCA9ICJ1bml0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQgPSAidW5pdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3Igc3ViLWVsZW1lbnRzIG9mIGFuIGluc3RhbGxhYmxlIHVuaXQgZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0tFWVNfRUxFTUVOVCA9ICJhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfS0VZX0VMRU1FTlQgPSAiYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfQ0FQQUJJTElUSUVTX0VMRU1FTlQgPSAicmVxdWlyZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9SRVFVSVJFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCA9ICJob3N0UmVxdWlyZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCA9ICJwcm92aWRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQgPSAicHJvdmlkZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hQT0lOVF9UWVBFX0VMRU1FTlQgPSAidG91Y2hwb2ludCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSFBPSU5UX0RBVEFfRUxFTUVOVCA9ICJ0b3VjaHBvaW50RGF0YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVV9GSUxURVJfRUxFTUVOVCA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0RFU0NSSVBUT1JfRUxFTUVOVCA9ICJ1cGRhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIGF0dHJpYnV0ZXMgb2YgYW4gaW5zdGFsbGFibGUgdW5pdCBlbGVtZW50Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFVE9OX0FUVFJJQlVURSA9ICJzaW5nbGV0b24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfQVRUUklCVVRFID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29uc3RhbnRzIGZvciBzdWItZWxlbWVudHMgb2YgYSByZXF1aXJlZCBjYXBhYmlsaXR5IGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX0ZJTFRFUl9FTEVNRU5UID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1NFTEVDVE9SU19FTEVNRU5UID0gInNlbGVjdG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1NFTEVDVE9SX0VMRU1FTlQgPSAic2VsZWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIGF0dHJpYnV0ZXMgb2YgYSByZXF1aXJlZCBjYXBhYmlsaXR5IGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX09QVElPTkFMX0FUVFJJQlVURSA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX01VTFRJUExFX0FUVFJJQlVURSA9ICJtdWx0aXBsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX0dSRUVEX0FUVFJJQlVURSA9ICJncmVlZHkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIGF0dHJpYnV0ZXMgb2YgYW4gYXJ0aWZhY3Qga2V5IGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9LRVlfQ0xBU1NJRklFUl9BVFRSSUJVVEUgPSAiY2xhc3NpZmllciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3Igc3ViLWVsZW1lbnRzIG9mIGEgdG91Y2hwb2ludCBkYXRhIGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05TX0VMRU1FTlQgPSAiaW5zdHJ1Y3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9FTEVNRU5UID0gImluc3RydWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29uc3RhbnRzIGZvciBhdHRyaWJ1dGVzIG9mIGFuIGEgdG91Y2hwb2ludCBkYXRhIGluc3RydWN0aW9uIGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05fS0VZX0FUVFJJQlVURSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIGF0dHJpYnV0ZXMgb2YgYW4gdXBkYXRlIGRlc2NyaXB0b3IKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfREVTQ1JJUFRPUl9TRVZFUklUWSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0MmU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlvX2ZhaWxlZFJlYWQ9VW5hYmxlIHRvIHJlYWQgcmVwb3NpdG9yeSBhdCB7MH0KLWlvX2ZhaWxlZFdyaXRlPVVuYWJsZSB0byB3cml0ZSByZXBvc2l0b3J5IGF0IHswfQotaW9fSW5jb21wYXRpYmxlVmVyc2lvbj1cCi0JTWV0YWRhdGEgcmVwb3NpdG9yeSBoYXMgaW5jb21wYXRpYmxlIHZlcnNpb24gezB9OyBleHBlY3RlZCB7MX0KLWlvX3BhcnNlRXJyb3I9XAotCUVycm9yIHBhcnNpbmcgbWV0YWRhdGEgcmVwb3NpdG9yeQotCi1SRVBPX0xPQURJTkcgPSBMb2FkaW5nIHRoZSByZXBvc2l0b3J5IHswfQotUkVQT01HUl9BRERJTkdfUkVQTyA9IEFkZGluZyByZXBvc2l0b3J5IHswfQotCi1yZXBvTWFuX2V4aXN0cz1SZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGF0IHswfQotcmVwb01hbl9mYWlsZWRSZWFkPVRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSByZWFkOiB7MH0KLXJlcG9NYW5faW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvcgotcmVwb01hbl9ub3RFeGlzdHM9Tm8gcmVwb3NpdG9yeSBmb3VuZCBhdCB7MH0KLXJlcG9NYW5fdW5rbm93blR5cGU9VW5rbm93biByZXBvc2l0b3J5IHR5cGUgYXQgezB9Ci1yZXBvTWFuX2ludmFsaWRMb2NhdGlvbj17MH0gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeSBsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9JTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMDg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5JUXVlcnlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeTsKLQotLyoqCi0gKiBBIG1ldGFkYXRhIHJlcG9zaXRvcnkgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIGluc3RhbGxhYmxlIHVuaXRzCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAgTWV0YWRhdGEgcmVwb3NpdG9yeQotICogaW1wbGVtZW50YXRpb25zIG11c3Qgc3ViY2xhc3Mge0BsaW5rIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5fSByYXRoZXIgdGhhbiAKLSAqIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0YWRhdGFSZXBvc2l0b3J5IGV4dGVuZHMgSVJlcG9zaXRvcnksIElRdWVyeWFibGUgewotCi0JLyoqIAotCSAqIEFkZCB0aGUgZ2l2ZW4gaW5zdGFsbGFibGUgdW5pdHMgdG8gdGhpcyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIGluc3RhbGxhYmxlVW5pdHMgdGhlIGluc3RhbGxhYmxlIHVudHMgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gaW5zdGFsbGFibGVVbml0cyk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBpbnN0YWxsYWJsZSB1bml0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBxdWVyeSBmcm9tIHRoaXMgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnkgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRvIHJlbW92ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSB1bml0cyB3ZXJlIGFjdHVhbGx5IHJlbW92ZWQsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnN0YWxsYWJsZVVuaXRzKFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBpbnN0YWxsYWJsZSB1bml0cyBmcm9tIHRoaXMgcmVwb3NpdG9yeS4gIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Yzg0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5JUXVlcnlhYmxlOwotCi0vKioKLSAqIFRoZSBtZXRhZGF0YSByZXBvc2l0b3J5IG1hbmFnZXIgaXMgdXNlZCB0byBjcmVhdGUsIGFjY2VzcywgYW5kIG1hbmlwdWxhdGUKLSAqIHtAbGluayBJTWV0YWRhdGFSZXBvc2l0b3J5fSBpbnN0YW5jZXMuIFRoZSBtYW5hZ2VyIGtlZXBzIHRyYWNrIG9mIGEgCi0gKiBzZXQgb2Yga25vd24gcmVwb3NpdG9yaWVzLCBhbmQgcHJvdmlkZXMgY2FjaGluZyBvZiB0aGVzZSBrbm93biByZXBvc2l0b3JpZXMKLSAqIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxvYWRpbmcgb2YgcmVwb3NpdG9yaWVzIGZyb20gdGhlIGRpc2sgb3IgbmV0d29yay4gIFRoZQotICogbWFuYWdlciBmaXJlcyB7QGxpbmsgUmVwb3NpdG9yeUV2ZW50fXMgd2hlbiB0aGUgc2V0IG9mIGtub3duIHJlcG9zaXRvcmllcwotICogY2hhbmdlcy4KLSAqIAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIGV4dGVuZHMgSVF1ZXJ5YWJsZSB7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYWxsIHJlcG9zaXRvcmllcyBhcmUgb2YgaW50ZXJlc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SSUVTX0FMTCA9IDA7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgc3lzdGVtIHJlcG9zaXRvcmllcyBhcmUgb2YgaW50ZXJlc3QuCi0JICogQHNlZSBJUmVwb3NpdG9yeSNQUk9QX1NZU1RFTQotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfU1lTVEVNID0gMSA8PCAwOwotCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vbi1zeXN0ZW0gcmVwb3NpdG9yaWVzIGFyZSBvZiBpbnRlcmVzdAotCSAqIEBzZWUgSVJlcG9zaXRvcnkjUFJPUF9TWVNURU0KLQkgKiBAc2VlICNnZXRLbm93blJlcG9zaXRvcmllcyhpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SSUVTX05PTl9TWVNURU0gPSAxIDw8IDE7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwgcmVwb3NpdG9yaWVzIGFyZSBvZiBpbnRlcmVzdC4KLQkgKiBAc2VlICNnZXRLbm93blJlcG9zaXRvcmllcyhpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SSUVTX0xPQ0FMID0gMSA8PCAyOwotCi0JLyoqCi0JICogUmVwb3NpdG9yeSB0eXBlIGZvciBhIHNpbXBsZSByZXBvc2l0b3J5IGJhc2VkIG9uIGEgVVJMIG9yIGxvY2FsIGZpbGUgc3lzdGVtIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0lNUExFX1JFUE9TSVRPUlkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LnNpbXBsZVJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgcmVwb3NpdG9yeSB0byB0aGUgbGlzdCBvZiBtZXRhZGF0YSByZXBvc2l0b3JpZXMgdHJhY2tlZCBieSB0aGUgcmVwb3NpdG9yeQotCSAqIG1hbmFnZXIuCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IG1ldGFkYXRhIHJlcG9zaXRvcnkgb2YgdGhlIGdpdmVuIHR5cGUgYXQgCi0JICogdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeSBpcyA8Yj5ub3Q8L2I+IGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5Ci0JICogdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gQ2xpZW50cyBtdXN0IG1ha2UgYSBzdWJzZXF1ZW50IGNhbGwgdG8ge0BsaW5rICNhZGRSZXBvc2l0b3J5KFVSTCl9Ci0JICogaWYgdGhleSB3YW50IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIgdG8gcmVtZW1iZXIgdGhlIHJlcG9zaXRvcnkgZm9yIHN1YnNlcXVlbnQKLQkgKiBsb2FkIGF0dGVtcHRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gdHlwZSB0aGUga2luZCBvZiByZXBvc2l0b3J5IHRvIGNyZWF0ZQotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgdHlwZSBpcyB1bmtub3duLjwvbGk+Ci0JICogPGxpPlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPkEgcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBsb2NhdGlvbnMga25vd24gdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBhIHZhbGlkIHJlcG9zaXRvcnkKLQkgKiBleGlzdHMgYXQgYW55IG9mIHRoZSByZXR1cm5lZCBsb2NhdGlvbnMgYXQgYW55IHBhcnRpY3VsYXIgbW9tZW50IGluIHRpbWUuCi0JICogQSBzdWJzZXF1ZW50IGF0dGVtcHQgdG8gbG9hZCBhIHJlcG9zaXRvcnkgYXQgYW55IG9mIHRoZSBnaXZlbiBsb2NhdGlvbnMgbWF5Ci0JICogb3IgbWF5IG5vdCBzdWNjZWVkLgotCSAqIAotCSAqIEBwYXJhbSBmbGFncyBhbiBpbnRlZ2VyIGJpdC1tYXNrIGluZGljYXRpbmcgd2hpY2ggcmVwb3NpdG9yaWVzIHNob3VsZCBiZQotCSAqIHJldHVybmVkLiAgPGNvZGU+UkVQT1NJVE9SSUVTX0FMTDwvY29kZT4gY2FuIGJlIHVzZWQgYXMgdGhlIG1hc2sgd2hlbgotCSAqIGFsbCByZXBvc2l0b3JpZXMgc2hvdWxkIGJlIHJldHVybmVkLiAgV2hlcmUgbXVsdGlwbGUgbWFza3MgYXJlIGNvbWJpbmVkLCBvbmx5Ci0JICogdGhlIHJlcG9zaXRvcmllcyB0aGF0IHNhdGlzZnkgYWxsIHRoZSBnaXZlbiBjcml0ZXJpYSBhcmUgcmV0dXJuZWQuIEZvciBleGFtcGxlLAotCSAqIGEgZmxhZyB2YWx1ZSBvZiAoUkVQT1NJVE9SSUVTX1NZU1RFTXxSRVBPU0lUT1JJRVNfTE9DQUwpIHdpbGwgb25seQotCSAqIHJldHVybiByZXBvc2l0b3JpZXMgdGhhdCBhcmUgYm90aCBzeXN0ZW0gYW5kIGxvY2FsIHJlcG9zaXRvcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHJlcG9zaXRvcmllcyBtYW5hZ2VkIGJ5IHRoaXMgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqIAotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19BTEwKLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfU1lTVEVNCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0xPQ0FMCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX05PTl9TWVNURU0KLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50IGZsYWdzKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gVVJMLCAKLQkgKiB3aXRob3V0IGxvYWRpbmcgdGhlIHJlcG9zaXRvcnkuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHNvbWUgcHJvcGVydGllcyBmb3IgYSByZXBvc2l0b3J5IGNhbiBvbmx5IGJlCi0JICogZGV0ZXJtaW5lZCB3aGVuIHRoYXQgcmVwb3NpdG9yeSBpcyBsb2FkZWQuICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGZvciBzdWNoIHByb3BlcnRpZXMuICBPbmx5IHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxyZWFkeQotCSAqIGtub3duIGJ5IGEgcmVwb3NpdG9yeSBtYW5hZ2VyIHdpbGwgYmUgcmV0dXJuZWQuIAotCSAqIDxwPgotCSAqIElmIGEgY2xpZW50IHdpc2hlcyB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlIGZyb20gYSByZXBvc2l0b3J5IAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvc3Qgb2YgcmV0cmlldmluZyBpdCwgdGhlIGNsaWVudCBzaG91bGQgbG9hZCB0aGUgCi0JICogcmVwb3NpdG9yeSBhbmQgdGhlbiByZXRyaWV2ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkgaW4gcXVlc3Rpb24KLQkgKiBAcGFyYW0ga2V5IHRoZSBTdHJpbmcga2V5IG9mIHRoZSBwcm9wZXJ0eSBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVwb3NpdG9yeQotCSAqIGRvZXMgbm90IGV4aXN0LCB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIG9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSAKLQkgKiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0IGxvYWRpbmcgdGhlIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHNlZSAjbG9hZFJlcG9zaXRvcnkoVVJMLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzZWUgSVJlcG9zaXRvcnkjZ2V0UHJvcGVydGllcygpCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5UHJvcGVydHkoVVJMIGxvY2F0aW9uLCBTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIExvYWRzIGEgcmVwb3NpdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkwuICBJZiBhIHJlcG9zaXRvcnkgaGFzCi0JICogcHJldmlvdXNseSBiZWVuIGxvYWRlZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24sIHRoZSBzYW1lIGNhY2hlZCByZXBvc2l0b3J5Ci0JICogbWF5IGJlIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgdHJhY2tlZCBieQotCSAqIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuIENsaWVudHMgbXVzdCBtYWtlIGEgc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjcmVtb3ZlUmVwb3NpdG9yeShVUkwpfQotCSAqIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciB0byByZW1lbWJlciB0aGUgcmVwb3NpdG9yeSBmb3Igc3Vic2VxdWVudAotCSAqIGxvYWQgYXR0ZW1wdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gbG9hZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIFRoZSBsb2FkZWQgbWV0YWRhdGEgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24gY291bGQgbm90IGJlIHJlYWQuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGxvYWRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSByZXBvc2l0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVSTC4gVGhpcyBtZXRob2QgZGlzY2FyZHMKLQkgKiBhbnkgY2FjaGVkIHN0YXRlIGhlbGQgYnkgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBhbmQgcmVsb2FkcyB0aGUgcmVwb3NpdG9yeQotCSAqIGNvbnRlbnRzLiBUaGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBsb2NhdGlvbiBtdXN0IGFscmVhZHkgYmUga25vd24gdG8gdGhlIHJlcG9zaXRvcnkKLQkgKiBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gcmVmcmVzaAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIFRoZSByZWZyZXNoZWQgbWV0YWRhdGEgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIGxvY2F0aW9uIGlzIG5vdCBrbm93biB0byB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLjwvbGk+Ci0JICogPGxpPlRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uIGNvdWxkIG5vdCBiZSByZWFkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSByZWZyZXNoUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGZyb20gdGhlIGxpc3Qgb2YKLQkgKiBtZXRhZGF0YSByZXBvc2l0b3JpZXMgdHJhY2tlZCBieSB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLiAgVGhlIHVuZGVybHlpbmcKLQkgKiByZXBvc2l0b3J5IGlzIG5vdCBkZWxldGVkLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gcmVtb3ZlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJlcG9zaXRvcnkgd2FzIHJlbW92ZWQsIGFuZCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIGdpdmVuIFVSTCBhbmQgcmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgYSB2YWxpZCByZXBvc2l0b3J5IGlzIGxpa2VseQotCSAqIHRvIGJlIGZvdW5kIGF0IHRoZSBnaXZlbiBVUkwuICBDYWxsZXJzIG11c3QgYXNzdW1lIHRoYXQgdGhlIHZhbGlkaXR5IG9mIGEgCi0JICogcmVwb3NpdG9yeSBsb2NhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVseSBkZXRlcm1pbmVkIHVudGlsIGFuIGF0dGVtcHQgdG8gbG9hZCAKLQkgKiB0aGUgcmVwb3NpdG9yeSBpcyBtYWRlLiAgCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGluZGljYXRpbmcgd2hldGhlciBhIHZhbGlkIHJlcG9zaXRvcnkgaXMgbGlrZWx5IGxvY2F0ZWQgYXQgdGhlCi0JICogbG9jYXRpb24uICBBIHN0YXR1cyB3aXRoIHNldmVyaXR5IDxjb2RlPk9LPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3NpdG9yeSBpcwotCSAqIGxpa2VseSB0byBiZSBsb2FkYWJsZSwgb3IgdGhhdCBhcyBtdWNoIHZhbGlkYXRpb24gYXMgY291bGQgYmUgZG9uZSB3YXMgc3VjY2Vzc2Z1bC4KLQkgKiBSZWFzb25zIGZvciBhIG5vbi1PSyBzdGF0dXMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeSBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVSZXBvc2l0b3J5TG9jYXRpb24oVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0Fic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjNjMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LkFic3RyYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBtZXRhZGF0YSByZXBvc2l0b3JpZXMuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IHN1YmNsYXNzIHRoaXMgY2xhc3MuCi0gKiA8cD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZXBvc2l0b3J5IGltcGxlbWVudHMgSU1ldGFkYXRhUmVwb3NpdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlcG9zaXRvcnlTdGF0ZSB7Ci0JCXB1YmxpYyBTdHJpbmcgTmFtZTsKLQkJcHVibGljIFN0cmluZyBUeXBlOwotCQlwdWJsaWMgVmVyc2lvbiBWZXJzaW9uOwotCQlwdWJsaWMgU3RyaW5nIFByb3ZpZGVyOwotCQlwdWJsaWMgU3RyaW5nIERlc2NyaXB0aW9uOwotCQlwdWJsaWMgVVJMIExvY2F0aW9uOwotCQlwdWJsaWMgTWFwIFByb3BlcnRpZXM7Ci0JCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gVW5pdHM7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlzdXBlcigibm9OYW1lIiwgIm5vVHlwZSIsICJub1ZlcnNpb24iLCBudWxsLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplKFJlcG9zaXRvcnlTdGF0ZSBzdGF0ZSk7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgVVJMIGxvY2F0aW9uLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBwcm92aWRlcikgewotCQlzdXBlcihuYW1lLCB0eXBlLCB2ZXJzaW9uLCBsb2NhdGlvbiwgZGVzY3JpcHRpb24sIHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsYWJsZVVuaXRzKElJbnN0YWxsYWJsZVVuaXRbXSBpbnN0YWxsYWJsZVVuaXQpIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgbW9kaWZpYWJsZSIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUluc3RhbGxhYmxlVW5pdHMoUXVlcnkgcXVlcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIWlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG5vdCBtb2RpZmlhYmxlIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9JTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNkMWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgbWV0YWRhdGEgcmVwb3NpdG9yeSBvZiB0aGUgZ2l2ZW4gdHlwZSBhdCAKLQkgKiB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHR5cGUgdGhlIGtpbmQgb2YgcmVwb3NpdG9yeSB0byBjcmVhdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuPC9saT4KLQkgKiA8bGk+VGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGdpdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24uPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIExvYWRzIGEgcmVwb3NpdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkwuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byBsb2FkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gVGhlIGxvYWRlZCBtZXRhZGF0YSByZXBvc2l0b3J5Ci0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgbG9hZChVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIGNhbmRpZGF0ZSByZXBvc2l0b3J5IFVSTCBhbmQgcmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0aW5nIHRoZQotCSAqIGxpa2VsaWhvb2Qgb2YgYSB2YWxpZCByZXBvc2l0b3J5IGJlaW5nIGxvY2F0ZWQgYXQgdGhlIGxvY2F0aW9uLiAgSW1wbGVtZW50b3JzIAotCSAqIHNob3VsZCBtYWtlIGFsbCBhdHRlbXB0cyB0byB2YWxpZGF0ZSB0aGUgVVJMIHRoYXQgY2FuIGJlIG1hZGUgd2l0aG91dCAKLQkgKiBhY3R1YWxseSBsb2FkaW5nIHRoZSByZXBvc2l0b3J5LiAgVGhlIGNvbXB1dGF0aW9uIGZvciB0aGlzIG1ldGhvZCBtdXN0IGJlIAotCSAqIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4gIEVhcmx5IGRldGVjdGFibGUgZXJyb3IgCi0JICogY29uZGl0aW9ucywgc3VjaCBhcyB0aGUgbm9uLWV4aXN0ZW5jZSBvZiB0aGUgbG9jYXRpb24sIG9yIGFuIGluYWJpbGl0eSB0byByZWFkIAotCSAqIHRoZSBsb2NhdGlvbiwgc2hvdWxkIGJlIGRldGVybWluZWQgaW4gdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGluZGljYXRpbmcgd2hldGhlciBhIHZhbGlkIHJlcG9zaXRvcnkgaXMgbGlrZWx5IGxvY2F0ZWQgYXQgdGhlCi0JICogbG9jYXRpb24uICBBIHN0YXR1cyB3aXRoIHNldmVyaXR5IDxjb2RlPk9LPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3NpdG9yeSBpcwotCSAqIGxpa2VseSB0byBiZSBsb2FkYWJsZSwgb3IgdGhhdCBhcyBtdWNoIHZhbGlkYXRpb24gYXMgY291bGQgYmUgZG9uZSB3YXMgc3VjY2Vzc2Z1bC4KLQkgKiBSZWFzb25zIGZvciBhIG5vbi1PSyBzdGF0dXMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeSBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBhZTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L1NpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfRklMRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgY3JlYXRlKFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChsb2NhdGlvbi5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCBuYW1lKTsKLQkJcmV0dXJuIG5ldyBVUkxNZXRhZGF0YVJlcG9zaXRvcnkobG9jYXRpb24sIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgKiBtZXRhZGF0YSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0TG9jYWxGaWxlKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbnVsbDsKLQkJVVJMIGphckxvY2F0aW9uID0gVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCBKQVJfRVhURU5TSU9OKTsKLQkJVVJMIHhtbExvY2F0aW9uID0gVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCBYTUxfRVhURU5TSU9OKTsKLQkJLy8gSWYgdGhlIHJlcG9zaXRvcnkgaXMgbG9jYWwsIHdlIGNhbiByZXR1cm4gdGhlIHJlcG9zaXRvcnkgZmlsZSBkaXJlY3RseQotCQlpZiAoUFJPVE9DT0xfRklMRS5lcXVhbHMoeG1sTG9jYXRpb24uZ2V0UHJvdG9jb2woKSkpIHsKLQkJCS8vbG9vayBmb3IgYSBjb21wcmVzc2VkIGxvY2FsIGZpbGUKLQkJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGphckxvY2F0aW9uLmdldFBhdGgoKSk7Ci0JCQlpZiAobG9jYWxGaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBsb2NhbEZpbGU7Ci0JCQkvL2xvb2sgZm9yIGFuIHVuY29tcHJlc3NlZCBsb2NhbCBmaWxlCi0JCQlsb2NhbEZpbGUgPSBuZXcgRmlsZSh4bWxMb2NhdGlvbi5nZXRQYXRoKCkpOwotCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbG9jYWxGaWxlOwotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgbXNnLCBudWxsKSk7Ci0JCX0KLQkJLy9maWxlIGlzIG5vdCBsb2NhbCwgc28gd2UgbmVlZCB0byBnZXQgYSBsb2NhbGx5IGNhY2hlZCBjb3B5Ci0JCUFnZW50TG9jYXRpb24gYWdlbnRMb2NhdGlvbiA9IChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgZGF0YUFyZWEgPSBhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKEFjdGl2YXRvci5JRCArICIvY2FjaGUvIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBkYXRhQXJlYUZpbGUgPSBVUkxVdGlsLnRvRmlsZShkYXRhQXJlYSk7Ci0JCWludCBoYXNoQ29kZSA9IGxvY2F0aW9uLmhhc2hDb2RlKCk7Ci0JCVVSTCByZW1vdGVMb2NhdGlvbjsKLQkJbG9uZyByZW1vdGVUaW1lc3RhbXAgPSBnZXRUcmFuc3BvcnQoKS5nZXRMYXN0TW9kaWZpZWQoamFyTG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWlmIChyZW1vdGVUaW1lc3RhbXAgIT0gMCkgewotCQkJLy9yZW1vdGUgZmlsZSBpcyBpbiBqYXIgZm9ybQotCQkJcmVtb3RlTG9jYXRpb24gPSBqYXJMb2NhdGlvbjsKLQkJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgQ09OVEVOVF9GSUxFTkFNRSArIGhhc2hDb2RlICsgSkFSX0VYVEVOU0lPTik7Ci0JCX0gZWxzZSB7Ci0JCQkvL2NoZWNrIGZvciByZW1vdGUgZmlsZSBpbiB4bWwgZm9ybQotCQkJcmVtb3RlVGltZXN0YW1wID0gZ2V0VHJhbnNwb3J0KCkuZ2V0TGFzdE1vZGlmaWVkKHhtbExvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJaWYgKHJlbW90ZVRpbWVzdGFtcCA9PSAwKSB7Ci0JCQkJLy90aGVyZSBpcyBubyByZW1vdGUgZmlsZSBpbiBlaXRoZXIgZm9ybQotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBtc2csIG51bGwpKTsKLQkJCX0KLQkJCXJlbW90ZUxvY2F0aW9uID0geG1sTG9jYXRpb247Ci0JCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShkYXRhQXJlYUZpbGUsIENPTlRFTlRfRklMRU5BTUUgKyBoYXNoQ29kZSArIFhNTF9FWFRFTlNJT04pOwotCQl9Ci0JCWxvbmcgY2FjaGVUaW1lc3RhbXAgPSBsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCS8vaWYgdGhlIGNhY2hlIGlzIG91dCBvZiBkYXRlLCByZWZyZXNoIHdpdGggbGF0ZXN0IGNvbnRlbnRzCi0JCWlmIChyZW1vdGVUaW1lc3RhbXAgPiBjYWNoZVRpbWVzdGFtcCkgewotCQkJbG9jYWxGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCU91dHB1dFN0cmVhbSBtZXRhZGF0YSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChyZW1vdGVMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBtZXRhZGF0YSwgbW9uaXRvcik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKQotCQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKHJlc3VsdCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1ldGFkYXRhLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRmlsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkjdmFsaWRhdGUoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJdmFsaWRhdGVBbmRMb2FkKGxvY2F0aW9uLCBmYWxzZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5I2xvYWQoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHZhbGlkYXRlQW5kTG9hZChsb2NhdGlvbiwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXRhZGF0YVJlcG9zaXRvcnkgdmFsaWRhdGVBbmRMb2FkKFVSTCBsb2NhdGlvbiwgYm9vbGVhbiBkb0xvYWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgdGltZSA9IDA7Ci0JCWZpbmFsIFN0cmluZyBkZWJ1Z01zZyA9ICJWYWxpZGF0aW5nIGFuZCBsb2FkaW5nIG1ldGFkYXRhIHJlcG9zaXRvcnkgIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoVHJhY2luZy5ERUJVR19NRVRBREFUQV9QQVJTSU5HKSB7Ci0JCQlUcmFjaW5nLmRlYnVnKGRlYnVnTXNnICsgbG9jYXRpb24pOwotCQkJdGltZSA9IC1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA0MDApOwotCQl0cnkgewotCQkJRmlsZSBsb2NhbEZpbGUgPSBnZXRMb2NhbEZpbGUobG9jYXRpb24sIHN1Yi5uZXdDaGlsZCgzMDApKTsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhbEZpbGUpKTsKLQkJCUphcklucHV0U3RyZWFtIGphclN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vaWYgcmVhZGluZyBmcm9tIGEgamFyLCBvYnRhaW4gYSBzdHJlYW0gb24gdGhlIGVudHJ5IHdpdGggdGhlIGFjdHVhbCBjb250ZW50cwotCQkJCWlmIChsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoSkFSX0VYVEVOU0lPTikpIHsKLQkJCQkJamFyU3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGluU3RyZWFtKTsKLQkJCQkJSmFyRW50cnkgamFyRW50cnkgPSBqYXJTdHJlYW0uZ2V0TmV4dEphckVudHJ5KCk7Ci0JCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBVUkxNZXRhZGF0YVJlcG9zaXRvcnkuQ09OVEVOVF9GSUxFTkFNRSArIFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5YTUxfRVhURU5TSU9OOwotCQkJCQl3aGlsZSAoamFyRW50cnkgIT0gbnVsbCAmJiAoIWVudHJ5TmFtZS5lcXVhbHMoamFyRW50cnkuZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCWphckVudHJ5ID0gamFyU3RyZWFtLmdldE5leHRKYXJFbnRyeSgpOwotCQkJCQl9Ci0JCQkJCWlmIChqYXJFbnRyeSA9PSBudWxsKQotCQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludmFsaWRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQkJCQl9Ci0JCQkJLy9wYXJzZSB0aGUgcmVwb3NpdG9yeSBkZXNjcmlwdG9yIGZpbGUKLQkJCQlzdWIuc2V0V29ya1JlbWFpbmluZygxMDApOwotCQkJCWlmIChkb0xvYWQpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZGVzY3JpcHRvclN0cmVhbSA9IGphclN0cmVhbSAhPSBudWxsID8gamFyU3RyZWFtIDogaW5TdHJlYW07Ci0JCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVzdWx0ID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yeUlPKCkucmVhZChsb2NhbEZpbGUudG9VUkwoKSwgZGVzY3JpcHRvclN0cmVhbSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkpCi0JCQkJCQkoKExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KSByZXN1bHQpLmluaXRpYWxpemVBZnRlckxvYWQobG9jYXRpb24pOwotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgVVJMTWV0YWRhdGFSZXBvc2l0b3J5KQotCQkJCQkJKChVUkxNZXRhZGF0YVJlcG9zaXRvcnkpIHJlc3VsdCkuaW5pdGlhbGl6ZUFmdGVyTG9hZChsb2NhdGlvbik7Ci0JCQkJCWlmIChUcmFjaW5nLkRFQlVHX01FVEFEQVRBX1BBUlNJTkcpIHsKLQkJCQkJCXRpbWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQlUcmFjaW5nLmRlYnVnKGRlYnVnTXNnICsgInRpbWUgKG1zKTogIiArIHRpbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzYWZlQ2xvc2UoamFyU3RyZWFtKTsKLQkJCQlzYWZlQ2xvc2UoaW5TdHJlYW0pOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIHN0cmVhbSwgaWdub3JpbmcgYW55IHNlY29uZGFyeSBleGNlcHRpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhZmVDbG9zZShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJaWYgKHN0cmVhbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEVDRk1ldGFkYXRhVHJhbnNwb3J0IGdldFRyYW5zcG9ydCgpIHsKLQkJcmV0dXJuIEVDRk1ldGFkYXRhVHJhbnNwb3J0LmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmMDdmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDViNjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotI01vbiBOb3YgMDUgMTc6MDE6MjEgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkN2ZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gTm92IDA1IDE3OjAxOjIxIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjVkZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWRlZTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgTWV0YWRhdGEKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvQXJ0aWZhY3RLZXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9BcnRpZmFjdEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjAxOGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9BcnRpZmFjdEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKiAKLSAqIFRoZSBjb25jcmV0ZSB0eXBlIGZvciByZXByZXNlbnRpbmcgSUFydGlmYWN0S2V5J3MuCi0gKiA8cD4KLSAqIFNlZSB7bGluayBJQXJ0aWZhY3QgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpZmVjeWNsZSBvZiBhcnRpZmFjdCBrZXlzKSAKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0S2V5IGltcGxlbWVudHMgSUFydGlmYWN0S2V5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIiwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyOwotCXByaXZhdGUgZmluYWwgVmVyc2lvbiB2ZXJzaW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0QXJyYXlGcm9tTGlzdChTdHJpbmcgc3RyaW5nTGlzdCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAoc3RyaW5nTGlzdCA9PSBudWxsIHx8IHN0cmluZ0xpc3QudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gc2VwYXJhdG9yU2VlbiA9IHRydWU7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZ0xpc3QsIHNlcGFyYXRvciwgdHJ1ZSk7Ci0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKHRva2VuLmVxdWFscyhzZXBhcmF0b3IpKSB7Ci0JCQkJaWYgKHNlcGFyYXRvclNlZW4pCi0JCQkJCWxpc3QuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNlcGFyYXRvclNlZW4gPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlzZXBhcmF0b3JTZWVuID0gZmFsc2U7Ci0JCQkJaWYgKHRva2VuLmxlbmd0aCgpICE9IDApCi0JCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCX0KLQkJfQotCQlpZiAoc2VwYXJhdG9yU2VlbikKLQkJCWxpc3QuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0S2V5IHBhcnNlKFN0cmluZyBzcGVjaWZpY2F0aW9uKSB7Ci0JCVN0cmluZ1tdIHBhcnRzID0gZ2V0QXJyYXlGcm9tTGlzdChzcGVjaWZpY2F0aW9uLCBTRVBBUkFUT1IpOwotCQlpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBudW1iZXIgb2YgcGFydHMgaW4gYXJ0aWZhY3Qga2V5OiAiICsgc3BlY2lmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCWlmIChwYXJ0cy5sZW5ndGggPT0gMyAmJiBwYXJ0c1syXS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJdmVyc2lvbiA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKHBhcnRzWzJdKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgQXJ0aWZhY3RLZXkocGFydHNbMF0sIHBhcnRzWzFdLCB2ZXJzaW9uKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIHZlcnNpb24gc3ludGF4IGluIGFydGlmYWN0IGtleTogIiArIHNwZWNpZmljYXRpb24pLmluaXRDYXVzZShlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEFydGlmYWN0S2V5KFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbikgewotCQlzdXBlcigpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNsYXNzaWZpZXIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGlkKTsKLQkJQXNzZXJ0LmlzTm90TnVsbCh2ZXJzaW9uKTsKLQkJaWYgKGNsYXNzaWZpZXIuaW5kZXhPZihTRVBBUkFUT1IpICE9IC0xKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWEgbm90IGFsbG93ZWQgaW4gY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZC5pbmRleE9mKFNFUEFSQVRPUikgIT0gLTEpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYSBub3QgYWxsb3dlZCBpbiBpZCIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuY2xhc3NpZmllciA9IGNsYXNzaWZpZXI7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpZXIoKSB7Ci0JCXJldHVybiBjbGFzc2lmaWVyOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoYXNoID0gaWQuaGFzaENvZGUoKTsKLQkJaGFzaCA9IDE3ICogaGFzaCArIGdldFZlcnNpb24oKS5oYXNoQ29kZSgpOwotCQloYXNoID0gMTcgKiBoYXNoICsgY2xhc3NpZmllci5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gaWQgKyAnLycgKyBjbGFzc2lmaWVyICsgJy8nICsgZ2V0VmVyc2lvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIElBcnRpZmFjdEtleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlBcnRpZmFjdEtleSBhayA9IChJQXJ0aWZhY3RLZXkpIG9iajsKLQkJcmV0dXJuIGFrLmdldElkKCkuZXF1YWxzKGlkKSAmJiBhay5nZXRWZXJzaW9uKCkuZXF1YWxzKGdldFZlcnNpb24oKSkgJiYgYWsuZ2V0Q2xhc3NpZmllcigpLmVxdWFscyhjbGFzc2lmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b0V4dGVybmFsRm9ybSgpIHsKLQkJU3RyaW5nQnVmZmVyIGRhdGEgPSBuZXcgU3RyaW5nQnVmZmVyKGNsYXNzaWZpZXIpLmFwcGVuZChTRVBBUkFUT1IpOwotCQlkYXRhLmFwcGVuZChpZCkuYXBwZW5kKFNFUEFSQVRPUik7Ci0JCWRhdGEuYXBwZW5kKHZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkYXRhLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvSW5zdGFsbGFibGVVbml0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvSW5zdGFsbGFibGVVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2ZjYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVVuaXQgaW1wbGVtZW50cyBJSW5zdGFsbGFibGVVbml0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9yZGVyZWRQcm9wZXJ0aWVzIE5PX1BST1BFUlRJRVMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm92aWRlZENhcGFiaWxpdHlbXSBOT19QUk9WSURFUyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVxdWlyZWRDYXBhYmlsaXR5W10gTk9fUkVRVUlSRVMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRvdWNocG9pbnREYXRhW10gTk9fVE9VQ0hQT0lOVF9EQVRBID0gbmV3IFRvdWNocG9pbnREYXRhWzBdOwotCi0JU3RyaW5nIGFwcGxpY2FiaWxpdHlGaWx0ZXI7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHM7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIE9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0JUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBOT19QUk9WSURFUzsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzOwotCi0JcHJpdmF0ZSBib29sZWFuIHNpbmdsZXRvbjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHRvdWNocG9pbnREYXRhID0gbnVsbDsKLQotCXByaXZhdGUgVG91Y2hwb2ludFR5cGUgdG91Y2hwb2ludFR5cGU7Ci0KLQlwcml2YXRlIFZlcnNpb24gdmVyc2lvbjsKLQotCXByaXZhdGUgSVVwZGF0ZURlc2NyaXB0b3IgdXBkYXRlSW5mbzsKLQlwcml2YXRlIExpY2Vuc2UgbGljZW5zZTsKLQlwcml2YXRlIENvcHlyaWdodCBjb3B5cmlnaHQ7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVVbml0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnRpZXMoTWFwIG5ld1Byb3BlcnRpZXMpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXByb3BlcnRpZXMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMobmV3UHJvcGVydGllcy5zaXplKCkpOwotCQlwcm9wZXJ0aWVzLnB1dEFsbChuZXdQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm92aWRlZENhcGFiaWxpdHkoUHJvdmlkZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLQkJaWYgKHByb3ZpZGVkQ2FwYWJpbGl0aWVzICE9IG51bGwgJiYgcHJvdmlkZWRDYXBhYmlsaXRpZXMubGVuZ3RoID4gMCkgewotCQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcmVzdWx0ID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtwcm92aWRlZENhcGFiaWxpdGllcy5sZW5ndGggKyAxXTsKLQkJCXJlc3VsdFswXSA9IGNhcGFiaWxpdHk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb3ZpZGVkQ2FwYWJpbGl0aWVzLCAwLCByZXN1bHQsIDEsIHByb3ZpZGVkQ2FwYWJpbGl0aWVzLmxlbmd0aCk7Ci0JCQlwcm92aWRlZENhcGFiaWxpdGllcyA9IHJlc3VsdDsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjYXBhYmlsaXR5fTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRvdWNocG9pbnREYXRhKFRvdWNocG9pbnREYXRhIG5ld0RhdGEpIHsKLQkJZW5zdXJlVG91Y2hwb2ludERhdGFDYXBhY2l0eSgxKTsKLQkJdG91Y2hwb2ludERhdGEuYWRkKG5ld0RhdGEpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCB0b0NvbXBhcmVUbykgewotCQlpZiAoISh0b0NvbXBhcmVUbyBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSUluc3RhbGxhYmxlVW5pdCBvdGhlciA9IChJSW5zdGFsbGFibGVVbml0KSB0b0NvbXBhcmVUbzsKLQkJaWYgKGdldElkKCkuY29tcGFyZVRvKG90aGVyLmdldElkKCkpID09IDApCi0JCQlyZXR1cm4gKGdldFZlcnNpb24oKS5jb21wYXJlVG8ob3RoZXIuZ2V0VmVyc2lvbigpKSk7Ci0JCXJldHVybiBnZXRJZCgpLmNvbXBhcmVUbyhvdGhlci5nZXRJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlVG91Y2hwb2ludERhdGFDYXBhY2l0eShpbnQgc2l6ZSkgewotCQlpZiAodG91Y2hwb2ludERhdGEgIT0gbnVsbCkgewotCQkJdG91Y2hwb2ludERhdGEuZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0b3VjaHBvaW50RGF0YSA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgSUluc3RhbGxhYmxlVW5pdCBvdGhlciA9IChJSW5zdGFsbGFibGVVbml0KSBvYmo7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuZ2V0SWQoKSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghaWQuZXF1YWxzKG90aGVyLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0VmVyc2lvbigpID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5nZXRWZXJzaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWdldFZlcnNpb24oKS5lcXVhbHMob3RoZXIuZ2V0VmVyc2lvbigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhYmlsaXR5RmlsdGVyKCkgewotCQlyZXR1cm4gYXBwbGljYWJpbGl0eUZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gYXJ0aWZhY3RzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBnZXRGcmFnbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBwcm9wZXJ0aWVzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBJVSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIE9yZGVyZWRQcm9wZXJ0aWVzLnVubW9kaWZpYWJsZVByb3BlcnRpZXMocHJvcGVydGllcygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShrZXkpOwotCX0KLQotCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZXRQcm92aWRlZENhcGFiaWxpdGllcygpIHsKLQkJcmV0dXJuIChwcm92aWRlZENhcGFiaWxpdGllcyAhPSBudWxsID8gcHJvdmlkZWRDYXBhYmlsaXRpZXMgOiBOT19QUk9WSURFUyk7Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkgewotCQlyZXR1cm4gcmVxdWlyZXMgIT0gbnVsbCA/IHJlcXVpcmVzIDogTk9fUkVRVUlSRVM7Ci0KLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludERhdGFbXSBnZXRUb3VjaHBvaW50RGF0YSgpIHsKLQkJcmV0dXJuICh0b3VjaHBvaW50RGF0YSA9PSBudWxsID8gTk9fVE9VQ0hQT0lOVF9EQVRBIC8vCi0JCQkJOiAoVG91Y2hwb2ludERhdGFbXSkgdG91Y2hwb2ludERhdGEudG9BcnJheShuZXcgVG91Y2hwb2ludERhdGFbdG91Y2hwb2ludERhdGEuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJcmV0dXJuIHRvdWNocG9pbnRUeXBlICE9IG51bGwgPyB0b3VjaHBvaW50VHlwZSA6IFRvdWNocG9pbnRUeXBlLk5PTkU7Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaWQgPT0gbnVsbCkgPyAwIDogaWQuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChnZXRWZXJzaW9uKCkgPT0gbnVsbCkgPyAwIDogZ2V0VmVyc2lvbigpLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaW5nbGV0b24oKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JcHJpdmF0ZSBPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKHByb3BlcnRpZXMgIT0gbnVsbCA/IHByb3BlcnRpZXMgOiBOT19QUk9QRVJUSUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhYmlsaXR5RmlsdGVyKFN0cmluZyBsZGFwRmlsdGVyKSB7Ci0JCWFwcGxpY2FiaWxpdHlGaWx0ZXIgPSBsZGFwRmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhJQXJ0aWZhY3RLZXlbXSB2YWx1ZSkgewotCQlhcnRpZmFjdHMgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoUHJvdmlkZWRDYXBhYmlsaXR5W10gZXhwb3J0ZWRDYXBhYmlsaXRpZXMpIHsKLQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBleHBvcnRlZENhcGFiaWxpdGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8vIFRPRE86IHJlc29sdmUgdGhlIHNjaGl6b3BocmVuaWEgYmV0d2VlbiB0aGUgc2luZ2xldG9uIGltbXV0YWJsZSBkYXRhCi0JLy8JICAgCSBhbmQgdGhlIHB1YmxpYyByZXR1cm5lZCB0b3VjaHBvaW50IGRhdGEgYXJyYXkuCi0JcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlVG91Y2hwb2ludERhdGEoVG91Y2hwb2ludERhdGEgaW1tdXRhYmxlRGF0YSkgewotCQllbnN1cmVUb3VjaHBvaW50RGF0YUNhcGFjaXR5KDQpOwotCQl0b3VjaHBvaW50RGF0YS5hZGQoaW1tdXRhYmxlRGF0YSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gKHByb3BlcnRpZXMgIT0gbnVsbCA/IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKGtleSkgOiBudWxsKTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXByb3BlcnRpZXMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKTsKLQkJcmV0dXJuIChTdHJpbmcpIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoUmVxdWlyZWRDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzKSB7Ci0JCWlmIChjYXBhYmlsaXRpZXMgPT0gTk9fUkVRVUlSRVMpIHsKLQkJCXRoaXMucmVxdWlyZXMgPSBudWxsOwotCQl9IGVsc2UgewotCQkJLy9jb3B5IGFycmF5IGZvciBzYWZldHkKLQkJCXRoaXMucmVxdWlyZXMgPSAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIGNhcGFiaWxpdGllcy5jbG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2luZ2xldG9uKGJvb2xlYW4gc2luZ2xldG9uKSB7Ci0JCXRoaXMuc2luZ2xldG9uID0gc2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvdWNocG9pbnRUeXBlKFRvdWNocG9pbnRUeXBlIHR5cGUpIHsKLQkJdGhpcy50b3VjaHBvaW50VHlwZSA9ICh0eXBlICE9IFRvdWNocG9pbnRUeXBlLk5PTkUgPyB0eXBlIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihWZXJzaW9uIG5ld1ZlcnNpb24pIHsKLQkJdGhpcy52ZXJzaW9uID0gKG5ld1ZlcnNpb24gIT0gbnVsbCA/IG5ld1ZlcnNpb24gOiBWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGlkICsgJyAnICsgZ2V0VmVyc2lvbigpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IHVucmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBJVXBkYXRlRGVzY3JpcHRvciBnZXRVcGRhdGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdXBkYXRlSW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVEZXNjcmlwdG9yKElVcGRhdGVEZXNjcmlwdG9yIHVwZGF0ZUluZm8pIHsKLQkJdGhpcy51cGRhdGVJbmZvID0gdXBkYXRlSW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgbGljZW5zZSkgewotCQl0aGlzLmxpY2Vuc2UgPSBsaWNlbnNlOwotCX0KLQotCXB1YmxpYyBMaWNlbnNlIGdldExpY2Vuc2UoKSB7Ci0JCXJldHVybiBsaWNlbnNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChDb3B5cmlnaHQgY29weXJpZ2h0KSB7Ci0JCXRoaXMuY29weXJpZ2h0ID0gY29weXJpZ2h0OwotCX0KLQotCXB1YmxpYyBDb3B5cmlnaHQgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gY29weXJpZ2h0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9JbnN0YWxsYWJsZVVuaXRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGI3MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgZXh0ZW5kcyBJbnN0YWxsYWJsZVVuaXQgaW1wbGVtZW50cyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgewotCi0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHlbXSBob3N0UmVxdWlyZW1lbnRzOwotCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3QoUmVxdWlyZWRDYXBhYmlsaXR5W10gaG9zdFJlcXVpcmVtZW50cykgewotCQlpZiAoaG9zdFJlcXVpcmVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmhvc3RSZXF1aXJlbWVudHMgPSBob3N0UmVxdWlyZW1lbnRzOwotCQlhZGRSZXF1aXJlZENhcGFiaWxpdHkoaG9zdFJlcXVpcmVtZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlcXVpcmVkQ2FwYWJpbGl0eShSZXF1aXJlZENhcGFiaWxpdHlbXSB0b0FkZCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSBjdXJyZW50ID0gc3VwZXIuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVzdWx0ID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtjdXJyZW50Lmxlbmd0aCArIHRvQWRkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudCwgMCwgcmVzdWx0LCAwLCBjdXJyZW50Lmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodG9BZGQsIDAsIHJlc3VsdCwgY3VycmVudC5sZW5ndGgsIHRvQWRkLmxlbmd0aCk7Ci0JCXNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlc3VsdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGdldEhvc3QoKSB7Ci0JCXJldHVybiBob3N0UmVxdWlyZW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmNkYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUVVFUllfUFJPR1JFU1M7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9NZXRhZGF0YUFjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL01ldGFkYXRhQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTAzZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL01ldGFkYXRhQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfTUVUQURBVEEgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0YWRhdGFBY3RpdmF0b3IuY29udGV4dCA9IGFDb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGFkYXRhQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL1Jlc29sdmVkSW5zdGFsbGFibGVVbml0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxY2VhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6IAotICogCQlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJR2VudWl0ZWMsIExMQyAtIGFkZGVkIGxpY2Vuc2Ugc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlZEluc3RhbGxhYmxlVW5pdCBpbXBsZW1lbnRzIElJbnN0YWxsYWJsZVVuaXQgewotCXByaXZhdGUgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRbXSBOT19JVSA9IG5ldyBJSW5zdGFsbGFibGVVbml0WzBdOwotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gZnJhZ21lbnRzID0gTk9fSVU7Ci0JcHJvdGVjdGVkIElJbnN0YWxsYWJsZVVuaXQgb3JpZ2luYWw7Ci0KLQlwdWJsaWMgUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQoSUluc3RhbGxhYmxlVW5pdCByZXNvbHZlZCkgewotCQl0aGlzLm9yaWdpbmFsID0gcmVzb2x2ZWQ7Ci0JfQotCi0JcHVibGljIFJlc29sdmVkSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXQgcmVzb2x2ZWQsIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGZyYWdtZW50cykgewotCQl0aGlzLm9yaWdpbmFsID0gcmVzb2x2ZWQ7Ci0JCXRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBnZXRGcmFnbWVudHMoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChmcmFnbWVudHMgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmcmFnbWVudHMpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgZnJhZ21lbnQgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVzdWx0LmdldChpKTsKLQkJCWlmIChmcmFnbWVudC5pc1Jlc29sdmVkKCkpCi0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGZyYWdtZW50LmdldEZyYWdtZW50cygpKSk7Ci0JCX0KLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0cygpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldEFydGlmYWN0cygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0RmlsdGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldElkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRQcm9wZXJ0eShrZXkpOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChvcmlnaW5hbC5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZnJhZ21lbnRzW2ldLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCkpKTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChvcmlnaW5hbC5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZnJhZ21lbnRzW2ldLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkpKTsKLQkJfQotCQlyZXR1cm4gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXN1bHQudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3Jlc3VsdC5zaXplKCldKTsKLQotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50RGF0YVtdIGdldFRvdWNocG9pbnREYXRhKCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3Qob3JpZ2luYWwuZ2V0VG91Y2hwb2ludERhdGEoKSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJVG91Y2hwb2ludERhdGFbXSBkYXRhID0gZnJhZ21lbnRzW2ldLmdldFRvdWNocG9pbnREYXRhKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRhdGEubGVuZ3RoOyBqKyspIHsKLQkJCQlyZXN1bHQuYWRkKGRhdGFbal0pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVG91Y2hwb2ludERhdGFbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRvdWNocG9pbnREYXRhW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoKSB7Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRUb3VjaHBvaW50VHlwZSgpOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmlzRnJhZ21lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZXRvbigpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmlzU2luZ2xldG9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJLy9UT0RPIFRoaXMgaXMgcHJldHR5IHVnbHkuLi4uCi0JCWJvb2xlYW4gcmVzdWx0ID0gb3JpZ2luYWwuZXF1YWxzKG9iaik7Ci0JCWlmIChyZXN1bHQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc29sdmVkSW5zdGFsbGFibGVVbml0KQotCQkJcmV0dXJuIG9yaWdpbmFsLmVxdWFscygoKFJlc29sdmVkSW5zdGFsbGFibGVVbml0KSBvYmopLm9yaWdpbmFsKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG9yaWdpbmFsLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbUl0iICsgb3JpZ2luYWwudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldE9yaWdpbmFsKCkgewotCQlyZXR1cm4gb3JpZ2luYWw7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IHRvQ29tcGFyZVRvKSB7Ci0JCWlmICghKHRvQ29tcGFyZVRvIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlJSW5zdGFsbGFibGVVbml0IG90aGVyID0gKElJbnN0YWxsYWJsZVVuaXQpIHRvQ29tcGFyZVRvOwotCQlpZiAoZ2V0SWQoKS5jb21wYXJlVG8ob3RoZXIuZ2V0SWQoKSkgPT0gMCkKLQkJCXJldHVybiAoZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhvdGhlci5nZXRWZXJzaW9uKCkpKTsKLQkJcmV0dXJuIGdldElkKCkuY29tcGFyZVRvKG90aGVyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IHVucmVzb2x2ZWQoKSB7Ci0JCXJldHVybiBvcmlnaW5hbC51bnJlc29sdmVkKCk7Ci0JfQotCi0JcHVibGljIElVcGRhdGVEZXNjcmlwdG9yIGdldFVwZGF0ZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRVcGRhdGVEZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldExpY2Vuc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ29weXJpZ2h0IGdldENvcHlyaWdodCgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldENvcHlyaWdodCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL1VwZGF0ZURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9VcGRhdGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzkyMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL1VwZGF0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSVVwZGF0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJVXBkYXRlRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBWZXJzaW9uUmFuZ2UgcmFuZ2U7Ci0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0KLQlwdWJsaWMgVXBkYXRlRGVzY3JpcHRvcihTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnJhbmdlID0gcmFuZ2U7Ci0JCXRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFZlcnNpb25SYW5nZSBnZXRSYW5nZSgpIHsKLQkJcmV0dXJuIHJhbmdlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZU9mKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJaWYgKCFpZC5lcXVhbHMoaXUuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyYW5nZS5pc0luY2x1ZGVkKGl1LmdldFZlcnNpb24oKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGQ1NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVFVRVJZX1BST0dSRVNTPUV4ZWN1dGluZyBxdWVyeS4KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvQ29weXJpZ2h0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvQ29weXJpZ2h0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDE1NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0NvcHlyaWdodC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoZSA8Y29kZT5Db3B5cmlnaHQ8L2NvZGU+IGNsYXNzIHJlcHJlc2VudHMgYSBzb2Z0d2FyZSBjb3B5cmlnaHQuICBBIGNvcHlyaWdodCBoYXMgCi0gKiByZXF1aXJlZCBib2R5IHRleHQgd2hpY2ggbWF5IGJlIHRoZSBmdWxsIHRleHQgb3IgYW4gYW5ub3RhdGlvbi4gIEFuIG9wdGlvbmFsIFVSTCBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkCi0gKiB3aGljaCBsaW5rcyB0byBmdWxsIHRleHQuICAKLSAqLwotcHVibGljIGNsYXNzIENvcHlyaWdodCB7Ci0JLyoqCi0JICogVGhlIDxjb2RlPmJvZHk8L2NvZGU+IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgY295cHJpZ2h0LiBUaGlzIG1heQotCSAqIGJlIGEgc3VtbWFyeSBmb3IgYSBjb3B5cmlnaHQgc3BlY2lmaWVkIGluIGEgVVJMLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+dXJsPC9jb2RlPiBpcyB0aGUgVVJMIG9mIHRoZSBjb3B5cmlnaHQuCi0JICovCi0JcHJpdmF0ZSBVUkwgdXJsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb3B5cmlnaHQuCi0JICogVGhlIGJvZHkgc2hvdWxkIGNvbnRhaW4gdGhlIGZ1bGwgdGV4dCBvZiB0aGUgY29weXJpZ2h0LgotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBVUkwgb2YgdGhlIGZ1bGwgY29weXJpZ2h0IHRleHQsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBib2R5IHRoZSBjb3B5cmlnaHQgYm9keSwgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB0aGUgPGNvZGU+Ym9keTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29weXJpZ2h0KFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBib2R5KSB7Ci0JCWlmIChib2R5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJib2R5IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybFN0cmluZyAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXVybCA9IG51bGw7Ci0JCQl9Ci0JCXRoaXMuYm9keSA9IGJvZHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGNvbnRhaW5pbmcgdGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2UuCi0JICogTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpY2Vuc2UgYm9keS4KLQkgKiBAcmV0dXJuIHRoZSBsaWNlbnNlIGJvZHksIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb2R5KCkgewotCQlyZXR1cm4gYm9keTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSUFydGlmYWN0S2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSUFydGlmYWN0S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWM3MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lBcnRpZmFjdEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBQcm92aWRlIHN0YW5kYXJkaXplZCBhcnRpZmFjdCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgCi0gKiBjb3JyZXNwb25kaW5nIGJ5dGVzIChwZXJoYXBzIG5vdCBzdG9yZWQgYXMgYSBmaWxlKS4gCi0gKiA8cD4KLSAqIEFydGlmYWN0IGtleXMgcmVwcmVzZW50IGJvdGggYSB1bmlxdWUgb3BhcXVlIGlkZW50aWZpZXIgYXMgd2VsbCBhcyBzdHJ1Y3R1cmVkIAotICogYW5kIHN0YW5kYXJkaXplZCBwaWVjZXMgb2YgaW5mb3JtYXRpb24uCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RLZXkgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NpZmllciBmb3IgdGhpcyBhcnRpZmFjdCBrZXkuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgZW1wdHkuCi0JICogQHJldHVybiB0aGUgY2xhc3NpZmllciBzZWdtZW50IG9mIHRoZSBrZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc2lmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBmb3IgdGhpcyBhcnRpZmFjdCBrZXkuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgZW1wdHkuCi0JICogQHJldHVybiB0aGUgY2xhc3NpZmllciBzZWdtZW50IG9mIHRoZSBrZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiBmb3IgdGhpcyBhcnRpZmFjdCBrZXkuIAotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gc2VnbWVudCBvZiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzdHJpbmcgZm9ybSBvZiB0aGlzIGFydGlmYWN0IGtleS4KLQkgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGtleQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDYxMWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIAkJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJCUdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVVuaXQgZXh0ZW5kcyBDb21wYXJhYmxlIHsKLQotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBwcm9maWxlIGZsYXZvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfRkxBVk9SID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZmxhdm9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWVzcGFjZSByZXByZXNlbnRpbmcgYSBwYXJ0aWN1bGFyIEluc3RhbGxhYmxlVW5pdCBieSBpZC4KLQkgKiBFYWNoIEluc3RhbGxhYmxlVW5pdCBhdXRvbWF0aWNhbGx5IHByb3ZpZGVzIGEgY2FwYWJpbGl0eSBpbiB0aGlzIG5hbWVzcGFjZSByZXByZXNlbnRpbmcKLQkgKiBpdHNlbGYsIGFuZCBvdGhlciBJbnN0YWxsYWJsZVVuaXRzIGNhbiByZXF1aXJlIHN1Y2ggYSBjYXBhYmlsaXR5IHRvIHN0YXRlIHRoYXQgdGhleQotCSAqIHJlcXVpcmUgYSBwYXJ0aWN1bGFyIEluc3RhbGxhYmxlVW5pdCB0byBiZSBwcmVzZW50LgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxhYmxlVW5pdCNnZXRJZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0lVX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucGFydGlhbC5pdSI8L2NvZGU+KSBmb3IgYSAKLQkgKiBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhlIElVIGlzIGdlbmVyYXRlZCBmcm9tIGluY29tcGxldGUgaW5mb3JtYXRpb24gYW5kCi0JICogc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0ZSBJVSBpZiBhdmFpbGFibGUuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUEFSVElBTF9JVSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnBhcnRpYWwuaXUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5wcm9maWxlIjwvY29kZT4pIGZvciBhIAotCSAqIGJvb2xlYW4gcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IGFuIGluc3RhbGxhYmxlIHVuaXQgaXMgYSBwcm9maWxlLgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEVfUFJPRklMRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUucHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQJIAotCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBrZXkgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiPC9jb2RlPikgZm9yIGEgCi0JICogYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBhIGNhdGVnb3J5LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEVfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBrZXkgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiPC9jb2RlPikgZm9yIGEgCi0JICogYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBhIGZyYWdtZW50LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEVfRlJBR01FTlQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBrZXkgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZ3JvdXAiPC9jb2RlPikgZm9yIGEgCi0JICogYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBhIGdyb3VwLgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEVfR1JPVVAgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UT0RPIE1vdmUgdG8gVUkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST0ZJTEVfUk9PVF9JVSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUucm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb250YWN0IjwvY29kZT4pIGZvciBhIAotCSAqIFN0cmluZyBwcm9wZXJ0eSBjb250YWluaW5nIGEgY29udGFjdCBhZGRyZXNzIHdoZXJlIHByb2JsZW1zIGNhbiBiZSByZXBvcnRlZCwgCi0JICogc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzLgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTlRBQ1QgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb250YWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbiI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RFU0NSSVBUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBrZXkgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvYy51cmwiPC9jb2RlPikgZm9yIGEgCi0JICogU3RyaW5nIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBVUkwgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGluc3RhbGxhYmxlIHVuaXQuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRE9DX1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvYy51cmwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZSI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlciI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVuZG9yIG9yIHByb3ZpZGVyIG9mIHRoZSAKLQkgKiBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST1ZJREVSID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgb24gdGhpcyBpbnN0YWxsYWJsZSB1bml0LiBUaGUgZmlsdGVyIGlzIG1hdGNoZWQgYWdhaW5zdAotCSAqIHRoZSBzZWxlY3Rpb24gY29udGV4dCBvZiB0aGUgcHJvZmlsZSB0aGUgdW5pdCBpcyBpbnN0YWxsZWQgaW50by4gQW4gSVUgd2lsbCBub3QKLQkgKiBiZSBpbnN0YWxsZWQgaWYgaXQgaGFzIGEgZmlsdGVyIGNvbmRpdGlvbiB0aGF0IGlzIG5vdCBzYXRpc2ZpZWQgYnkgdGhlIGNvbnRleHQuCi0JICogCi0JICogU2VlIFByb2ZpbGUjZ2V0U2VsZWN0aW9uQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnJhZ21lbnRzIHRoYXQgaGF2ZSBiZWVuIGJvdW5kIHRvIHRoaXMgaW5zdGFsbGFibGUgdW5pdCwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHVuaXQgaXMgbm90IHJlc29sdmVkLgotCSAqIAotCSAqIEBzZWUgI2lzUmVzb2x2ZWQoKQotCSAqIEByZXR1cm4gVGhlIGZyYWdtZW50cyBib3VuZCB0byB0aGlzIGluc3RhbGxhYmxlIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGdldEZyYWdtZW50cygpOwotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogR2V0IGFuIDxpPnVubW9kaWZpYWJsZSBjb3B5PC9pPiBvZiB0aGUgcHJvcGVydGllcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGFsbGFibGUgdW5pdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxpPnVubW9kaWZpYWJsZSBjb3B5PC9pPiBvZiB0aGUgSVUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSk7Ci0KLQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCi0JcHVibGljIFRvdWNocG9pbnREYXRhW10gZ2V0VG91Y2hwb2ludERhdGEoKTsKLQotCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpOwotCi0JcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpOwotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFsbGFibGUgdW5pdCBoYXMgYmVlbiByZXNvbHZlZC4gQSByZXNvbHZlZAotCSAqIGluc3RhbGxhYmxlIHVuaXQgcmVwcmVzZW50cyB0aGUgdW5pb24gb2YgYW4gaW5zdGFsbGFibGUgdW5pdCBhbmQgc29tZQotCSAqIGZyYWdtZW50cy4KLQkgKiAKLQkgKiBAc2VlICNnZXRGcmFnbWVudHMoKQotCSAqIEBzZWUgI3VucmVzb2x2ZWQoKQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YWxsYWJsZSB1bml0IGlzIHJlc29sdmVkLCBhbmQgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZXRvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBlcXVpdmFsZW50IG9mIHRoaXMgaW5zdGFsbGFibGUgdW5pdC4gSWYgdGhpcyB1bml0IGlzCi0JICogYWxyZWFkeSB1bnJlc29sdmVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZWNlaXZlci4gT3RoZXJ3aXNlLCB0aGlzCi0JICogbWV0aG9kIHJldHVybnMgYW4gaW5zdGFsbGFibGUgdW5pdCB3aXRoIHRoZSBzYW1lIGlkIGFuZCB2ZXJzaW9uLCBidXQgd2l0aG91dAotCSAqIGFueSBmcmFnbWVudHMgYXR0YWNoZWQuCi0JICogCi0JICogQHNlZSAjZ2V0RnJhZ21lbnRzKCkKLQkgKiBAc2VlICNpc1Jlc29sdmVkKCkKLQkgKiBAcmV0dXJuIFRoZSB1bnJlc29sdmVkIGVxdWl2YWxlbnQgb2YgdGhpcyB1bml0Ci0JICovCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgdW5yZXNvbHZlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoaXMgaW5zdGFsbGFibGUgdW5pdCBpcyBhbiB1cGRhdGUgb2YuCi0JICogQHJldHVybiBUaGUgbGluZWFnZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGFsbGFibGUgdW5pdAotCSAqLwotCXB1YmxpYyBJVXBkYXRlRGVzY3JpcHRvciBnZXRVcGRhdGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWNlbnNlIHRoYXQgYXBwbGllcyB0byB0aGlzIGluc3RhbGxhYmxlIHVuaXQuCi0JICogQHJldHVybiB0aGUgbGljZW5zZSB0aGF0IGFwcGxpZXMgdG8gdGhpcyBpbnN0YWxsYWJsZSB1bml0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29weXJpZ2h0IHRoYXQgYXBwbGllcyB0byB0aGlzIGluc3RhbGxhYmxlIHVuaXQuCi0JICogQHJldHVybiB0aGUgY29weXJpZ2h0IHRoYXQgYXBwbGllcyB0byB0aGlzIGluc3RhbGxhYmxlIHVuaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29weXJpZ2h0IGdldENvcHlyaWdodCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0ZGU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgZXh0ZW5kcyBJSW5zdGFsbGFibGVVbml0IHsKLQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gZ2V0SG9zdCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JVXBkYXRlRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lVcGRhdGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YjNmNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lVcGRhdGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZURlc2NyaXB0b3IgewotCXB1YmxpYyBmaW5hbCBpbnQgTk9STUFMID0gMDsKLQlwdWJsaWMgZmluYWwgaW50IEhJR0ggPSAxOwotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgYW4gaW5zdGFsbGFibGUgdW5pdCB0aGF0IHRoZSBpbnN0YWxsYWJsZSB1bml0IGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgaXMgYW4gdXBkYXRlIGZvci4KLQkgKiBAcmV0dXJuIEFuIGluc3RhbGxhYmxlIHVuaXQgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBUaGUgcmFuZ2Ugb2YgdGhlIGluc3RhbGxhYmxlIHVuaXQgdGhhdCB0aGUgaW5zdGFsbGFibGUgdW5pdCBjb250YWluaW5nIHRoaXMgb2JqZWN0IGlzIGFuIHVwZGF0ZSBmb3IuCi0JICogQHJldHVybiBBIHZlcnNpb24gcmFuZ2UKLQkgKi8KLQlwdWJsaWMgVmVyc2lvblJhbmdlIGdldFJhbmdlKCk7Ci0KLQkvKioKLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHVwZGF0ZS4gVGhpcyBhbGxvd3MgdG8gZXhwbGFpbiB3aGF0IHRoZSB1cGRhdGUgaXMgYWJvdXQuCi0JICogQHJldHVybiBBIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIGltcG9ydGFuY2Ugb2YgdGhlIHVwZGF0ZSBkZXNjcmlwdG9yIHJlcHJlc2VudGVkIGFzIGEgaW50LgotCSAqIEByZXR1cm4gVGhlIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGFuIHVwZGF0ZSBmb3IgdGhlIGluc3RhbGxhYmxlIHVuaXQgcGFzc2VkICAKLQkgKiBAcGFyYW0gaXUgdGhlIGluc3RhbGxhYmxlIHVuaXQgY2hlY2tlZAotCSAqIEByZXR1cm4gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBhbiB1cGRhdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVPZihJSW5zdGFsbGFibGVVbml0IGl1KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9MaWNlbnNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTGljZW5zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q5ZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9MaWNlbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBHZW51aXRlYywgTExDIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJCUdlbnVpdGVjLCBMTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJSUJNIENvcnBvcmF0aW9uIC0gb3B0aW9uYWwgVVJMIGZpZWxkIGluc3RlYWQgb2YgcmVxdWlyZWQgbmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+TGljZW5zZTwvY29kZT4gY2xhc3MgcmVwcmVzZW50cyBhIHNvZnR3YXJlIGxpY2Vuc2UuICBBIGxpY2Vuc2UgaGFzIHJlcXVpcmVkIGJvZHkgdGV4dAotICogd2hpY2ggbWF5IGJlIHRoZSBmdWxsIHRleHQgb3IgYW4gYW5ub3RhdGlvbi4gIEFuIG9wdGlvbmFsIFVSTCBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkCi0gKiB3aGljaCBsaW5rcyB0byBmdWxsIHRleHQuICBMaWNlbnNlcyBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkIHVzaW5nIHRoZWlyIGRpZ2VzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlIHsKLQkvKioKLQkgKiBUaGUgPGNvZGU+Ym9keTwvY29kZT4gY29udGFpbnMgdGhlIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBsaWNlbnNlLiBUaGlzIG1heQotCSAqIGJlIGEgc3VtbWFyeSBmb3IgYSBmdWxsIGxpY2Vuc2Ugc3BlY2lmaWVkIGluIGEgVVJMLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+dXJsPC9jb2RlPiBpcyB0aGUgVVJMIG9mIHRoZSBsaWNlbnNlLgotCSAqLwotCXByaXZhdGUgVVJMIHVybDsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5kaWdlc3Q8L2NvZGU+IGlzIHRoZSBjYWNoZWQgbWVzc2FnZSBkaWdlc3Qgb2YgdGhlIG5vcm1hbGl6ZWQgYm9keQotCSAqLwotCXByaXZhdGUgQmlnSW50ZWdlciBkaWdlc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpY2Vuc2Ugb2JqZWN0IHdoaWNoIGlzIGlkZW50aWZpZWQgYnkgdXNlcnMgdXNpbmcgdGhlIDxjb2RlPmJvZHk8L2NvZGU+IGZpZWxkLgotCSAqIFRoZSBib2R5IHNob3VsZCBjb250YWluIGVpdGhlciB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG9yIGFuIGFubm90YXRpb24gZm9yIGEgbGljZW5zZQotCSAqIGZ1bGx5IHNwZWNpZmllZCBpbiB0aGUgVVJMIGF0IHVybFN0cmluZy4KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVVJMIG9mIHRoZSBmdWxsIGxpY2Vuc2UsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBib2R5IHRoZSBsaWNlbnNlIGJvZHksIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gdGhlIDxjb2RlPmJvZHk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIExpY2Vuc2UoU3RyaW5nIHVybFN0cmluZywgU3RyaW5nIGJvZHkpIHsKLQkJaWYgKGJvZHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJvZHkgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsU3RyaW5nICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdXJsID0gbnVsbDsKLQkJCX0KLQkJdGhpcy5ib2R5ID0gYm9keTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgY29udGFpbmluZyB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zZS4KLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGljZW5zZSBib2R5LgotCSAqIEByZXR1cm4gdGhlIGxpY2Vuc2UgYm9keSwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIHRoZSBsaWNlbnNlIGJvZHkuICBUaGUgZGlnZXN0IGlzIGNhbGN1bGF0ZWQgb24gYSBub3JtYWxpemVkCi0JICogdmVyc2lvbiBvZiB0aGUgbGljZW5zZSB3aGVyZSBhbGwgd2hpdGVzcGFjZSBoYXMgYmVlbiByZWR1Y2VkIHRvIG9uZSBzcGFjZS4KLQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdCBhcyBhIDxjb2RlPkJpZ0ludGVnZXI8L2NvZGU+LCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQmlnSW50ZWdlciBnZXREaWdlc3QoKSB7Ci0JCWlmIChkaWdlc3QgPT0gbnVsbCkKLQkJCWRpZ2VzdCA9IGNhbGN1bGF0ZUxpY2Vuc2VEaWdlc3QoKTsKLQkJcmV0dXJuIGRpZ2VzdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBMaWNlbnNlKSB7Ci0JCQlMaWNlbnNlIG90aGVyID0gKExpY2Vuc2UpIG9iajsKLQkJCWlmIChvdGhlci5nZXREaWdlc3QoKS5lcXVhbHMoZ2V0RGlnZXN0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0RGlnZXN0KCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcml2YXRlIEJpZ0ludGVnZXIgY2FsY3VsYXRlTGljZW5zZURpZ2VzdCgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBub3JtYWxpemUoZ2V0Qm9keSgpKTsKLQkJdHJ5IHsKLQkJCU1lc3NhZ2VEaWdlc3QgYWxnb3JpdGhtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFsZ29yaXRobS5yZXNldCgpOwotCQkJYWxnb3JpdGhtLnVwZGF0ZShtZXNzYWdlLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnl0ZVtdIGRpZ2VzdEJ5dGVzID0gYWxnb3JpdGhtLmRpZ2VzdCgpOwotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKDEsIGRpZ2VzdEJ5dGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2Ugd2l0aCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIGxpY2Vuc2UpIHsKLQkJU3RyaW5nIHRleHQgPSBsaWNlbnNlLnRyaW0oKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJYm9vbGVhbiBmb3VuZFdoaXRlc3BhY2UgPSBmYWxzZTsKLQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpICYmIGkgPCBsZW5ndGgpIHsKLQkJCQlmb3VuZFdoaXRlc3BhY2UgPSB0cnVlOwotCQkJCWMgPSB0ZXh0LmNoYXJBdCgrK2kpOwotCQkJfQotCQkJaWYgKGZvdW5kV2hpdGVzcGFjZSkKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQlpZiAoaSA8IGxlbmd0aCkKLQkJCQlyZXN1bHQuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODM2ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL01ldGFkYXRhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEEgZmFjdG9yeSBjbGFzcyBmb3IgaW5zdGFudGlhdGluZyB2YXJpb3VzIHAyIG1ldGFkYXRhIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gewotCQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVVbml0IHVuaXQ7Ci0KLQkJcHVibGljIEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFRvdWNocG9pbnREYXRhKFRvdWNocG9pbnREYXRhIGRhdGEpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZGF0YSk7Ci0JCQl1bml0KCkuYWRkVG91Y2hwb2ludERhdGEoZGF0YSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhYmlsaXR5RmlsdGVyKFN0cmluZyBsZGFwRmlsdGVyKSB7Ci0JCQl1bml0KCkuc2V0QXBwbGljYWJpbGl0eUZpbHRlcihsZGFwRmlsdGVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhJQXJ0aWZhY3RLZXlbXSB2YWx1ZSkgewotCQkJdW5pdCgpLnNldEFydGlmYWN0cyh2YWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoUHJvdmlkZWRDYXBhYmlsaXR5W10gZXhwb3J0ZWRDYXBhYmlsaXRpZXMpIHsKLQkJCXVuaXQoKS5zZXRDYXBhYmlsaXRpZXMoZXhwb3J0ZWRDYXBhYmlsaXRpZXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQkJCXVuaXQoKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQkJdW5pdCgpLnNldElkKGlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoTGljZW5zZSBsaWNlbnNlKSB7Ci0JCQl1bml0KCkuc2V0TGljZW5zZShsaWNlbnNlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChDb3B5cmlnaHQgY29weXJpZ2h0KSB7Ci0JCQl1bml0KCkuc2V0Q29weXJpZ2h0KGNvcHlyaWdodCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCXVuaXQoKS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcykgewotCQkJdW5pdCgpLnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTaW5nbGV0b24oYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJCXVuaXQoKS5zZXRTaW5nbGV0b24oc2luZ2xldG9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRvdWNocG9pbnRUeXBlKFRvdWNocG9pbnRUeXBlIHR5cGUpIHsKLQkJCXVuaXQoKS5zZXRUb3VjaHBvaW50VHlwZSh0eXBlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oVmVyc2lvbiBuZXdWZXJzaW9uKSB7Ci0JCQl1bml0KCkuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFVwZGF0ZURlc2NyaXB0b3IoSVVwZGF0ZURlc2NyaXB0b3IgdXBkYXRlSW5mbykgewotCQkJdW5pdCgpLnNldFVwZGF0ZURlc2NyaXB0b3IodXBkYXRlSW5mbyk7Ci0JCX0KLQotCQlJbnN0YWxsYWJsZVVuaXQgdW5pdCgpIHsKLQkJCWlmICh1bml0ID09IG51bGwpCi0JCQkJdW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXQoKTsKLQkJCXJldHVybiB1bml0OwotCQl9Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0Q3JlYXRlKCkgewotCQkJSUluc3RhbGxhYmxlVW5pdCByZXN1bHQgPSB1bml0KCk7Ci0JCQl0aGlzLnVuaXQgPSBudWxsOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBleHRlbmRzIEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIHsKLQkJcHVibGljIHZvaWQgc2V0SG9zdChSZXF1aXJlZENhcGFiaWxpdHlbXSBob3N0UmVxdWlyZW1lbnRzKSB7Ci0JCQkoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSB1bml0KCkpLnNldEhvc3QoaG9zdFJlcXVpcmVtZW50cyk7Ci0JCX0KLQotCQlJbnN0YWxsYWJsZVVuaXQgdW5pdCgpIHsKLQkJCWlmICh1bml0ID09IG51bGwpCi0JCQkJdW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCgpOwotCQkJcmV0dXJuIHVuaXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gdG91Y2hwb2ludCBkYXRhIGZvciBhIHRvdWNocG9pbnQgd2l0aCBubyBpbnN0cnVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVG91Y2hwb2ludERhdGEgRU1QVFlfVE9VQ0hQT0lOVF9EQVRBID0gbmV3IFRvdWNocG9pbnREYXRhKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBUb3VjaHBvaW50VHlwZVtdIHR5cGVDYWNoZSA9IG5ldyBUb3VjaHBvaW50VHlwZVs1XTsKLQotCXByaXZhdGUgc3RhdGljIGludCB0eXBlQ2FjaGVPZmZzZXQ7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBiYXNlZCBvbiB0aGUgZ2l2ZW4gCi0JICogZGVzY3JpcHRpb24uICBPbmNlIHRoZSBpbnN0YWxsYWJsZSB1bml0IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBpbmZvcm1hdGlvbiBpcyAKLQkgKiBkaXNjYXJkZWQgZnJvbSB0aGUgZGVzY3JpcHRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHVuaXQgdG8gY3JlYXRlCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBpbnN0YWxsYWJsZSB1bml0IG9yIGZyYWdtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUluc3RhbGxhYmxlVW5pdChJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uLnVuaXRDcmVhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnR9IGJhc2VkIG9uIHRoZSBnaXZlbiAKLQkgKiBkZXNjcmlwdGlvbi4gIE9uY2UgdGhlIGZyYWdtZW50IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBpbmZvcm1hdGlvbiBpcyAKLQkgKiBkaXNjYXJkZWQgZnJvbSB0aGUgZGVzY3JpcHRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHVuaXQgdG8gY3JlYXRlCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBpbnN0YWxsYWJsZSB1bml0IG9yIGZyYWdtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgY3JlYXRlSW5zdGFsbGFibGVVbml0RnJhZ21lbnQoSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIGRlc2NyaXB0aW9uLnVuaXRDcmVhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIFByb3ZpZGVkQ2FwYWJpbGl0eX0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIGNhcGFiaWxpdHkgbmFtZXNwYWNlCi0JICogQHBhcmFtIG5hbWUgVGhlIGNhcGFiaWxpdHkgbmFtZQotCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBjYXBhYmlsaXR5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3ZpZGVkQ2FwYWJpbGl0eSBjcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eShuYW1lc3BhY2UsIG5hbWUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB7QGxpbmsgUmVxdWlyZWRDYXBhYmlsaXR5fSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgY2FwYWJpbGl0eSBuYW1lc3BhY2UKLQkgKiBAcGFyYW0gbmFtZSBUaGUgcmVxdWlyZWQgY2FwYWJpbGl0eSBuYW1lCi0JICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB2ZXJzaW9ucyB0aGF0IGFyZSByZXF1aXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiB0byBpbmRpY2F0ZSB0aGF0IGFueSB2ZXJzaW9uIHdpbGwgZG8uCi0JICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHVzZWQgdG8gZXZhbHVhdGUgd2hldGhlciB0aGlzIGNhcGFiaWxpdHkgaXMgYXBwbGljYWJsZSBpbiB0aGUKLQkgKiBjdXJyZW50IGVudmlyb25tZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGlzIGNhcGFiaWxpdHkgaXMgYWx3YXlzIGFwcGxpY2FibGUKLQkgKiBAcGFyYW0gb3B0aW9uYWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXF1aXJlZCBjYXBhYmlsaXR5IGlzIG9wdGlvbmFsLAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBtdWx0aXBsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhcGFiaWxpdHkgY2FuIGJlIHNhdGlzZmllZCBieSBtdWx0aXBsZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMsIG9yIGl0IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1hdGNoCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXF1aXJlZENhcGFiaWxpdHkgY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gb3B0aW9uYWwsIGJvb2xlYW4gbXVsdGlwbGUpIHsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlZENhcGFiaWxpdHkobmFtZXNwYWNlLCBuYW1lLCByYW5nZSwgZmlsdGVyLCBvcHRpb25hbCwgbXVsdGlwbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVxdWlyZWRDYXBhYmlsaXR5IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgVmVyc2lvblJhbmdlIHJhbmdlLCBTdHJpbmcgZmlsdGVyLCBib29sZWFuIG9wdGlvbmFsLCBib29sZWFuIG11bHRpcGxlLCBib29sZWFuIGdyZWVkeSkgewotCQlyZXR1cm4gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eShuYW1lc3BhY2UsIG5hbWUsIHJhbmdlLCBmaWx0ZXIsIG9wdGlvbmFsLCBtdWx0aXBsZSwgZ3JlZWR5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuCi0JICogdW5pdCBib3VuZCB0byB0aGUgZ2l2ZW4gZnJhZ21lbnRzLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxhYmxlVW5pdCNpc1Jlc29sdmVkKCkKLQkgKiBAcGFyYW0gdW5pdCBUaGUgdW5pdCB0byBiZSBib3VuZAotCSAqIEBwYXJhbSBmcmFnbWVudHMgVGhlIGZyYWdtZW50cyB0byBiZSBib3VuZAotCSAqIEByZXR1cm4gQSByZXNvbHZlZCBpbnN0YWxsYWJsZSB1bml0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZVJlc29sdmVkSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXQgdW5pdCwgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gZnJhZ21lbnRzKSB7Ci0JCWlmICh1bml0LmlzUmVzb2x2ZWQoKSkKLQkJCXJldHVybiB1bml0OwotCQlBc3NlcnQuaXNOb3ROdWxsKHVuaXQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZyYWdtZW50cyk7Ci0JCXJldHVybiBuZXcgUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQodW5pdCwgZnJhZ21lbnRzKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRvdWNocG9pbnREYXRhfSB3aXRoIHRoZSBnaXZlbiBpbnN0cnVjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGluc3RydWN0aW9ucyBUaGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdG91Y2hwb2ludCBkYXRhLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgdG91Y2hwb2ludCBkYXRhCi0JICovCi0JcHVibGljIHN0YXRpYyBUb3VjaHBvaW50RGF0YSBjcmVhdGVUb3VjaHBvaW50RGF0YShNYXAgaW5zdHJ1Y3Rpb25zKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5zdHJ1Y3Rpb25zKTsKLQkJLy9jb3B5IHRoZSBtYXAgdG8gcHJvdGVjdCBhZ2FpbnN0IHN1YnNlcXVlbnQgY2hhbmdlIGJ5IGNhbGxlcgotCQlyZXR1cm4gaW5zdHJ1Y3Rpb25zLmlzRW1wdHkoKSA/IEVNUFRZX1RPVUNIUE9JTlRfREFUQSA6IG5ldyBUb3VjaHBvaW50RGF0YShuZXcgTGlua2VkSGFzaE1hcChpbnN0cnVjdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIFRvdWNocG9pbnRUeXBlfSB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIHRvdWNocG9pbnQgaWQKLQkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdG91Y2hwb2ludCB2ZXJzaW9uCi0JICogQHJldHVybiBBIHRvdWNocG9pbnQgdHlwZSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG91Y2hwb2ludFR5cGUgY3JlYXRlVG91Y2hwb2ludFR5cGUoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCk7Ci0JCUFzc2VydC5pc05vdE51bGwodmVyc2lvbik7Ci0JCVRvdWNocG9pbnRUeXBlIHJlc3VsdCA9IGdldENhY2hlZFRvdWNocG9pbnRUeXBlKGlkLCB2ZXJzaW9uKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJcmVzdWx0ID0gbmV3IFRvdWNocG9pbnRUeXBlKGlkLCB2ZXJzaW9uKTsKLQkJcHV0Q2FjaGVkVG91Y2hwb2ludFR5cGUocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUb3VjaHBvaW50VHlwZSBnZXRDYWNoZWRUb3VjaHBvaW50VHlwZShTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbikgewotCQlzeW5jaHJvbml6ZWQgKHR5cGVDYWNoZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQ2FjaGUubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZUNhY2hlW2ldICE9IG51bGwgJiYgdHlwZUNhY2hlW2ldLmdldElkKCkuZXF1YWxzKGlkKSAmJiB0eXBlQ2FjaGVbaV0uZ2V0VmVyc2lvbigpLmVxdWFscyh2ZXJzaW9uKSkKLQkJCQkJcmV0dXJuIHR5cGVDYWNoZVtpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1dENhY2hlZFRvdWNocG9pbnRUeXBlKFRvdWNocG9pbnRUeXBlIHJlc3VsdCkgewotCQkvL3NpbXBsZSByb3RhdGluZyBidWZmZXIKLQkJdHlwZUNhY2hlW3R5cGVDYWNoZU9mZnNldF0gPSByZXN1bHQ7Ci0JCXR5cGVDYWNoZU9mZnNldCA9ICh0eXBlQ2FjaGVPZmZzZXQgKyAxKSAlIHR5cGVDYWNoZS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVXBkYXRlRGVzY3JpcHRvciBjcmVhdGVVcGRhdGVEZXNjcmlwdG9yKFN0cmluZyBpZCwgVmVyc2lvblJhbmdlIHJhbmdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlyZXR1cm4gbmV3IFVwZGF0ZURlc2NyaXB0b3IoaWQsIHJhbmdlLCBzZXZlcml0eSwgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGljZW5zZSBjcmVhdGVMaWNlbnNlKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlQm9keSkgewotCQlyZXR1cm4gbmV3IExpY2Vuc2UodXJsLCBsaWNlbnNlQm9keSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb3B5cmlnaHQgY3JlYXRlQ29weXJpZ2h0KFN0cmluZyB1cmwsIFN0cmluZyBjb3B5cmlnaHRCb2R5KSB7Ci0JCXJldHVybiBuZXcgQ29weXJpZ2h0KHVybCwgY29weXJpZ2h0Qm9keSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvUHJvdmlkZWRDYXBhYmlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvUHJvdmlkZWRDYXBhYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWZiMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1Byb3ZpZGVkQ2FwYWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIGNhcGFiaWxpdHkgYXMgZXhwb3NlZCBvciByZXF1aXJlZCBieSBhbiBpbnN0YWxsYWJsZSB1bml0Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm92aWRlZENhcGFiaWxpdHkgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlOwotCXByaXZhdGUgZmluYWwgVmVyc2lvbiB2ZXJzaW9uOwotCi0JUHJvdmlkZWRDYXBhYmlsaXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lc3BhY2UpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5hbWUpOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbiA9PSBudWxsID8gVmVyc2lvbi5lbXB0eVZlcnNpb24gOiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKG90aGVyIGluc3RhbmNlb2YgUHJvdmlkZWRDYXBhYmlsaXR5KSB7Ci0JCQlQcm92aWRlZENhcGFiaWxpdHkgb3RoZXJDYXBhYmlsaXR5ID0gKFByb3ZpZGVkQ2FwYWJpbGl0eSkgb3RoZXI7Ci0JCQlyZXR1cm4gb3RoZXJDYXBhYmlsaXR5Lm5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSAmJiBvdGhlckNhcGFiaWxpdHkubmFtZS5lcXVhbHMobmFtZSkgJiYgb3RoZXJDYXBhYmlsaXR5LnZlcnNpb24uZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2UuaGFzaENvZGUoKSAqIG5hbWUuaGFzaENvZGUoKSAqIHZlcnNpb24uaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIFRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGlzIGJhY2t3YXJkcy4gQSBwcm92aWRlZCBjYXBhYmlsaXR5IGRvZXMgbm90Ci0JICogZ2V0IHNhdGlzZmllZCAtIGl0IGlzIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5IHRoYXQgaXMgc2F0aXNmaWVkIG9yIG5vdC4gSXQgc2hvdWxkIGJlICJzYXRpc2ZpZXMiCi0JICogb3IgImlzU2F0aXNmaWVkIgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkQnkoUmVxdWlyZWRDYXBhYmlsaXR5IGNhbmRpZGF0ZSkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwgfHwgIWdldE5hbWUoKS5lcXVhbHMoY2FuZGlkYXRlLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8ICFnZXROYW1lc3BhY2UoKS5lcXVhbHMoY2FuZGlkYXRlLmdldE5hbWVzcGFjZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNhbmRpZGF0ZS5nZXRSYW5nZSgpLmlzSW5jbHVkZWQodmVyc2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZSArICcvJyArIG5hbWUgKyAnLycgKyB2ZXJzaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1JlcXVpcmVkQ2FwYWJpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1JlcXVpcmVkQ2FwYWJpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA1OGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9SZXF1aXJlZENhcGFiaWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotLyoqCi0gKiBBIHJlcXVpcmVkIGNhcGFiaWxpdHkgcmVwcmVzZW50cyBzb21lIGV4dGVybmFsIGNvbnN0cmFpbnQgb24gYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9LgotICogRWFjaCBjYXBhYmlsaXR5IHJlcHJlc2VudHMgc29tZXRoaW5nIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBuZWVkcyB0aGF0Ci0gKiBpdCBleHBlY3RzIHRvIGJlIHByb3ZpZGVkIGJ5IGFub3RoZXIge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9LiBDYXBhYmlsaXRpZXMgYXJlCi0gKiBlbnRpcmVseSBnZW5lcmljLCBhbmQgYXJlIGludGVuZGVkIHRvIGJlIGNhcGFibGUgb2YgcmVwcmVzZW50aW5nIGFueXRoaW5nIHRoYXQKLSAqIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBtYXkgbmVlZCBlaXRoZXIgYXQgaW5zdGFsbCB0aW1lLCBvciBhdCBydW50aW1lLgotICogPHA+Ci0gKiBDYXBhYmlsaXRpZXMgYXJlIHNlZ21lbnRlZCBpbnRvIG5hbWVzcGFjZXMuICBBbnlvbmUgY2FuIGludHJvZHVjZSBuZXcgCi0gKiBjYXBhYmlsaXR5IG5hbWVzcGFjZXMuIFNvbWUgd2VsbC1rbm93biBuYW1lc3BhY2VzIGFyZSBpbnRyb2R1Y2VkIGRpcmVjdGx5Ci0gKiBieSB0aGUgcHJvdmlzaW9uaW5nIGZyYW1ld29yay4KLSAqIAotICogQHNlZSBJSW5zdGFsbGFibGVVbml0I05BTUVTUEFDRV9JVV9JRAotICovCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRDYXBhYmlsaXR5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19TRUxFQ1RPUlMgPSBuZXcgU3RyaW5nWzBdOwotCi0JcHJpdmF0ZSBTdHJpbmcgZmlsdGVyOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtdWx0aXBsZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOy8vbmV2ZXIgbnVsbAotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsvL25ldmVyIG51bGwKLQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWw7Ci0JcHJpdmF0ZSBib29sZWFuIGdyZWVkeSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBWZXJzaW9uUmFuZ2UgcmFuZ2U7Ly9uZXZlciBudWxsCi0JcHJpdmF0ZSBTdHJpbmdbXSBzZWxlY3RvcnMgPSBOT19TRUxFQ1RPUlM7Ly9uZXZlciBudWxsCi0KLQlSZXF1aXJlZENhcGFiaWxpdHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFZlcnNpb25SYW5nZSByYW5nZSwgU3RyaW5nIGZpbHRlciwgYm9vbGVhbiBvcHRpb25hbCwgYm9vbGVhbiBtdWx0aXBsZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5hbWVzcGFjZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnJhbmdlID0gcmFuZ2UgPT0gbnVsbCA/IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIDogcmFuZ2U7Ci0JCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMubXVsdGlwbGUgPSBtdWx0aXBsZTsKLQl9Ci0KLQlSZXF1aXJlZENhcGFiaWxpdHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFZlcnNpb25SYW5nZSByYW5nZSwgU3RyaW5nIGZpbHRlciwgYm9vbGVhbiBvcHRpb25hbCwgYm9vbGVhbiBtdWx0aXBsZSwgYm9vbGVhbiBncmVlZHkpIHsKLQkJdGhpcyhuYW1lc3BhY2UsIG5hbWUsIHJhbmdlLCBmaWx0ZXIsIG9wdGlvbmFsLCBtdWx0aXBsZSk7Ci0JCXRoaXMuZ3JlZWR5ID0gZ3JlZWR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBSZXF1aXJlZENhcGFiaWxpdHkgb3RoZXIgPSAoUmVxdWlyZWRDYXBhYmlsaXR5KSBvYmo7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmZpbHRlciAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghZmlsdGVyLmVxdWFscyhvdGhlci5maWx0ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobXVsdGlwbGUgIT0gb3RoZXIubXVsdGlwbGUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbmFtZXNwYWNlLmVxdWFscyhvdGhlci5uYW1lc3BhY2UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3B0aW9uYWwgIT0gb3RoZXIub3B0aW9uYWwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcmFuZ2UuZXF1YWxzKG90aGVyLnJhbmdlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB0aGF0IHNhdGlzZnkgdGhpcyByZXF1aXJlZCBjYXBhYmlsaXR5LiBSZXR1cm5zCi0JICogYW4gZW1wdHkgdmVyc2lvbiByYW5nZSAoe0BsaW5rIFZlcnNpb25SYW5nZSNlbXB0eVJhbmdlfSBpZiBhbnkgdmVyc2lvbgotCSAqIHdpbGwgc2F0aXNmeSB0aGUgY2FwYWJpbGl0eS4KLQkgKiBAcmV0dXJuIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB0aGF0IHNhdGlzZnkgdGhpcyByZXF1aXJlZCBjYXBhYmlsaXR5LgotCSAqLwotCXB1YmxpYyBWZXJzaW9uUmFuZ2UgZ2V0UmFuZ2UoKSB7Ci0JCXJldHVybiByYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgZXZhbHVhdGluZyByZXF1aXJlZCBjYXBhYmlsaXR5IGZpbHRlcnMgCi0JICogZG93bnN0cmVhbSBmcm9tIHRoaXMgY2FwYWJpbGl0eS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzZWxlY3RvciAiZG9jIgotCSAqIGlzIHByb3ZpZGVkLCB0aGVuIGEgZG93bnN0cmVhbSBJbnN0YWxsYWJsZVVuaXQgd2l0aCBhIHJlcXVpcmVkIGNhcGFiaWxpdHkKLQkgKiBmaWx0ZXJlZCB3aXRoICJkb2M9dHJ1ZSIgd2lsbCBiZSBpbmNsdWRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gc2VsZWN0b3JzOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGZpbHRlciA9PSBudWxsKSA/IDAgOiBmaWx0ZXIuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKG11bHRpcGxlID8gMTIzMSA6IDEyMzcpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIG5hbWUuaGFzaENvZGUoKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBuYW1lc3BhY2UuaGFzaENvZGUoKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAob3B0aW9uYWwgPyAxMjMxIDogMTIzNyk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgcmFuZ2UuaGFzaENvZGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotCQlyZXR1cm4gbXVsdGlwbGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9ycyhTdHJpbmdbXSBzZWxlY3RvcnMpIHsKLQkJdGhpcy5zZWxlY3RvcnMgPSBzZWxlY3RvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVlZHkoKSB7Ci0JCXJldHVybiBncmVlZHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJyZXF1aXJlZENhcGFiaWxpdHk6ICIgKyBuYW1lc3BhY2UgKyAnLycgKyBuYW1lICsgJy8nICsgcmFuZ2U7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvVG91Y2hwb2ludERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Ub3VjaHBvaW50RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxYWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Ub3VjaHBvaW50RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFRvdWNocG9pbnREYXRhIHsKLQotCS8qKgotCSAqIE1hcCBvZiAoU3RyaW5nLT5TdHJpbmcpLiBUaGUgdmFsdWVzIHJlcHJlc2VudCB0aGUgaW5zdHJ1Y3Rpb25zLiBUaGUgc2V0IAotCSAqIG9mIGtleXMgc3VwcG9ydGVkIGlzIHVwIHRvIHRoZSB0b3VjaHBvaW50IHRoYXQgd2lsbCBwcm9jZXNzIHRoZXNlIAotCSAqIGluc3RydWN0aW9ucy4gVGhpcyBtYXAgaXMgbmV2ZXIgbnVsbC4KLQkgKi8KLQlwcml2YXRlIE1hcCBpbnN0cnVjdGlvbnM7Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnN0cnVjdGlvbnMgPT0gbnVsbCkgPyAwIDogaW5zdHJ1Y3Rpb25zLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBUb3VjaHBvaW50RGF0YSBvdGhlciA9IChUb3VjaHBvaW50RGF0YSkgb2JqOwotCQlpZiAoaW5zdHJ1Y3Rpb25zID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5pbnN0cnVjdGlvbnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWluc3RydWN0aW9ucy5lcXVhbHMob3RoZXIuaW5zdHJ1Y3Rpb25zKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JVG91Y2hwb2ludERhdGEoTWFwIGluc3RydWN0aW9ucykgewotCQl0aGlzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RydWN0aW9ucyhTdHJpbmcgaW5zdHJ1Y3Rpb25LZXkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGluc3RydWN0aW9ucy5nZXQoaW5zdHJ1Y3Rpb25LZXkpOwotCX0KLQotCS8vIFJldHVybiBhbiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0JLy8gaW4gdGhlIHRvdWNocG9pbnQgZGF0YS4KLQlwdWJsaWMgTWFwIGdldEluc3RydWN0aW9ucygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChpbnN0cnVjdGlvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Ub3VjaHBvaW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1RvdWNocG9pbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDEzMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1RvdWNocG9pbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIElkZW50aWZpZXMgYSBwYXJ0aWN1bGFyIHRvdWNocG9pbnQuIEEgdG91Y2hwb2ludCBpcyBpZGVudGlmaWVkIGJ5IGFuIGlkIAotICogYW5kIGEgdmVyc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvdWNocG9pbnRUeXBlIHsKLQkvKioKLQkgKiBBIHRvdWNocG9pbnQgdHlwZSBpbmRpY2F0aW5nIHRoYXQgdGhlICJudWxsIiB0b3VjaHBvaW50IHNob3VsZCBiZSB1c2VkLgotCSAqIFRoZSBudWxsIHRvdWNocG9pbnQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYW55IGluc3RhbGwgcGhhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50VHlwZSBOT05FID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKCJudWxsIiwgVmVyc2lvbi5lbXB0eVZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBpZDsvL25ldmVyIG51bGwKLQlwcml2YXRlIFZlcnNpb24gdmVyc2lvbjsvL25ldmVyIG51bGwKLQotCVRvdWNocG9pbnRUeXBlKFN0cmluZyBpZCwgVmVyc2lvbiBhVmVyc2lvbikgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IGFWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRvdWNocG9pbnRUeXBlIG90aGVyID0gKFRvdWNocG9pbnRUeXBlKSBvYmo7Ci0JCXJldHVybiBpZC5lcXVhbHMob3RoZXIuaWQpICYmIHZlcnNpb24uZXF1YWxzKG90aGVyLnZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gMzEgKiBpZC5oYXNoQ29kZSgpICsgdmVyc2lvbi5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVG91Y2hwb2ludDogIiArIGlkICsgJyAnICsgZ2V0VmVyc2lvbigpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9DYXBhYmlsaXR5UXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9DYXBhYmlsaXR5UXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2OTgyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvQ2FwYWJpbGl0eVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBzZWFyY2hlcyBmb3Ige0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IGluc3RhbmNlcyB0aGF0IHByb3ZpZGUKLSAqIGNhcGFiaWxpdGllcyB0aGF0IG1hdGNoIG9uZSBvciBtb3JlIHJlcXVpcmVkIGNhcGFiaWxpdGllcy4KLSAqLwotcHVibGljIGNsYXNzIENhcGFiaWxpdHlRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcmVxdWlyZWQgY2FwYWJpbGl0eS4KLQkgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVF1ZXJ5KFJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCkgewotCQl0aGlzLnJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtyZXF1aXJlZH07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcmVxdWlyZWQgY2FwYWJpbGl0aWVzLiBUaGUgaW5zdGFsbGFibGUKLQkgKiB1bml0IG11c3QgcHJvdmlkZSBjYXBhYmlsaXRpZXMgdGhhdCBtYXRjaCBhbGwgb2YgdGhlIGdpdmVuIHJlcXVpcmVkIGNhcGFiaWxpdGllcwotCSAqIGZvciB0aGlzIHF1ZXJ5IHRvIGJlIHNhdGlzZmllZC4KLQkgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcwotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UXVlcnkoUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQpIHsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkgdGhhdCB0aGlzIHF1ZXJ5IGlzIG1hdGNoaW5nIGFnYWluc3QuCi0JICogQHJldHVybiB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSB0aGF0IHRoaXMgcXVlcnkgaXMgbWF0Y2hpbmcgYWdhaW5zdC4KLQkgKi8KLQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5Mi5RdWVyeSNpc01hdGNoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJSW5zdGFsbGFibGVVbml0IGNhbmRpZGF0ZSA9IChJSW5zdGFsbGFibGVVbml0KSBvYmplY3Q7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gY2FuZGlkYXRlLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gc2F0aXNmaWVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3ZpZGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHByb3ZpZGVzW2pdLmlzU2F0aXNmaWVkQnkocmVxdWlyZWRbaV0pKSB7Ci0JCQkJCXNhdGlzZmllZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc2F0aXNmaWVkKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvSVVQcm9wZXJ0eVF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvSVVQcm9wZXJ0eVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODZjNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L0lVUHJvcGVydHlRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLQotLyoqCi0gKiBBIHF1ZXJ5IHRoYXQgc2VhcmNoZXMgZm9yIHtAbGluayBJSW5zdGFsbGFibGVVbml0fSBpbnN0YW5jZXMgdGhhdCBoYXZlCi0gKiBhIHByb3BlcnR5IHdob3NlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgSVVQcm9wZXJ0eVF1ZXJ5IGV4dGVuZHMgUXVlcnkgewotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIElVUHJvcGVydHlRdWVyeShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5Mi5RdWVyeSNpc01hdGNoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJSW5zdGFsbGFibGVVbml0IGNhbmRpZGF0ZSA9IChJSW5zdGFsbGFibGVVbml0KSBvYmplY3Q7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KGNhbmRpZGF0ZSwgcHJvcGVydHlOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKHByb3BlcnR5VmFsdWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpdS5nZXRQcm9wZXJ0eShuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvSW5zdGFsbGFibGVVbml0UXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9JbnN0YWxsYWJsZVVuaXRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRiOWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9JbnN0YWxsYWJsZVVuaXRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBBIHF1ZXJ5IHRoYXQgbWF0Y2hlcyBvbiB0aGUgaWQgYW5kIHZlcnNpb24gb2YgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9LgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVVbml0UXVlcnkgZXh0ZW5kcyBRdWVyeSB7Ci0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBxdWVyeSB0aGF0IHdpbGwgbWF0Y2ggYW55IHtAbGluayBJSW5zdGFsbGFibGVVbml0fQotCSAqIGl0IGVuY291bnRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnN0YWxsYWJsZVVuaXRRdWVyeSBBTlkgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkobnVsbCk7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFZlcnNpb25SYW5nZSByYW5nZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBxdWVyeSB0aGF0IHdpbGwgbWF0Y2ggYW55IHtAbGluayBJSW5zdGFsbGFibGVVbml0fSB3aXRoIHRoZSBnaXZlbgotCSAqIGlkLCByZWdhcmRsZXNzIG9mIHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIGlkIFRoZSBpbnN0YWxsYWJsZSB1bml0IGlkIHRvIG1hdGNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBtYXRjaCBhbnkgaWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbGFibGVVbml0UXVlcnkoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5yYW5nZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHF1ZXJ5IHRoYXQgd2lsbCBtYXRjaCBhbnkge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IHdpdGggdGhlIGdpdmVuCi0JICogaWQsIGFuZCB3aG9zZSB2ZXJzaW9uIGZhbGxzIGluIHRoZSBwcm92aWRlZCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIGluc3RhbGxhYmxlIHVuaXQgaWQgdG8gbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIG1hdGNoIGFueSBpZAotCSAqIEBwYXJhbSByYW5nZSBUaGUgdmVyc2lvbiByYW5nZSB0byBtYXRjaAotCSAqLwotCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRRdWVyeShTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMucmFuZ2UgPSByYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcXVlcnkgdGhhdCB3aWxsIG1hdGNoIGFueSB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gd2l0aCB0aGUgZ2l2ZW4KLQkgKiBpZCBhbmQgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIGluc3RhbGxhYmxlIHVuaXQgaWQgdG8gbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIG1hdGNoIGFueSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBwcmVjaXNlIHZlcnNpb24gdGhhdCBhIG1hdGNoaW5nIHVuaXQgbXVzdCBoYXZlCi0JICovCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdFF1ZXJ5KFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5yYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgbWF0Y2ggYWdhaW5zdC4KLQkgKiBAcmV0dXJuIFRoZSBpbnN0YWxsYWJsZSB1bml0IGl0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZlcnNpb24gcmFuZ2UgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgbWF0Y2ggYWdhaW5zdC4KLQkgKiBAcmV0dXJuIFRoZSBpbnN0YWxsYWJsZSB1bml0IHZlcnNpb24gcmFuZ2UuCi0JICovCi0JcHVibGljIFZlcnNpb25SYW5nZSBnZXRSYW5nZSgpIHsKLQkJcmV0dXJuIHJhbmdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkyLlF1ZXJ5I2lzTWF0Y2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyhjYW5kaWRhdGUuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyYW5nZSAhPSBudWxsICYmICFyYW5nZS5pc0luY2x1ZGVkKGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9VcGRhdGVRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L1VwZGF0ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzBiZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L1VwZGF0ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklVcGRhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgdXBkYXRlRnJvbTsKLQotCXB1YmxpYyBVcGRhdGVRdWVyeShJSW5zdGFsbGFibGVVbml0IHVwZGF0ZUZyb20pIHsKLQkJdGhpcy51cGRhdGVGcm9tID0gdXBkYXRlRnJvbTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iajsKLQkJSVVwZGF0ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNhbmRpZGF0ZS5nZXRVcGRhdGVEZXNjcmlwdG9yKCk7Ci0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwgJiYgZGVzY3JpcHRvci5pc1VwZGF0ZU9mKHVwZGF0ZUZyb20pICYmIHVwZGF0ZUZyb20uZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhjYW5kaWRhdGUuZ2V0VmVyc2lvbigpKSA8IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzNzk0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJpbl9hbnQiIHBhdGg9InNyY19hbnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgTWV0YWRhdGEgR2VuZXJhdG9yIEFudCBUYXNrcy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBNZXRhZGF0YSBHZW5lcmF0b3IgQW50IFRhc2tzLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5YzNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBNZXRhZGF0YSBHZW5lcmF0b3IgQW50IFRhc2tzLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjQiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBQdWJsaXNoZXIgQW50IFRhc2tzLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFB1Ymxpc2hlciBBbnQgVGFza3MubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWVlYzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFB1Ymxpc2hlciBBbnQgVGFza3MubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhNDNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuRXh0ZXJuYWxUb29sQnVpbGRlcjwvbmFtZT4KLQkJCTx0cmlnZ2Vycz5mdWxsLGluY3JlbWVudGFsLDwvdHJpZ2dlcnM+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBQdWJsaXNoZXIgQW50IFRhc2tzLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJiYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLSNTdW4gTWFyIDA5IDE3OjAzOjMyIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGE2N2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSNTYXQgTWFyIDA4IDE1OjM4OjU1IEVTVCAyMDA4Ci1jbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXHJcbiAqIEByZXR1cm4gdGhlICR7YmFyZV9maWVsZF9uYW1lfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxyXG4gKiBAcGFyYW0gJHtwYXJhbX0gdGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXRcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKlxyXG4gKiBcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcclxuICpcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiLz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxyXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImRlbGVnYXRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZGVsZWdhdGUgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5kZWxlZ2F0ZWNvbW1lbnQiIG5hbWVcPSJkZWxlZ2F0ZWNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqICR7c2VlX3RvX3RhcmdldH1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke3BhY2thZ2VfZGVjbGFyYXRpb259XHJcblxyXG4ke3R5cGVjb21tZW50fVxyXG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2tcclxuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcclxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cclxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDdjZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNTYXQgTWFyIDA4IDE0OjUzOjIxIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvRWNsaXBzZSBpbnN0YWxsIHB1Ymxpc2hlci5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL0VjbGlwc2UgaW5zdGFsbCBwdWJsaXNoZXIubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg3ZGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvRWNsaXBzZSBpbnN0YWxsIHB1Ymxpc2hlci5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9FY2xpcHNlIGluc3RhbGwgcHVibGlzaGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci5JbnN0YWxsUHVibGlzaGVyJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpkOi90ZW1wL3JlcG9zJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpkOi90ZW1wL3JlcG9zJiMxMzsmIzEwOy1zb3VyY2UgZDpcaTAzMDUuemlwXGVjbGlwc2UmIzEzOyYjMTA7LXRvcCBvcmcuZWNsaXBzZS5zZGsuZmVhdHVyZS5ncm91cCYjMTM7JiMxMDstY29uZmlncyB3aW4zMi53aW4zMi54ODYmIzEzOyYjMTA7LWlkIHNkayYjMTM7JiMxMDstdmVyc2lvbiAzLjQuMC5pMDMwNSYjMTM7JiMxMDstZmxhdm9yIHRvb2xpbmcmIzEzOyYjMTA7LXB1Ymxpc2hBcnRpZmFjdHMmIzEzOyYjMTA7LWFwcGVuZCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoKjMuMi4xMDAudjIwMDcwNTAyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NioxLjAuMTAwLnYyMDA4MDIwMWFAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yKjMuMi4yMDAudjIwMDgwMTA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwMzEwQDosb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAqMS4wLjEwMC52MjAwODAzMTMxMDMwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5jb3JlLm5ldCoxLjAuMTAwLkkyMDA4MDIyNkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkqMy4yLjIwMC52MjAwNzA3MTdAZGVmYXVsdDpmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIqMS4wLjBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjEuMy4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZhYjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLnBhcnNlcnMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2NvbW1vbj1zcGxpdCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMi4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjQuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIsCi0gb3JnLnczYy5kb20sCi0gb3JnLnhtbC5zYXgsCi0gb3JnLnhtbC5zYXguaGVscGVycwotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLkFjdGl2YXRvcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIucHJvZHVjdCwKLSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuc3d0LnRvb2xzO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvVG9hc3QgYmFja2VuZCBwdWJsaXNoZXIubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBiYWNrZW5kIHB1Ymxpc2hlci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmY4OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBiYWNrZW5kIHB1Ymxpc2hlci5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9Ub2FzdCBiYWNrZW5kIHB1Ymxpc2hlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlICYjMTM7JiMxMDstY29uc29sZWxvZyYjMTM7JiMxMDstYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIuSW5zdGFsbFB1Ymxpc2hlciYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6ZDovZGVtb3MvdG9hc3QvcmVwb3MmIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmQ6L2RlbW9zL3RvYXN0L3JlcG9zJiMxMzsmIzEwOyYjMTA7JiMxMDstc291cmNlIGQ6L2RlbW9zL3RvYXN0L2J1aWxkL2JhY2tlbmQmIzEzOyYjMTA7LXRvcCBvcmcuZXF1aW5veG9zZ2kudG9hc3QuYmFja2VuZC5mZWF0dXJlLmZlYXR1cmUuZ3JvdXAmIzEzOyYjMTA7LWNvbmZpZ3Mgd2luMzIud2luMzIueDg2JiMxMzsmIzEwOy1pZCBvcmcuZXF1aW5veG9zZ2kudG9hc3QuYmFja2VuZC5iYXNlJiMxMzsmIzEwOy12ZXJzaW9uIDEuMC4wJiMxMzsmIzEwOy1mbGF2b3IgdG9hc3QmIzEzOyYjMTA7LWFwcGVuZCYjMTM7JiMxMDstc3RhcnRBbGwiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUubmV0KjEuMC4xMDAuSTIwMDgwMjI2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAqMS4wLjEwMC52MjAwODAzMTMxMDMwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDMxMEA6LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2KjEuMC4xMDAudjIwMDgwMjAxYUBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMqMy4yLjIwMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUqMy4zLjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yKjMuMi4yMDAudjIwMDgwMTA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnMqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIqMS4wLjBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBjbGllbnQgcHVibGlzaGVyLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvVG9hc3QgY2xpZW50IHB1Ymxpc2hlci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTg5NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBjbGllbnQgcHVibGlzaGVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL1RvYXN0IGNsaWVudCBwdWJsaXNoZXIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAmIzEzOyYjMTA7LWNvbnNvbGVsb2cmIzEzOyYjMTA7LWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLkluc3RhbGxQdWJsaXNoZXImIzEzOyYjMTA7LW1ldGFkYXRhUmVwb3NpdG9yeSBmaWxlOmQ6L2RlbW9zL3RvYXN0L3JlcG9zJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpkOi9kZW1vcy90b2FzdC9yZXBvcyYjMTM7JiMxMDsmIzEwOyYjMTA7LXNvdXJjZSBkOi9kZW1vcy90b2FzdC9idWlsZC9jbGllbnQmIzEzOyYjMTA7LXRvcCBvcmcuZXF1aW5veG9zZ2kudG9hc3QuYXBwLmJhc2UuZmVhdHVyZS5mZWF0dXJlLmdyb3VwJiMxMzsmIzEwOy1jb25maWdzIHdpbjMyLndpbjMyLng4NiYjMTM7JiMxMDstaWQgb3JnLmVxdWlub3hvc2dpLnRvYXN0LmNsaWVudC5iYXNlJiMxMzsmIzEwOy12ZXJzaW9uIDEuMC4wJiMxMzsmIzEwOy1mbGF2b3IgdG9hc3QmIzEzOyYjMTA7LWFwcGVuZCYjMTM7JiMxMDstc3RhcnRBbGwiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUubmV0KjEuMC4xMDAuSTIwMDgwMjI2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAqMS4wLjEwMC52MjAwODAzMTMxMDMwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDMxMEA6LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2KjEuMC4xMDAudjIwMDgwMjAxYUBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMqMy4yLjIwMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUqMy4zLjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yKjMuMi4yMDAudjIwMDgwMTA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnMqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIqMS4wLjBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGRhNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS5hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXI9c3JjX2FudC8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBPU0dpX01pbmltdW0tMS4xLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgT1NHaV9NaW5pbXVtLTEuMC5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIEphdmFTRS0xLjYucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBKUkUtMS4xLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgSjJTRS0xLjUucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBKMlNFLTEuNC5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIEoyU0UtMS4zLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgSjJTRS0xLjIucHJvZmlsZSxcCi0gICAgICAgICAgICAgICBDREMtMS4xX0ZvdW5kYXRpb24tMS4xLnByb2ZpbGUsXAotICAgICAgICAgICAgICAgQ0RDLTEuMF9Gb3VuZGF0aW9uLTEuMC5wcm9maWxlLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXI9LixhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIKLWV4dHJhLmFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphciA9IHBsYXRmb3JtOi9wbHVnaW4vb3JnLmFwYWNoZS5hbnQKLWphcnMuZXh0cmEuY2xhc3NwYXRoID0gcGxhdGZvcm06L3BsdWdpbi9vcmcuYXBhY2hlLmFudC9saWIvYW50LmphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q4ZDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYnVuZGxlTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIFB1Ymxpc2hlcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NWFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBpZD0iSW5zdGFsbFB1Ymxpc2hlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBjYXJkaW5hbGl0eT0iMSIKLSAgICAgICAgICAgIHRocmVhZD0ibWFpbiIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLkluc3RhbGxQdWJsaXNoZXJBcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gaWQ9IlByb2R1Y3RQdWJsaXNoZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9Im1haW4iCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5Qcm9kdWN0UHVibGlzaGVyQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcyI+Ci0JCTxhbnRUYXNrCi0JCQlsaWJyYXJ5PSJhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiCi0JCQluYW1lPSJwMi5nZW5lcmF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50LkdlbmVyYXRvclRhc2siPgotCQk8L2FudFRhc2s+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiPgotCQk8ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PSJhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0NEQy0xLjBfRm91bmRhdGlvbi0xLjAucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvQ0RDLTEuMF9Gb3VuZGF0aW9uLTEuMC5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3YTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvQ0RDLTEuMF9Gb3VuZGF0aW9uLTEuMC5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXgubWljcm9lZGl0aW9uLmlvCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gamF2YXgubWljcm9lZGl0aW9uLmlvCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMSxcCi0gQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMAotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IENEQy0xLjAvRm91bmRhdGlvbi0xLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvQ0RDLTEuMV9Gb3VuZGF0aW9uLTEuMS5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9DREMtMS4xX0ZvdW5kYXRpb24tMS4xLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDMwMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9DREMtMS4xX0ZvdW5kYXRpb24tMS4xLnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5taWNyb2VkaXRpb24uaW8sXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5wa2ksXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMAotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5pbyxcCi0gamF2YXgubWljcm9lZGl0aW9uLnBraSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMSxcCi0gQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxcCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IENEQy0xLjEvRm91bmRhdGlvbi0xLjEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjIucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjIucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmOTczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4yLnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5hY2Nlc3NpYmlsaXR5LFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIG9yZy5vbWcuQ09SQkEsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIEpSRS0xLjEsXAotIEoyU0UtMS4yCi1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gSjJTRS0xLjIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjMucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjMucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkYmRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4zLnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5hY2Nlc3NpYmlsaXR5LFwKLSBqYXZheC5uYW1pbmcsXAotIGphdmF4Lm5hbWluZy5kaXJlY3RvcnksXAotIGphdmF4Lm5hbWluZy5ldmVudCxcCi0gamF2YXgubmFtaW5nLmxkYXAsXAotIGphdmF4Lm5hbWluZy5zcGksXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnN3aW5nLFwKLSBqYXZheC5zd2luZy5ib3JkZXIsXAotIGphdmF4LnN3aW5nLmNvbG9yY2hvb3NlcixcCi0gamF2YXguc3dpbmcuZXZlbnQsXAotIGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5wbGFmLFwKLSBqYXZheC5zd2luZy5wbGFmLmJhc2ljLFwKLSBqYXZheC5zd2luZy5wbGFmLm1ldGFsLFwKLSBqYXZheC5zd2luZy5wbGFmLm11bHRpLFwKLSBqYXZheC5zd2luZy50YWJsZSxcCi0gamF2YXguc3dpbmcudGV4dCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwucGFyc2VyLFwKLSBqYXZheC5zd2luZy50ZXh0LnJ0ZixcCi0gamF2YXguc3dpbmcudHJlZSxcCi0gamF2YXguc3dpbmcudW5kbyxcCi0gamF2YXgudHJhbnNhY3Rpb24sXAotIG9yZy5vbWcuQ09SQkEsXAotIG9yZy5vbWcuQ09SQkFfMl8zLFwKLSBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLk9SQlBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZyxcCi0gb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaQotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5vbWcuKixcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIEpSRS0xLjEsXAotIEoyU0UtMS4yLFwKLSBKMlNFLTEuMwotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS40LnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS40LnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDdjOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuNC5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gXAotIGphdmF4LmFjY2Vzc2liaWxpdHksXAotIGphdmF4LmNyeXB0byxcCi0gamF2YXguY3J5cHRvLmludGVyZmFjZXMsXAotIGphdmF4LmNyeXB0by5zcGVjLFwKLSBqYXZheC5pbWFnZWlvLFwKLSBqYXZheC5pbWFnZWlvLmV2ZW50LFwKLSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZyxcCi0gamF2YXguaW1hZ2Vpby5zcGksXAotIGphdmF4LmltYWdlaW8uc3RyZWFtLFwKLSBqYXZheC5uYW1pbmcsXAotIGphdmF4Lm5hbWluZy5kaXJlY3RvcnksXAotIGphdmF4Lm5hbWluZy5ldmVudCxcCi0gamF2YXgubmFtaW5nLmxkYXAsXAotIGphdmF4Lm5hbWluZy5zcGksXAotIGphdmF4Lm5ldCxcCi0gamF2YXgubmV0LnNzbCxcCi0gamF2YXgucHJpbnQsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZSxcCi0gamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkLFwKLSBqYXZheC5wcmludC5ldmVudCxcCi0gamF2YXgucm1pLFwKLSBqYXZheC5ybWkuQ09SQkEsXAotIGphdmF4LnNlY3VyaXR5LmF1dGgsXAotIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssXAotIGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MsXAotIGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4sXAotIGphdmF4LnNlY3VyaXR5LmF1dGguc3BpLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAsXAotIGphdmF4LnNlY3VyaXR5LmNlcnQsXAotIGphdmF4LnNvdW5kLm1pZGksXAotIGphdmF4LnNvdW5kLm1pZGkuc3BpLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLnNwaSxcCi0gamF2YXguc3FsLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBqYXZheC50cmFuc2FjdGlvbi54YSxcCi0gamF2YXgueG1sLnBhcnNlcnMsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0sXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLnNheCxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuQ09SQkEsXAotIG9yZy5vbWcuQ09SQkFfMl8zLFwKLSBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLk9SQlBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZyxcCi0gb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dFBhY2thZ2UsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWMsXAotIG9yZy5vbWcuRHluYW1pY0FueSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWNBbnkuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5JT1AsXAotIG9yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLkNvZGVjUGFja2FnZSxcCi0gb3JnLm9tZy5NZXNzYWdpbmcsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvcixcCi0gb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRJbmZvUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlcixcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FNYW5hZ2VyUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnRMb2NhdG9yUGFja2FnZSxcCi0gb3JnLm9tZy5TZW5kaW5nQ29udGV4dCxcCi0gb3JnLm9tZy5zdHViLmphdmEucm1pLFwKLSBvcmcudzNjLmRvbSxcCi0gb3JnLnhtbC5zYXgsXAotIG9yZy54bWwuc2F4LmV4dCxcCi0gb3JnLnhtbC5zYXguaGVscGVycwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuKixcCi0gb3JnLnczYy4qLFwKLSBvcmcueG1sLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMsXAotIEoyU0UtMS40Ci1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjUucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjUucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzZDZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS41LnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXguYWN0aXZpdHksXAotIGphdmF4LmNyeXB0byxcCi0gamF2YXguY3J5cHRvLmludGVyZmFjZXMsXAotIGphdmF4LmNyeXB0by5zcGVjLFwKLSBqYXZheC5pbWFnZWlvLFwKLSBqYXZheC5pbWFnZWlvLmV2ZW50LFwKLSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuYm1wLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZyxcCi0gamF2YXguaW1hZ2Vpby5zcGksXAotIGphdmF4LmltYWdlaW8uc3RyZWFtLFwKLSBqYXZheC5tYW5hZ2VtZW50LFwKLSBqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmcsXAotIGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5tb25pdG9yLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbixcCi0gamF2YXgubWFuYWdlbWVudC5yZW1vdGUsXAotIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaSxcCi0gamF2YXgubWFuYWdlbWVudC50aW1lcixcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5uZXQsXAotIGphdmF4Lm5ldC5zc2wsXAotIGphdmF4LnByaW50LFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCxcCi0gamF2YXgucHJpbnQuZXZlbnQsXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5ybWkuc3NsLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLFwKLSBqYXZheC5zZWN1cml0eS5jZXJ0LFwKLSBqYXZheC5zZWN1cml0eS5zYXNsLFwKLSBqYXZheC5zZXJ2bGV0LFwKLSBqYXZheC5zZXJ2bGV0Lmh0dHAsXAotIGphdmF4LnNvdW5kLm1pZGksXAotIGphdmF4LnNvdW5kLm1pZGkuc3BpLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLnNwaSxcCi0gamF2YXguc3FsLFwKLSBqYXZheC5zcWwucm93c2V0LFwKLSBqYXZheC5zcWwucm93c2V0LnNlcmlhbCxcCi0gamF2YXguc3FsLnJvd3NldC5zcGksXAotIGphdmF4LnN3aW5nLFwKLSBqYXZheC5zd2luZy5ib3JkZXIsXAotIGphdmF4LnN3aW5nLmNvbG9yY2hvb3NlcixcCi0gamF2YXguc3dpbmcuZXZlbnQsXAotIGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5wbGFmLFwKLSBqYXZheC5zd2luZy5wbGFmLmJhc2ljLFwKLSBqYXZheC5zd2luZy5wbGFmLm1ldGFsLFwKLSBqYXZheC5zd2luZy5wbGFmLm11bHRpLFwKLSBqYXZheC5zd2luZy5wbGFmLnN5bnRoLFwKLSBqYXZheC5zd2luZy50YWJsZSxcCi0gamF2YXguc3dpbmcudGV4dCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwucGFyc2VyLFwKLSBqYXZheC5zd2luZy50ZXh0LnJ0ZixcCi0gamF2YXguc3dpbmcudHJlZSxcCi0gamF2YXguc3dpbmcudW5kbyxcCi0gamF2YXgudHJhbnNhY3Rpb24sXAotIGphdmF4LnRyYW5zYWN0aW9uLnhhLFwKLSBqYXZheC54bWwsXAotIGphdmF4LnhtbC5kYXRhdHlwZSxcCi0gamF2YXgueG1sLm5hbWVzcGFjZSxcCi0gamF2YXgueG1sLnBhcnNlcnMsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0sXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLnNheCxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sXAotIGphdmF4LnhtbC52YWxpZGF0aW9uLFwKLSBqYXZheC54bWwueHBhdGgsXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuQ09SQkEsXAotIG9yZy5vbWcuQ09SQkFfMl8zLFwKLSBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLk9SQlBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZyxcCi0gb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dFBhY2thZ2UsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWMsXAotIG9yZy5vbWcuRHluYW1pY0FueSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWNBbnkuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5JT1AsXAotIG9yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLkNvZGVjUGFja2FnZSxcCi0gb3JnLm9tZy5NZXNzYWdpbmcsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvcixcCi0gb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRJbmZvUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlcixcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FNYW5hZ2VyUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnRMb2NhdG9yUGFja2FnZSxcCi0gb3JnLm9tZy5TZW5kaW5nQ29udGV4dCxcCi0gb3JnLm9tZy5zdHViLmphdmEucm1pLFwKLSBvcmcudzNjLmRvbSxcCi0gb3JnLnczYy5kb20uYm9vdHN0cmFwLFwKLSBvcmcudzNjLmRvbS5ldmVudHMsXAotIG9yZy53M2MuZG9tLmxzLFwKLSBvcmcueG1sLnNheCxcCi0gb3JnLnhtbC5zYXguZXh0LFwKLSBvcmcueG1sLnNheC5oZWxwZXJzCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gamF2YXguKixcCi0gb3JnLmlldGYuamdzcyxcCi0gb3JnLm9tZy4qLFwKLSBvcmcudzNjLiosXAotIG9yZy54bWwuKixcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIEpSRS0xLjEsXAotIEoyU0UtMS4yLFwKLSBKMlNFLTEuMyxcCi0gSjJTRS0xLjQsXAotIEoyU0UtMS41Ci1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSlJFLTEuMS5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KUkUtMS4xLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOGQ4ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KUkUtMS4xLnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IAotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBKUkUtMS4xCi1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gSlJFLTEuMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KYXZhU0UtMS42LnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0phdmFTRS0xLjYucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3YWJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0phdmFTRS0xLjYucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5hY2Nlc3NpYmlsaXR5LFwKLSBqYXZheC5hY3Rpdml0eSxcCi0gamF2YXguY3J5cHRvLFwKLSBqYXZheC5jcnlwdG8uaW50ZXJmYWNlcyxcCi0gamF2YXguY3J5cHRvLnNwZWMsXAotIGphdmF4LmltYWdlaW8sXAotIGphdmF4LmltYWdlaW8uZXZlbnQsXAotIGphdmF4LmltYWdlaW8ubWV0YWRhdGEsXAotIGphdmF4LmltYWdlaW8ucGx1Z2lucy5ibXAsXAotIGphdmF4LmltYWdlaW8ucGx1Z2lucy5qcGVnLFwKLSBqYXZheC5pbWFnZWlvLnNwaSxcCi0gamF2YXguaW1hZ2Vpby5zdHJlYW0sXAotIGphdmF4Lm1hbmFnZW1lbnQsXAotIGphdmF4Lm1hbmFnZW1lbnQubG9hZGluZyxcCi0gamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3IsXAotIGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uLFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZSxcCi0gamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pLFwKLSBqYXZheC5tYW5hZ2VtZW50LnRpbWVyLFwKLSBqYXZheC5uYW1pbmcsXAotIGphdmF4Lm5hbWluZy5kaXJlY3RvcnksXAotIGphdmF4Lm5hbWluZy5ldmVudCxcCi0gamF2YXgubmFtaW5nLmxkYXAsXAotIGphdmF4Lm5hbWluZy5zcGksXAotIGphdmF4Lm5ldCxcCi0gamF2YXgubmV0LnNzbCxcCi0gamF2YXgucHJpbnQsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZSxcCi0gamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkLFwKLSBqYXZheC5wcmludC5ldmVudCxcCi0gamF2YXgucm1pLFwKLSBqYXZheC5ybWkuQ09SQkEsXAotIGphdmF4LnJtaS5zc2wsXAotIGphdmF4LnNlY3VyaXR5LmF1dGgsXAotIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssXAotIGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MsXAotIGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4sXAotIGphdmF4LnNlY3VyaXR5LmF1dGguc3BpLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAsXAotIGphdmF4LnNlY3VyaXR5LmNlcnQsXAotIGphdmF4LnNlY3VyaXR5LnNhc2wsXAotIGphdmF4LnNvdW5kLm1pZGksXAotIGphdmF4LnNvdW5kLm1pZGkuc3BpLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLFwKLSBqYXZheC5zb3VuZC5zYW1wbGVkLnNwaSxcCi0gamF2YXguc3FsLFwKLSBqYXZheC5zcWwucm93c2V0LFwKLSBqYXZheC5zcWwucm93c2V0LnNlcmlhbCxcCi0gamF2YXguc3FsLnJvd3NldC5zcGksXAotIGphdmF4LnN3aW5nLFwKLSBqYXZheC5zd2luZy5ib3JkZXIsXAotIGphdmF4LnN3aW5nLmNvbG9yY2hvb3NlcixcCi0gamF2YXguc3dpbmcuZXZlbnQsXAotIGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5wbGFmLFwKLSBqYXZheC5zd2luZy5wbGFmLmJhc2ljLFwKLSBqYXZheC5zd2luZy5wbGFmLm1ldGFsLFwKLSBqYXZheC5zd2luZy5wbGFmLm11bHRpLFwKLSBqYXZheC5zd2luZy5wbGFmLnN5bnRoLFwKLSBqYXZheC5zd2luZy50YWJsZSxcCi0gamF2YXguc3dpbmcudGV4dCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwucGFyc2VyLFwKLSBqYXZheC5zd2luZy50ZXh0LnJ0ZixcCi0gamF2YXguc3dpbmcudHJlZSxcCi0gamF2YXguc3dpbmcudW5kbyxcCi0gamF2YXgudHJhbnNhY3Rpb24sXAotIGphdmF4LnRyYW5zYWN0aW9uLnhhLFwKLSBqYXZheC54bWwsXAotIGphdmF4LnhtbC5kYXRhdHlwZSxcCi0gamF2YXgueG1sLm5hbWVzcGFjZSxcCi0gamF2YXgueG1sLnBhcnNlcnMsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0sXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLnNheCxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sXAotIGphdmF4LnhtbC52YWxpZGF0aW9uLFwKLSBqYXZheC54bWwueHBhdGgsXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuQ09SQkEsXAotIG9yZy5vbWcuQ09SQkFfMl8zLFwKLSBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLk9SQlBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZyxcCi0gb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dFBhY2thZ2UsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWMsXAotIG9yZy5vbWcuRHluYW1pY0FueSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLkR5bmFtaWNBbnkuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5JT1AsXAotIG9yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLkNvZGVjUGFja2FnZSxcCi0gb3JnLm9tZy5NZXNzYWdpbmcsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvcixcCi0gb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRJbmZvUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlcixcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FNYW5hZ2VyUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlLFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnRMb2NhdG9yUGFja2FnZSxcCi0gb3JnLm9tZy5TZW5kaW5nQ29udGV4dCxcCi0gb3JnLm9tZy5zdHViLmphdmEucm1pLFwKLSBvcmcudzNjLmRvbSxcCi0gb3JnLnczYy5kb20uYm9vdHN0cmFwLFwKLSBvcmcudzNjLmRvbS5ldmVudHMsXAotIG9yZy53M2MuZG9tLmxzLFwKLSBvcmcueG1sLnNheCxcCi0gb3JnLnhtbC5zYXguZXh0LFwKLSBvcmcueG1sLnNheC5oZWxwZXJzCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gamF2YXguKixcCi0gb3JnLmlldGYuamdzcyxcCi0gb3JnLm9tZy4qLFwKLSBvcmcudzNjLiosXAotIG9yZy54bWwuKixcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIEpSRS0xLjEsXAotIEoyU0UtMS4yLFwKLSBKMlNFLTEuMyxcCi0gSjJTRS0xLjQsXAotIEoyU0UtMS41LFwKLSBKYXZhU0UtMS42Ci1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gSmF2YVNFLTEuNgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9PU0dpX01pbmltdW0tMS4wLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL09TR2lfTWluaW11bS0xLjAucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMmQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL09TR2lfTWluaW11bS0xLjAucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBPU0dpL01pbmltdW0tMS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL09TR2lfTWluaW11bS0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvT1NHaV9NaW5pbXVtLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDhiNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvT1NHaV9NaW5pbXVtLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IE9TR2kvTWluaW11bS0xLjEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMDY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iY2xlYW4sIGFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphciI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuYXBwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2FudF90YXNrcyIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMy4xLjAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyIj4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iIGZhaWxvbmVycm9yPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIiBkZWJ1Zz0ib24iPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZGlyc2V0IGRpcj0iJHtiYXNlZGlyfS8uLiI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL2JpbiIvPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS5vc2dpL2JpbiIvPgotCQkJCTwvZGlyc2V0PgotCQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLmhvbWV9Ij4KLQkJCQkJPGluY2x1ZGUgbmFtZT0icGx1Z2lucy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciouamFyIi8+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9InBsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSouamFyIi8+Ci0JCQkJPC9maWxlc2V0PgotCQkJPC9jbGFzc3BhdGg+Ci0JCQk8c3JjIHBhdGg9InNyY19hbnQvIi8+Ci0JCTwvamF2YWM+Ci0JCTwhLS0gY29weSBuZWNlc3NhcnkgcmVzb3VyY2VzIC0tPgotCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbiI+Ci0JCQk8ZmlsZXNldCBkaXI9InNyY19hbnQvIiBleGNsdWRlcz0iKiovKi5qYXZhIi8+Ci0JCTwvY29weT4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8amFyIGphcmZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vZ2VuZXJhdG9yLWFudC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2dlbmVyYXRvci1hbnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0Fic3RyYWN0UHVibGlzaGVyQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0Fic3RyYWN0UHVibGlzaGVyQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLlByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lk1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaGVyQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JLy8gVGhlIG1hcHBpbmcgcnVsZXMgZm9yIGluLXBsYWNlIGdlbmVyYXRpb24gbmVlZCB0byBjb25zdHJ1Y3QgcGF0aHMgaW50byB0aGUgc3RydWN0dXJlCi0JLy8gb2YgYW4gZWNsaXBzZSBpbnN0YWxsYXRpb247IGluIHRoZSBmdXR1cmUgdGhlIGRlZmF1bHQgYXJ0aWZhY3QgbWFwcGluZyBkZWNsYXJlZCBpbgotCS8vIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSBtYXkgY2hhbmdlLCBmb3IgZXhhbXBsZSwgdG8gbm90IGhhdmUgYSAnYnVuZGxlcycgZGlyZWN0b3J5Ci0JLy8gaW5zdGVhZCBvZiBhICdwbHVnaW5zJyBkaXJlY3RvcnksIHNvIGEgc2VwYXJhdGUgY29uc3RhbnQgaXMgZGVmaW5lZCBhbmQgdXNlZCBoZXJlLgotCXN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgU3RyaW5nW11bXSBJTlBMQUNFX01BUFBJTkdfUlVMRVMgPSB7IHsiKCYgKGNsYXNzaWZpZXI9b3NnaS5idW5kbGUpIChmb3JtYXQ9cGFja2VkKSIsICIke3JlcG9Vcmx9L2ZlYXR1cmVzLyR7aWR9XyR7dmVyc2lvbn0uamFyLnBhY2suZ3oifSwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXsiKCYgKGNsYXNzaWZpZXI9b3NnaS5idW5kbGUpKSIsICIke3JlcG9Vcmx9L3BsdWdpbnMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifSwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXsiKCYgKGNsYXNzaWZpZXI9YmluYXJ5KSkiLCAiJHtyZXBvVXJsfS9iaW5hcnkvJHtpZH1fJHt2ZXJzaW9ufSJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifX07IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MgPSAicHVibGlzaFBhY2tGaWxlc0FzU2libGluZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgZGVmYXVsdEFydGlmYWN0TWFuYWdlcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uRGVmYXVsdEFydGlmYWN0TWFuYWdlcjsKLQlwcml2YXRlIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgZGVmYXVsdE1ldGFkYXRhTWFuYWdlcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uRGVmYXVsdE1ldGFkYXRhTWFuYWdlcjsKLQlwcml2YXRlIElQcm92aXNpb25pbmdFdmVudEJ1cyBidXM7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkJ1czsKLQlwcm90ZWN0ZWQgUHVibGlzaGVySW5mbyBpbmZvOwotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCXByb3RlY3RlZCBTdHJpbmcgbWV0YWRhdGFMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGFkYXRhUmVwb05hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBhcnRpZmFjdExvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgYXJ0aWZhY3RSZXBvTmFtZTsKLQkvL3doZXRoZXIgcmVwb3NpdG9yeSB4bWwgZmlsZXMgc2hvdWxkIGJlIGNvbXByZXNzZWQKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlucGxhY2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXVzZVBhY2tlZEZpbGVzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbmZpZ3VyYXRpb25zOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQdWJsaXNoZXJJbmZvIGluZm8pIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoaW5wbGFjZSkgewotCQkJRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKHNvdXJjZSk7Ci0JCQl0cnkgewotCQkJCWlmIChtZXRhZGF0YUxvY2F0aW9uID09IG51bGwpCi0JCQkJCW1ldGFkYXRhTG9jYXRpb24gPSBsb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJaWYgKGFydGlmYWN0TG9jYXRpb24gPT0gbnVsbCkKLQkJCQkJYXJ0aWZhY3RMb2NhdGlvbiA9IGxvY2F0aW9uLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gb3VnaHQgbm90IGhhcHBlbi4uLgotCQkJfQotCQkJaW5mby5zZXRBcnRpZmFjdE9wdGlvbnMoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSB8IElQdWJsaXNoZXJJbmZvLkFfSU5ERVggfCBJUHVibGlzaGVySW5mby5BX1BVQkxJU0gpOwotCQl9IGVsc2UKLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX0lOREVYIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIIHwgSVB1Ymxpc2hlckluZm8uQV9PVkVSV1JJVEUpOwotCQlpbml0aWFsaXplUmVwb3NpdG9yaWVzKGluZm8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXBvc2l0b3JpZXMoUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaW5mby5zZXRBcnRpZmFjdFJlcG9zaXRvcnkoUHVibGlzaGVyLmNyZWF0ZUFydGlmYWN0UmVwb3NpdG9yeShhcnRpZmFjdExvY2F0aW9uLCBhcnRpZmFjdFJlcG9OYW1lLCBhcHBlbmQsIGNvbXByZXNzLCByZXVzZVBhY2tlZEZpbGVzKSk7Ci0JCWluZm8uc2V0TWV0YWRhdGFSZXBvc2l0b3J5KFB1Ymxpc2hlci5jcmVhdGVNZXRhZGF0YVJlcG9zaXRvcnkobWV0YWRhdGFMb2NhdGlvbiwgbWV0YWRhdGFSZXBvTmFtZSwgYXBwZW5kLCBjb21wcmVzcykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb21tYW5kTGluZUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzLCBQdWJsaXNoZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLQkJCXByb2Nlc3NGbGFnKGFyZ3NbaV0sIGluZm8pOwotCi0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmd1bWVudCBvciBpZiB0aGUgbmV4dCBvbmUKLQkJCS8vIGhhcyBhICctJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHdlIGNhbid0IGhhdmUgYW4gYXJnIHdpdGggYSBwYXJtIHNvIGNvbnRpbnVlLgotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJcHJvY2Vzc1BhcmFtZXRlcihhcmdzW2ldLCBhcmdzWysraV0sIGluZm8pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BhcmFtZXRlcihTdHJpbmcgYXJnLCBTdHJpbmcgcGFyYW1ldGVyLCBQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItbWV0YWRhdGFSZXBvc2l0b3J5IikgfHwgYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1tciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW1ldGFkYXRhTG9jYXRpb24gPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItbWV0YWRhdGFSZXBvc2l0b3J5TmFtZSIpKSAvLyROT04tTkxTLTEkCi0JCQltZXRhZGF0YVJlcG9OYW1lID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXNvdXJjZSIpKSAvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UgPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItYXJ0aWZhY3RSZXBvc2l0b3J5IikgfCBhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWFyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXJ0aWZhY3RMb2NhdGlvbiA9IHBhcmFtZXRlcjsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnlOYW1lIikpIC8vJE5PTi1OTFMtMSQKLQkJCWFydGlmYWN0UmVwb05hbWUgPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItY29uZmlncyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbmZvLnNldENvbmZpZ3VyYXRpb25zKEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5nZXRBcnJheUZyb21TdHJpbmcocGFyYW1ldGVyLCAiLCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NGbGFnKFN0cmluZyBhcmcsIFB1Ymxpc2hlckluZm8gaW5mbykgewotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1wdWJsaXNoQXJ0aWZhY3RzIikgfHwgYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1wYSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX1BVQkxJU0gpOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXB1Ymxpc2hBcnRpZmFjdFJlcG9zaXRvcnkiKSB8fCBhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXBhciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX0lOREVYKTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1vdmVyd3JpdGVBcnRpZmFjdHMiKSkgLy8kTk9OLU5MUy0xJCAKLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX09WRVJXUklURSk7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItYXBwZW5kIikpIC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZCA9IHRydWU7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItY29tcHJlc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29tcHJlc3MgPSB0cnVlOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXJldXNlUGFjazIwMEZpbGVzIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldXNlUGFja2VkRmlsZXMgPSB0cnVlOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWlucGxhY2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJaW5wbGFjZSA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdEFydGlmYWN0UmVwb01hbmFnZXIoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGRlZmF1bHRBcnRpZmFjdE1hbmFnZXIsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdE1ldGFkYXRhUmVwb01hbmFnZXIoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0TWV0YWRhdGFNYW5hZ2VyID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGRlZmF1bHRNZXRhZGF0YU1hbmFnZXIsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRXZlbnRCdXMoKSB7Ci0JCWlmIChTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSkgPT0gbnVsbCkgewotCQkJYnVzID0gbmV3IFByb3Zpc2lvbmluZ0V2ZW50QnVzKCk7Ci0JCQlyZWdpc3RyYXRpb25CdXMgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FLCBidXMsIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBydW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluZm8gPSBjcmVhdGVQdWJsaXNoZXJJbmZvKCk7Ci0JCXByb2Nlc3NDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdzLCBpbmZvKTsKLQkJT2JqZWN0IHJlc3VsdCA9IHJ1bihpbmZvKTsKLQkJaWYgKHJlc3VsdCAhPSBJQXBwbGljYXRpb24uRVhJVF9PSykKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oYXJnc1tpXSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFB1Ymxpc2hlckluZm8gY3JlYXRlUHVibGlzaGVySW5mbygpIHsKLQkJcmV0dXJuIG5ldyBQdWJsaXNoZXJJbmZvKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBydW4oUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVnaXN0ZXJFdmVudEJ1cygpOwotCQlyZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCk7Ci0JCXJlZ2lzdGVyRGVmYXVsdEFydGlmYWN0UmVwb01hbmFnZXIoKTsKLQkJaW5pdGlhbGl6ZShpbmZvKTsKLQkJdmFsaWRhdGVJbmZvKGluZm8pOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMubWVzc2FnZV9nZW5lcmF0aW5nTWV0YWRhdGEsIGluZm8uZ2V0U3VtbWFyeSgpKSk7Ci0KLQkJbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJSVB1Ymxpc2hpbmdBY3Rpb25bXSBhY3Rpb25zID0gY3JlYXRlQWN0aW9ucygpOwotCQlQdWJsaXNoZXIgcHVibGlzaGVyID0gY3JlYXRlUHVibGlzaGVyKGluZm8pOwotCQlJU3RhdHVzIHJlc3VsdCA9IHB1Ymxpc2hlci5wdWJsaXNoKGFjdGlvbnMpOwotCQlsb25nIGFmdGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKHJlc3VsdC5pc09LKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5tZXNzYWdlX2dlbmVyYXRpb25Db21wbGV0ZWQsIFN0cmluZy52YWx1ZU9mKChhZnRlciAtIGJlZm9yZSkgLyAxMDAwKSkpOwotCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOwotCQlyZXR1cm4gbmV3IEludGVnZXIoMSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElQdWJsaXNoaW5nQWN0aW9uW10gY3JlYXRlQWN0aW9ucygpOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hlciBjcmVhdGVQdWJsaXNoZXIoUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCXJldHVybiBuZXcgUHVibGlzaGVyKGluZm8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5mbyhQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJLy8JCWlmIChpbmZvLmdldEJhc2VMb2NhdGlvbigpID09IG51bGwgJiYgaW5mby5nZXRQcm9kdWN0KCkgPT0gbnVsbCkgewotCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5leGNlcHRpb25fYmFzZUxvY2F0aW9uTm90U3BlY2lmaWVkKTsKLQkJLy8JCQlyZXR1cm4gbmV3IEludGVnZXIoLTEpOwotCQkvLwkJfQotCX0KLQotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJ1bigoU3RyaW5nW10pIGNvbnRleHQuZ2V0QXJndW1lbnRzKCkuZ2V0KCJhcHBsaWNhdGlvbi5hcmdzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmVnaXN0cmF0aW9uRGVmYXVsdE1ldGFkYXRhTWFuYWdlci51bnJlZ2lzdGVyKCk7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0TWV0YWRhdGFNYW5hZ2VyID0gbnVsbDsKLQkJfQotCQlpZiAocmVnaXN0cmF0aW9uRGVmYXVsdEFydGlmYWN0TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyLnVucmVnaXN0ZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXIgPSBudWxsOwotCQl9Ci0JCWlmIChyZWdpc3RyYXRpb25CdXMgIT0gbnVsbCkgewotCQkJcmVnaXN0cmF0aW9uQnVzLnVucmVnaXN0ZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbkJ1cyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmFydGlmYWN0TG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLm1ldGFkYXRhTG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXVzZUV4aXN0aW5nUGFjazIwMEZpbGVzKCkgewotCQlyZXR1cm4gcmV1c2VQYWNrZWRGaWxlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXVzZUV4aXN0aW5nUGFja2VkRmlsZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlyZXVzZVBhY2tlZEZpbGVzID0gdmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0Fic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRmZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0Fic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIGltcGxlbWVudHMgSVB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNfSVMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfUk9PVCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfU0VHTUVOVF9TRVBBUkFUT1IgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnZlcnQgYSBsaXN0IG9mIHRva2VucyBpbnRvIGFuIGFycmF5LiBUaGUgbGlzdCBzZXBhcmF0b3IgaGFzIHRvIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QXJyYXlGcm9tU3RyaW5nKFN0cmluZyBsaXN0LCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsIHNlcGFyYXRvcik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKCF0b2tlbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFkZCh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBvZiB7IHdzLCBvcywgYXJjaCB9IGFzIHBhcnNlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gY29uZmlnU3BlYyB0aGUgc3RyaW5nIHRvIHBhcnNlCi0JICogQHJldHVybiB0aGUgd3MsIG9zLCBhcmNoIGZvcm0gb2YgdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gcGFyc2VDb25maWdTcGVjKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IGdldEFycmF5RnJvbVN0cmluZyhjb25maWdTcGVjLCBDT05GSUdfU0VHTUVOVF9TRVBBUkFUT1IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExEQVAgZmlsdGVyIGZvcm0gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjb25maWcgc3BlYy4gIFJldHVybnMKLQkgKiBhbiBlbXB0eSBTdHJpbmcgaWYgdGhlIHNwZWMgZG9lcyBub3QgaWRlbnRpZnkgYW4gd3MsIG9zIG9yIGFyY2guCi0JICogQHBhcmFtIGNvbmZpZ1NwZWMgYSBjb25maWcgc3BlYyB0byBmaWx0ZXIKLQkgKiBAcmV0dXJuIHRoZSBMREFQIGZpbHRlciBmb3IgdGhlIGdpdmVuIHNwZWMuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVGaWx0ZXJTcGVjKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZyA9IHBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKLQkJaWYgKGNvbmZpZ1swXSAhPSBudWxsIHx8IGNvbmZpZ1sxXSAhPSBudWxsIHx8IGNvbmZpZ1syXSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsdGVyV3MgPSBjb25maWdbMF0gIT0gbnVsbCA/ICIob3NnaS53cz0iICsgY29uZmlnWzBdICsgIikiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTdHJpbmcgZmlsdGVyT3MgPSBjb25maWdbMV0gIT0gbnVsbCA/ICIob3NnaS5vcz0iICsgY29uZmlnWzFdICsgIikiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTdHJpbmcgZmlsdGVyQXJjaCA9IGNvbmZpZ1syXSAhPSBudWxsID8gIihvc2dpLmFyY2g9IiArIGNvbmZpZ1syXSArICIpIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuICIoJiAiICsgZmlsdGVyV3MgKyBmaWx0ZXJPcyArIGZpbHRlckFyY2ggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgc3RyaW5nIGZvcm0gb2YgdGhlIGdpdmVuIGNvbmZpZyBzcGVjLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHB1dHRpbmcKLQkgKiBpbiBJVSBpZHMgZXRjLiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgbWFjaGluZSByZWFkYWJsZSAoaS5lLiwgcGFyc2VDb25maWdTcGVjCi0JICogbWF5IG5vdCB3b3JrIG9uIHRoZSByZXN1bHQpLgotCSAqIEBwYXJhbSBjb25maWdTcGVjIHRoZSBjb25maWcgc3BlYyB0byBmb3JtYXQKLQkgKiBAcmV0dXJuIHRoZSByZWFkYWJsZSBmb3JtYXQgb2YgdGhlIGdpdmVuIGNvbmZpZyBzcGVjCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSWRTdHJpbmcoU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJU3RyaW5nW10gY29uZmlnID0gcGFyc2VDb25maWdTcGVjKGNvbmZpZ1NwZWMpOwotCQlyZXR1cm4gY29uZmlnWzBdICsgJy4nICsgY29uZmlnWzFdICsgJy4nICsgY29uZmlnWzJdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGNvbmZpZyBzcGVjIHdpdGggdGhlIGdpdmVuIHdzLCBvcyBhbmQgYXJjaC4KLQkgKiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBpcyBpbnRlbmRlZCB0byBiZSBtYWNoaW5lIHJlYWRhYmxlIChpLmUuLCBwYXJzZUNvbmZpZ1NwZWMKLQkgKiB3aWxsIHBhcnNlIHRoZSB0aGUgcmVzdWx0KS4KLQkgKiBAcGFyYW0gd3MgdGhlIHdpbmRvdyBzeXN0ZW0KLQkgKiBAcGFyYW0gb3MgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLQkgKiBAcGFyYW0gYXJjaCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUKLQkgKiBAcmV0dXJuIHRoZSBtYWNoaW5lIHJlYWRhYmxlIGZvcm1hdCBvZiB0aGUgZ2l2ZW4gY29uZmlnIHNwZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb25maWdTcGVjKFN0cmluZyB3cywgU3RyaW5nIG9zLCBTdHJpbmcgYXJjaCkgewotCQlyZXR1cm4gd3MgKyAnLicgKyBvcyArICcuJyArIGFyY2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgRmlsZVtdIGZpbGVzLCBJUHVibGlzaGVySW5mbyBpbmZvLCBpbnQgbW9kZSkgewotCQlwdWJsaXNoQXJ0aWZhY3QoZGVzY3JpcHRvciwgZmlsZXMsIG51bGwsIGluZm8sIG1vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGUgYmFzZSwgRmlsZVtdIGZpbGVzLCBJUHVibGlzaGVySW5mbyBpbmZvLCBpbnQgbW9kZSkgewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uID0gaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCB8fCBkZXN0aW5hdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHB1Ymxpc2ggdGhlIGdpdmVuIGZpbGVzCi0JCXB1Ymxpc2hBcnRpZmFjdChkZXNjcmlwdG9yLCBmaWxlcywgbnVsbCwgaW5mbywgbW9kZSk7Ci0KLQkJLy8gaWYgd2UgYXJlIGFzc2ltaWxhdGluZyBwYWNrMjAwIGZpbGVzIHRoZW4gYWRkIHRoZSBwYWNrZWQgZGVzY3JpcHRvcgotCQkvLyBpbnRvIHRoZSByZXBvIGFzc3VtaW5nIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JCWJvb2xlYW4gcmV1c2UgPSAidHJ1ZSIuZXF1YWxzKGRlc3RpbmF0aW9uLmdldFByb3BlcnRpZXMoKS5nZXQoQWJzdHJhY3RQdWJsaXNoZXJBcHBsaWNhdGlvbi5QVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYmFzZSAhPSBudWxsICYmIHJldXNlICYmIChpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpICYgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKSA+IDApIHsKLQkJCUZpbGUgcGFja0ZpbGUgPSBuZXcgUGF0aChiYXNlLmdldEFic29sdXRlUGF0aCgpKS5hZGRGaWxlRXh0ZW5zaW9uKCJwYWNrLmd6IikudG9GaWxlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwYWNrRmlsZS5leGlzdHMoKSkgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgYWQyMDAgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVQYWNrMjAwQXJ0aWZhY3REZXNjcmlwdG9yKGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSwgcGFja0ZpbGUsIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9TSVpFKSk7Ci0JCQkJcHVibGlzaEFydGlmYWN0KGFkMjAwLCBuZXcgRmlsZVtdIHtwYWNrRmlsZX0sIG51bGwsIGluZm8sIEFTX0lTIHwgSU5DTFVERV9ST09UKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGVbXSBmaWxlcywgRmlsZSByb290LCBJUHVibGlzaGVySW5mbyBpbmZvLCBpbnQgbW9kZSkgewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uID0gaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQotCQkvLyBpZiB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBjb250YWlucyB0aGUgZGVzY3JpcHRvciwgdGhlcmUgaXMgbm90aGluZyB0byBkby4KLQkJaWYgKGRlc3RpbmF0aW9uLmNvbnRhaW5zKGRlc2NyaXB0b3IpKQotCQkJcmV0dXJuOwotCQkvLyBpZiBhbGwgd2UgYXJlIGRvaW5nIGlzIGluZGV4aW5nIHRoaW5ncyB0aGVuIGFkZCB0aGUgZGVzY3JpcHRvciBhbmQgZ2V0IG9uIHdpdGggdGkKLQkJaWYgKChpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpICYgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKSA9PSAwKSB7Ci0JCQlkZXN0aW5hdGlvbi5hZGREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBvdmVyd3JpdGUgPSAoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSAmIElQdWJsaXNoZXJJbmZvLkFfT1ZFUldSSVRFKSA+IDA7Ci0JCS8vIGlmIHRoZXJlIGlzIGp1c3Qgb25lIGZpbGUgYW5kIHRoZSBtb2RlIGlzIGFzLWlzLCBqdXN0IGNvcHkgdGhlIGZpbGUgaW50byB0aGUgcmVwbwotCQlpZiAoKChtb2RlICYgQVNfSVMpID4gMCkgJiYgZmlsZXMubGVuZ3RoID09IDEpIHsKLQkJCXRyeSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbShkZXNjcmlwdG9yLCBvdmVyd3JpdGUpOwotCQkJCWlmIChvdXRwdXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCW91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRwdXQpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZXNbMF0pKSwgdHJ1ZSwgb3V0cHV0LCB0cnVlKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgcHVibGlzaGluZyBhcnRpZmFjdHMiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIG90aGVyd2lzZSwgemlwIHVwIHRoZSBmaWxlcyBhbmQgY29weSB0aGUgemlwIGludG8gdGhlIHJlcG8KLQkJCUZpbGUgdGVtcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gZGVzdGluYXRpb24uZ2V0T3V0cHV0U3RyZWFtKGRlc2NyaXB0b3IsIG92ZXJ3cml0ZSk7Ci0JCQkJaWYgKG91dHB1dCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0JCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwMi5nZW5lcmF0b3IiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChyb290ID09IG51bGwpCi0JCQkJCUZpbGVVdGlscy56aXAoZmlsZXMsIHRlbXBGaWxlLCAobW9kZSAmIElOQ0xVREVfUk9PVCkgPiAwKTsKLQkJCQllbHNlCi0JCQkJCUZpbGVVdGlscy56aXAoZmlsZXMsIHRlbXBGaWxlLCByb290KTsKLQkJCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcEZpbGUpKSwgdHJ1ZSwgb3V0cHV0LCB0cnVlKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgcHVibGlzaGluZyBhcnRpZmFjdHMiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRlbXBGaWxlICE9IG51bGwpCi0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlMGNhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9CdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0J1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTkwNDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0J1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb24uUGx1Z2luQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbi5QbHVnaW5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJkaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSID0gImphciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9GSUxFTkFNRV9ERVNDUklQVE9SID0gImZlYXR1cmUueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRklMRU5BTUVfREVTQ1JJUFRPUiA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9GSUxFTkFNRV9ERVNDUklQVE9SID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVTkRMRV9TSEFQRSA9ICJFY2xpcHNlLUJ1bmRsZVNoYXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JVTkRMRV9MT0NBTElaQVRJT04gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAkKLQkvLwlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04gPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JLy8Jc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9MT0NBTElaQVRJT05TID0gImVjbGlwc2UucDIubWFuaWZlc3QubG9jYWxpemF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkvLwotCS8vCXN0YXRpYyBmaW5hbCBMb2NhbGUgREVGQVVMVF9MT0NBTEUgPSBuZXcgTG9jYWxlKCJkZiIsICJMVCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCS8vCXN0YXRpYyBmaW5hbCBMb2NhbGUgUFNFVURPX0xPQ0FMRSA9IG5ldyBMb2NhbGUoInp6IiwgIlpaIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlTdGF0ZU9iamVjdEZhY3RvcnkgZmFjdG9yeTsKLQlTdGF0ZSBzdGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGdldEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShjb250ZXh0LCBQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGF0Zm9ybUFkbWluID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQbGF0Zm9ybUFkbWluIG5vdCByZWdpc3RlcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KFN0YXRlT2JqZWN0RmFjdG9yeSBmYWN0b3J5LCBTdGF0ZSBzdGF0ZSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCS8vVE9ETyBmaW5kIGEgc3RhdGUgYW5kIGEgZmFjdG9yeSB3aGVuIG5vdCBwcm92aWRlZAotCX0KLQotCXByaXZhdGUgc3RhdGljIFBsdWdpbkNvbnZlcnRlciBhY3F1aXJlUGx1Z2luQ29udmVydGVyKCkgewotCQlyZXR1cm4gKFBsdWdpbkNvbnZlcnRlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIFBsdWdpbkNvbnZlcnRlci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERpY3Rpb25hcnkgY29udmVydFBsdWdpbk1hbmlmZXN0KEZpbGUgYnVuZGxlTG9jYXRpb24sIGJvb2xlYW4gbG9nQ29udmVyc2lvbkV4Y2VwdGlvbikgewotCQlQbHVnaW5Db252ZXJ0ZXIgY29udmVydGVyOwotCQl0cnkgewotCQkJY29udmVydGVyID0gYWNxdWlyZVBsdWdpbkNvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIlVuYWJsZSB0byBhcXVpcmUgUGx1Z2luQ29udmVydGVyIHNlcnZpY2UgZHVyaW5nIGdlbmVyYXRpb24gZm9yOiAiICsgYnVuZGxlTG9jYXRpb24pKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBjb252ZXJ0ZXIuY29udmVydE1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCBmYWxzZSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbikgewotCQkJLy8gb25seSBsb2cgdGhlIGV4Y2VwdGlvbiBpZiB3ZSBoYWQgYSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCBhbmQgd2UgZmFpbGVkIGNvbnZlcnNpb24KLQkJCWlmIChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkuZXF1YWxzKEZFQVRVUkVfRklMRU5BTUVfREVTQ1JJUFRPUikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIW5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBQTFVHSU5fRklMRU5BTUVfREVTQ1JJUFRPUikuZXhpc3RzKCkgJiYgIW5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBGUkFHTUVOVF9GSUxFTkFNRV9ERVNDUklQVE9SKS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChsb2dDb252ZXJzaW9uRXhjZXB0aW9uKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAwLCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fZXJyb3JDb252ZXJ0aW5nLCBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSksIGNvbnZlcnRFeGNlcHRpb24pOwotCQkJCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldEJ1bmRsZURlc2NyaXB0aW9uKERpY3Rpb25hcnkgZW5oYW5jZWRNYW5pZmVzdCwgRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQl0cnkgewotCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRvciA9IGZhY3RvcnkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIGVuaGFuY2VkTWFuaWZlc3QsIGJ1bmRsZUxvY2F0aW9uICE9IG51bGwgPyBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSA6IG51bGwsIDEpOyAvL1RPRE8gRG8gd2UgbmVlZCB0byBoYXZlIGEgcmVhbCBidW5kbGUgaWQKLQkJCWRlc2NyaXB0b3Iuc2V0VXNlck9iamVjdChlbmhhbmNlZE1hbmlmZXN0KTsKLQkJCXJldHVybiBkZXNjcmlwdG9yOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fc3RhdGVBZGRpdGlvbiwgYnVuZGxlTG9jYXRpb24gPT0gbnVsbCA/IG51bGwgOiBidW5kbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIGUpOwotCQkJTG9nSGVscGVyLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gZ2V0QnVuZGxlRGVzY3JpcHRpb24oRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gbG9hZE1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldEJ1bmRsZURlc2NyaXB0aW9uKG1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldEJ1bmRsZURlc2NyaXB0aW9uKElucHV0U3RyZWFtIG1hbmlmZXN0U3RyZWFtLCBGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCUhhc2h0YWJsZSBlbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQl0cnkgewotCQkJTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QobWFuaWZlc3RTdHJlYW0sIGVudHJpZXMpOwotCQkJcmV0dXJuIGdldEJ1bmRsZURlc2NyaXB0aW9uKGVudHJpZXMsIGJ1bmRsZUxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgYnVuZGxlIGRlc2NyaXB0aW9uLiI7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBlKTsKLQkJCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIGJ1bmRsZSBkZXNjcmlwdGlvbi4iOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSk7Ci0JCQlMb2dIZWxwZXIubG9nKHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaWN0aW9uYXJ5IGxvYWRNYW5pZmVzdChGaWxlIGJ1bmRsZUxvY2F0aW9uKSB7Ci0JCUlucHV0U3RyZWFtIG1hbmlmZXN0U3RyZWFtID0gbnVsbDsKLQkJWmlwRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKG5ldyBQYXRoKGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiBidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JCQkJWmlwRW50cnkgbWFuaWZlc3RFbnRyeSA9IGphckZpbGUuZ2V0RW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKLQkJCQlpZiAobWFuaWZlc3RFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCW1hbmlmZXN0U3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShtYW5pZmVzdEVudHJ5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIEphckZpbGUuTUFOSUZFU1RfTkFNRSk7Ci0JCQkJaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSkKLQkJCQkJbWFuaWZlc3RTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSkpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZSBidXQgbG9nCi0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBidW5kbGUgbWFuaWZlc3QuIiwgZSkpOwotCQl9Ci0KLQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IG51bGw7Ci0JCWlmIChtYW5pZmVzdFN0cmVhbSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCU1hcCBtYW5pZmVzdE1hcCA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KG1hbmlmZXN0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyBUT0RPIHRlbXBvcmFyeSBoYWNrLiAgV2UgYXJlIHJlYWRpbmcgYSBNYXAgYnV0IGV2ZXJ5b25lIHdhbnRzIGEgRGljdGlvbmFyeSBzbyBjb252ZXJ0LgotCQkJCS8vIHJlYWwgYW5zd2VyIGlzIHRvIGhhdmUgcGVvcGxlIGV4cGVjdCBhIE1hcCBidXQgdGhhdCBpcyBhIHdpZGVyIGNoYW5nZS4KLQkJCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUobWFuaWZlc3RNYXApOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBidW5kbGUgbWFuaWZlc3QuIiwgZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgYnVuZGxlIG1hbmlmZXN0LiIsIGUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJCWphckZpbGUuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1hbmlmZXN0ID0gY29udmVydFBsdWdpbk1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCB0cnVlKTsKLQkJfQotCi0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy9EZWFsIHdpdGggdGhlIHByZS0zLjAgcGx1Zy1pbiBzaGFwZSB3aG8gaGF2ZSBhIGRlZmF1bHQgamFyIG1hbmlmZXN0Lm1mCi0JCWlmIChtYW5pZmVzdC5nZXQob3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSA9PSBudWxsKQotCQkJbWFuaWZlc3QgPSBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoYnVuZGxlTG9jYXRpb24sIHRydWUpOwotCi0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGlmIHRoZSBidW5kbGUgaXRzZWxmIGRvZXMgbm90IGRlZmluZSBpdHMgc2hhcGUsIGluZmVyIHRoZSBzaGFwZSBmcm9tIHRoZSBjdXJyZW50IGZvcm0KLQkJaWYgKG1hbmlmZXN0LmdldChCVU5ETEVfU0hBUEUpID09IG51bGwpCi0JCQltYW5pZmVzdC5wdXQoQlVORExFX1NIQVBFLCBidW5kbGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpID8gRElSIDogSkFSKTsKLQkJZ2V0TWFuaWZlc3RMb2NhbGl6YXRpb25zKG1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbik7Ci0JCS8vIGxvY2FsaXplTWFuaWZlc3QobWFuaWZlc3QsIGJ1bmRsZUxvY2F0aW9uKTsKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KLQotCS8vCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLwkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCS8vCQlJbnB1dFN0cmVhbSBwcm9wZXJ0eVN0cmVhbSA9IG51bGw7Ci0JLy8JCXRyeSB7Ci0JLy8JCQl0cnkgewotCS8vCQkJCWlmIChidW5kbGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpKQotCS8vCQkJCQlwcm9wZXJ0eVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIGxvY2FsaXphdGlvbkZpbGUpKTsKLQkvLwkJCQllbHNlIHsKLQkvLwkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTCgiamFyOiIgKyBidW5kbGVMb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIS8iICsgbG9jYWxpemF0aW9uRmlsZSkub3BlbkNvbm5lY3Rpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8JCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkvLwkJCQkJcHJvcGVydHlTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JLy8JCQkJfQotCS8vCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkvLwkJCQkvLyBpZiB0aGVyZSBpcyBubyBtZXNzYWdlcyBmaWxlIHRoZW4ganVzdCByZXR1cm47Ci0JLy8JCQkJcmV0dXJuIHJlc3VsdDsKLQkvLwkJCX0KLQkvLwkJCXJlc3VsdC5sb2FkKHByb3BlcnR5U3RyZWFtKTsKLQkvLwkJfSBmaW5hbGx5IHsKLQkvLwkJCWlmIChwcm9wZXJ0eVN0cmVhbSAhPSBudWxsKQotCS8vCQkJCXByb3BlcnR5U3RyZWFtLmNsb3NlKCk7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIHJlc3VsdDsKLQkvLwl9Ci0KLQkvLyBDb2xsZWN0IHRoZSBtYW5pZmVzdCBsb2NhbGl6YXRpb25zIGZyb20gdGhlIGJ1bmRsZSBkaXJlY3RvcnkKLQkvLyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbWFuaWZlc3QuCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRNYW5pZmVzdExvY2FsaXphdGlvbnMoRGljdGlvbmFyeSBtYW5pZmVzdCwgRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQkvLwkJTWFwIGxvY2FsaXphdGlvbnM7Ci0JCS8vCQlMb2NhbGUgZGVmYXVsdExvY2FsZSA9IG51bGw7IC8vID0gTG9jYWxlLkVOR0xJU0g7IC8vIFRPRE86IGdldCB0aGlzIGZyb20gR2VuZXJhdG9ySW5mbwotCQkvLwkJU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTik7Ci0JCS8vCQlpZiAoYnVuZGxlTG9jYWxpemF0aW9uID09IG51bGwgfHwgYnVuZGxlTG9jYWxpemF0aW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkvLwkJCWJ1bmRsZUxvY2FsaXphdGlvbiA9IERFRkFVTFRfQlVORExFX0xPQ0FMSVpBVElPTjsKLQkJLy8KLQkJLy8JCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKG5ldyBQYXRoKGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiAvLyROT04tTkxTLTEkCi0JCS8vCQkJCWJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7Ci0JCS8vCQkJbG9jYWxpemF0aW9ucyA9IGdldEphck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24sIG1hbmlmZXN0LCBkZWZhdWx0TG9jYWxlKTsKLQkJLy8JCX0gZWxzZSB7Ci0JCS8vCQkJbG9jYWxpemF0aW9ucyA9IGdldERpck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24sIG1hbmlmZXN0LCBkZWZhdWx0TG9jYWxlKTsKLQkJLy8JCX0KLQkJLy8KLQkJLy8JCWlmIChsb2NhbGl6YXRpb25zLnNpemUoKSA+IDApIHsKLQkJLy8JCQltYW5pZmVzdC5wdXQoTUFOSUZFU1RfTE9DQUxJWkFUSU9OUywgbG9jYWxpemF0aW9ucyk7Ci0JCS8vCQl9Ci0JfQotCi0JLy8JcHJpdmF0ZSBNYXAgZ2V0SmFyTWFuaWZlc3RMb2NhbGl6YXRpb24oRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiwgRGljdGlvbmFyeSBtYW5pZmVzdCwgTG9jYWxlIGRlZmF1bHRMb2NhbGUpIHsKLQkvLwkJWmlwRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkvLwkJTWFwIGxvY2FsaXphdGlvbnMgPSBuZXcgSGFzaE1hcCg0KTsKLQkvLwkJdHJ5IHsKLQkvLwkJCWphckZpbGUgPSBuZXcgWmlwRmlsZShidW5kbGVMb2NhdGlvbiwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCS8vCQkJZm9yIChFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JLy8JCQkJWmlwRW50cnkgbmV4dEVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JLy8JCQkJU3RyaW5nIG5leHROYW1lID0gbmV4dEVudHJ5LmdldE5hbWUoKTsKLQkvLwkJCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gZ2V0TG9jYWxlU3RyaW5nKG5leHROYW1lLCBidW5kbGVMb2NhbGl6YXRpb24pOwotCS8vCi0JLy8JCQkJaWYgKCFuZXh0RW50cnkuaXNEaXJlY3RvcnkoKSAmJiBsb2NhbGVTdHJpbmcgIT0gbnVsbCkgewotCS8vCQkJCQlMb2NhbGUgbmV4dExvY2FsZSA9IGdldExvY2FsZShsb2NhbGVTdHJpbmcpOwotCS8vCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCS8vCQkJCQl0cnkgewotCS8vCQkJCQkJc3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShuZXh0RW50cnkpOwotCS8vCQkJCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkvLwkJCQkJCXByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotCS8vCQkJCQkJUHJvcGVydGllcyBsb2NhbGl6ZWRTdHJpbmdzID0gZ2V0TG9jYWxpemVkUHJvcGVydGllcyhtYW5pZmVzdCwgcHJvcGVydGllcyk7Ci0JLy8JCQkJCQlpZiAobG9jYWxpemVkU3RyaW5ncy5zaXplKCkgPiAwKSB7Ci0JLy8JCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JLy8JCQkJCQkJaWYgKERFRkFVTFRfTE9DQUxFLmVxdWFscyhuZXh0TG9jYWxlKSAmJiBkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKLQkvLwkJCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JLy8JCQkJCQkJfQotCS8vCQkJCQkJfQotCS8vCQkJCQl9IGZpbmFsbHkgewotCS8vCQkJCQkJaWYgKHN0cmVhbSAhPSBudWxsKQotCS8vCQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCS8vCQkJCQl9Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkvLwkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkvLwkJfSBmaW5hbGx5IHsKLQkvLwkJCWlmIChqYXJGaWxlICE9IG51bGwpIHsKLQkvLwkJCQl0cnkgewotCS8vCQkJCQlqYXJGaWxlLmNsb3NlKCk7Ci0JLy8JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JLy8JCQkJCS8vIGRvIG5vdGhpbmcKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwotCS8vCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIE1hcCBnZXREaXJNYW5pZmVzdExvY2FsaXphdGlvbihGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uLCBEaWN0aW9uYXJ5IG1hbmlmZXN0LCBMb2NhbGUgZGVmYXVsdExvY2FsZSkgewotCS8vCQlGaWxlIGxvY2FsaXphdGlvblBhdGggPSBuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uKTsKLQkvLwkJRmlsZSBsb2NhbGl6YXRpb25EaXIgPSBsb2NhbGl6YXRpb25QYXRoLmdldFBhcmVudEZpbGUoKTsKLQkvLwkJU3RyaW5nIGxvY2FsaXphdGlvbkZpbGUgPSBsb2NhbGl6YXRpb25QYXRoLmdldE5hbWUoKTsKLQkvLwkJU3RyaW5nW10gbG9jYWxpemF0aW9uRmlsZXMgPSBsb2NhbGl6YXRpb25EaXIubGlzdChuZXcgTG9jYWxpemF0aW9uRmlsZUZpbHRlcihsb2NhbGl6YXRpb25GaWxlKSk7Ci0JLy8KLQkvLwkJSGFzaE1hcCBsb2NhbGl6YXRpb25zID0gbnVsbDsKLQkvLwotCS8vCQlpZiAobG9jYWxpemF0aW9uRmlsZXMgIT0gbnVsbCkgewotCS8vCQkJbG9jYWxpemF0aW9ucyA9IG5ldyBIYXNoTWFwKGxvY2FsaXphdGlvbkZpbGVzLmxlbmd0aCk7Ci0JLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsaXphdGlvbkZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQkJU3RyaW5nIG5leHRGaWxlID0gbG9jYWxpemF0aW9uRmlsZXNbaV07Ci0JLy8JCQkJTG9jYWxlIG5leHRMb2NhbGUgPSBnZXRMb2NhbGUoZ2V0TG9jYWxlU3RyaW5nKG5leHRGaWxlLCBsb2NhbGl6YXRpb25GaWxlKSk7Ci0JLy8KLQkvLwkJCQl0cnkgewotCS8vCQkJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhidW5kbGVMb2NhdGlvbiwgbmV4dEZpbGUpOwotCS8vCQkJCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFN0cmluZ3MgPSBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKG1hbmlmZXN0LCBwcm9wZXJ0aWVzKTsKLQkvLwkJCQkJaWYgKGxvY2FsaXplZFN0cmluZ3Muc2l6ZSgpID4gMCkgewotCS8vCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JLy8JCQkJCQlpZiAoREVGQVVMVF9MT0NBTEUuZXF1YWxzKG5leHRMb2NhbGUpICYmIGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgewotCS8vCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCS8vCQkJCQkJfQotCS8vCQkJCQl9Ci0JLy8JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JLy8JCQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwotCS8vCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQkvLwl9Ci0KLQkvLwlwcml2YXRlIGNsYXNzIExvY2FsaXphdGlvbkZpbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0JLy8KLQkvLwkJU3RyaW5nIGZpbGVuYW1lUHJlZml4OwotCS8vCi0JLy8JCXB1YmxpYyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyKFN0cmluZyBmaWxlbmFtZVByZWZpeCkgewotCS8vCQkJdGhpcy5maWxlbmFtZVByZWZpeCA9IGZpbGVuYW1lUHJlZml4OwotCS8vCQl9Ci0JLy8KLQkvLwkJLyogKG5vbi1KYXZhZG9jKQotCS8vCQkgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkvLwkJICovCi0JLy8JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8JCQlyZXR1cm4gKGdldExvY2FsZVN0cmluZyhmaWxlbmFtZSwgZmlsZW5hbWVQcmVmaXgpICE9IG51bGwgPyB0cnVlIDogZmFsc2UpOwotCS8vCQl9Ci0JLy8JfQotCi0JLy8Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlU3RyaW5nKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGZpbGVuYW1lUHJlZml4KSB7Ci0JLy8JCVN0cmluZyBsb2NhbGVTdHJpbmcgPSBudWxsOwotCS8vCQlpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aChmaWxlbmFtZVByZWZpeCkgJiYgZmlsZW5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTikpIHsKLQkvLwkJCWlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IGZpbGVuYW1lUHJlZml4Lmxlbmd0aCgpICsgUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTi5sZW5ndGgoKSkgewotCS8vCQkJCWxvY2FsZVN0cmluZyA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZVByZWZpeC5sZW5ndGgoKSArIDEsIGZpbGVuYW1lLmxlbmd0aCgpIC0gUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTi5sZW5ndGgoKSk7Ci0JLy8JCQl9IGVsc2UgewotCS8vCQkJCWxvY2FsZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8JCQl9Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIGxvY2FsZVN0cmluZzsKLQkvLwl9Ci0KLQkvLwlzdGF0aWMgcHJpdmF0ZSBMb2NhbGUgZ2V0TG9jYWxlKFN0cmluZyBsb2NhbGVTdHJpbmcpIHsKLQkvLwkJTG9jYWxlIGxvY2FsZSA9IERFRkFVTFRfTE9DQUxFOwotCS8vCQlpZiAobG9jYWxlU3RyaW5nLmxlbmd0aCgpID09IDUgJiYgbG9jYWxlU3RyaW5nLmluZGV4T2YoJ18nKSA9PSAyKSB7Ci0JLy8JCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMCwgMiksIGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMywgNSkpOwotCS8vCQl9IGVsc2UgaWYgKGxvY2FsZVN0cmluZy5sZW5ndGgoKSA9PSAyKSB7Ci0JLy8JCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVN0cmluZy5zdWJzdHJpbmcoMCwgMikpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBsb2NhbGU7Ci0JLy8JfQotCS8vCi0JLy8Jc3RhdGljIHByaXZhdGUgUHJvcGVydGllcyBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKERpY3Rpb25hcnkgbWFuaWZlc3QsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCS8vCQkvLyBXYWxrIG92ZXIgdGhlIG1hbmlmZXN0IGFuZCBmaW5kIGFsbCAleHh4IHdpdGggdGhlIHN0cmluZyB2YWx1ZQotCS8vCQkvLyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIGFuZCBjb3B5IHRoZW0gdG8gdGhlIGxvY2FsaXplZCBwcm9wZXJ0aWVzLgotCS8vCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCS8vCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBtYW5pZmVzdC5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JLy8JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCS8vCQkJT2JqZWN0IHZhbHVlID0gbWFuaWZlc3QuZ2V0KGtleSk7Ci0JLy8JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkvLwkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkvLwkJCQlpZiAoc3RyaW5nVmFsdWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkvLwkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShzdHJpbmdWYWx1ZS5zdWJzdHJpbmcoMSkpOwotCS8vCQkJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKLQkvLwkJCQkJCWxvY2FsaXplZFByb3BlcnRpZXMucHV0KGtleSwgbmV3VmFsdWUpOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCQlyZXR1cm4gbG9jYWxpemVkUHJvcGVydGllczsKLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0NvbXBvdW5kUXVlcnlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9Db21wb3VuZFF1ZXJ5YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzkzYWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0NvbXBvdW5kUXVlcnlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS4qOwotCi1wdWJsaWMgY2xhc3MgQ29tcG91bmRRdWVyeWFibGUgaW1wbGVtZW50cyBJUXVlcnlhYmxlIHsKLQotCUlRdWVyeWFibGVbXSBjaGlsZHJlbjsKLQotCXB1YmxpYyBDb21wb3VuZFF1ZXJ5YWJsZShJUXVlcnlhYmxlW10gY2hpbGRyZW4pIHsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBjaGlsZHJlbi5sZW5ndGggKiAxMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQljaGlsZHJlbltpXS5xdWVyeShxdWVyeSwgY29sbGVjdG9yLCBzdWIubmV3Q2hpbGQoMSkpOwotCQlzdWIuZG9uZSgpOwotCQlyZXR1cm4gY29sbGVjdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0ZpbGVTZXREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9GaWxlU2V0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkyMWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0ZpbGVTZXREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEZpbGVTZXREZXNjcmlwdG9yIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBrZXk7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBGaWxlU2V0RGVzY3JpcHRvcihTdHJpbmcga2V5LCBTdHJpbmcgY29uZmlnU3BlYykgewotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlcyhTdHJpbmcgcHJvcGVydHkpIHsKLQkJZmlsZXMgPSBwcm9wZXJ0eTsKLQl9Ci0KLQkvLyBhIHBlcm1pc3Npb24gc3BlYyBpcyB7IDxwZXJtPiwgZmlsZSBwYXR0ZXJucyB9Ci0JcHVibGljIHZvaWQgYWRkUGVybWlzc2lvbnMoU3RyaW5nW10gcHJvcGVydHkpIHsKLQkJcGVybWlzc2lvbnMuYWRkKHByb3BlcnR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5rcyhTdHJpbmcgcHJvcGVydHkpIHsKLQkJbGlua3MgPSBwcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1NwZWMoKSB7Ci0JCXJldHVybiBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua3MoKSB7Ci0JCXJldHVybiBsaW5rczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRQZXJtaXNzaW9ucygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXVtdKSBwZXJtaXNzaW9ucy50b0FycmF5KG5ldyBTdHJpbmdbcGVybWlzc2lvbnMuc2l6ZSgpXVtdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVzKCkgewotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9HZW5lcmF0b3JCdW5kbGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9HZW5lcmF0b3JCdW5kbGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2Y1YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvR2VuZXJhdG9yQnVuZGxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuSGVhZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0b3JCdW5kbGVJbmZvIGV4dGVuZHMgQnVuZGxlSW5mbyB7Ci0JLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVWRUwgPSAtMTsKLQotCS8vCXByaXZhdGUgU3RyaW5nIHN5bWJvbGljTmFtZTsKLQkvLwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCS8vCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCS8vCXByaXZhdGUgaW50IGV4cGVjdGVkU3RhdGU7Ci0JLy8JcHJpdmF0ZSBpbnQgc3RhcnRMZXZlbCA9IE5PX0xFVkVMOwotCS8vCXByaXZhdGUgU3RyaW5nIG1hbmlmZXN0OwotCi0JcHJpdmF0ZSBTdHJpbmcgc3BlY2lhbENvbmZpZ0NvbW1hbmRzOwotCXByaXZhdGUgU3RyaW5nIHNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzOwotCi0JcHVibGljIEdlbmVyYXRvckJ1bmRsZUluZm8oQnVuZGxlSW5mbyBiSW5mbykgewotCQlzdXBlci5zZXRCdW5kbGVJZChiSW5mby5nZXRCdW5kbGVJZCgpKTsKLQkJc3VwZXIuc2V0TG9jYXRpb24oYkluZm8uZ2V0TG9jYXRpb24oKSk7Ci0JCXN1cGVyLnNldE1hbmlmZXN0KGJJbmZvLmdldE1hbmlmZXN0KCkpOwotCQlzdXBlci5zZXRNYXJrZWRBc1N0YXJ0ZWQoYkluZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKSk7Ci0JCXN1cGVyLnNldFJlc29sdmVkKGJJbmZvLmlzUmVzb2x2ZWQoKSk7Ci0JCXN1cGVyLnNldFN0YXJ0TGV2ZWwoYkluZm8uZ2V0U3RhcnRMZXZlbCgpKTsKLQkJc3VwZXIuc2V0U3ltYm9saWNOYW1lKGJJbmZvLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJc3VwZXIuc2V0VmVyc2lvbihiSW5mby5nZXRWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyBHZW5lcmF0b3JCdW5kbGVJbmZvKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvLwkvKiAobm9uLUphdmFkb2MpCi0JLy8JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkvLwkgKi8KLQkvLwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCS8vCQlpbnQgcmVzdWx0ID0gc3ltYm9saWNOYW1lID09IG51bGwgPyAwIDogc3ltYm9saWNOYW1lLmhhc2hDb2RlKCk7Ci0JLy8JCXJlc3VsdCA9IHJlc3VsdCArICh2ZXJzaW9uID09IG51bGwgPyAwIDogdmVyc2lvbi5oYXNoQ29kZSgpKTsKLQkvLwkJcmVzdWx0ID0gcmVzdWx0ICsgKGxvY2F0aW9uID09IG51bGwgPyAwIDogbG9jYXRpb24uaGFzaENvZGUoKSk7Ci0JLy8JCXJldHVybiByZXN1bHQ7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JLy8JCXJldHVybiBzeW1ib2xpY05hbWU7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCS8vCQlyZXR1cm4gdmVyc2lvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgaW50IGV4cGVjdGVkU3RhdGUoKSB7Ci0JLy8JCXJldHVybiBleHBlY3RlZFN0YXRlOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBpbnQgZ2V0U3RhcnRMZXZlbCgpIHsKLQkvLwkJcmV0dXJuIHN0YXJ0TGV2ZWw7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkvLwkJcmV0dXJuIGxvY2F0aW9uOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHNldFN5bWJvbGljTmFtZShTdHJpbmcgaWQpIHsKLQkvLwkJc3ltYm9saWNOYW1lID0gaWQ7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCS8vCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkU3RhdGUoaW50IHN0YXRlKSB7Ci0JLy8JCWV4cGVjdGVkU3RhdGUgPSBzdGF0ZTsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRTdGFydExldmVsKGludCBsZXZlbCkgewotCS8vCQl0aGlzLnN0YXJ0TGV2ZWwgPSBsZXZlbDsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkvLwkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KFN0cmluZyBtYW5pZmVzdCkgewotCS8vCQl0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7Ci0JLy8JfQotCS8vCQotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3QoKSB7Ci0JLy8JCXJldHVybiBtYW5pZmVzdDsKLQkvLwl9Ci0JLy8JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoKSB7Ci0JCXJldHVybiBzcGVjaWFsQ29uZmlnQ29tbWFuZHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKFN0cmluZyBzcGVjaWFsQ29uZmlnQ29tbWFuZHMpIHsKLQkJdGhpcy5zcGVjaWFsQ29uZmlnQ29tbWFuZHMgPSBzcGVjaWFsQ29uZmlnQ29tbWFuZHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWFsVW5jb25maWdDb21tYW5kcygpIHsKLQkJcmV0dXJuIHNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKFN0cmluZyBzcGVjaWFsVW5jb25maWdDb21tYW5kcykgewotCQl0aGlzLnNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzID0gc3BlY2lhbFVuY29uZmlnQ29tbWFuZHM7Ci0JfQotCi0JLy8JLyogKG5vbi1KYXZhZG9jKQotCS8vCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLwkgKi8KLQkvLwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRvQ29tcGFyZSkgewotCS8vCQlpZiAodG9Db21wYXJlIGluc3RhbmNlb2YgR2VuZXJhdG9yQnVuZGxlSW5mbykgewotCS8vCQkJR2VuZXJhdG9yQnVuZGxlSW5mbyBpbmZvID0gKEdlbmVyYXRvckJ1bmRsZUluZm8pIHRvQ29tcGFyZTsKLQkvLwkJCWlmIChpbmZvLnN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSAmJiBpbmZvLnZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIChpbmZvLmxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCA/IHRydWUgOiBpbmZvLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpKQotCS8vCQkJCXJldHVybiB0cnVlOwotCS8vCQl9Ci0JLy8JCXJldHVybiBmYWxzZTsKLQkvLwl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgc3VwZXJTdCA9IHN1cGVyLnRvU3RyaW5nKCk7Ci0JCWlmIChzdXBlclN0Lmxlbmd0aCgpID4gMCkKLQkJCWJ1ZmZlci5hcHBlbmQoc3VwZXJTdC5zdWJzdHJpbmcoMCwgc3VwZXJTdC5sZW5ndGgoKSAtIDEpKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCB0aGlzLnNwZWNpYWxDb25maWdDb21tYW5kcz0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMuc3BlY2lhbENvbmZpZ0NvbW1hbmRzKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdEZyb21NYW5pZmVzdChTdHJpbmcgbWFuaWZlc3QpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLnNldE1hbmlmZXN0KG1hbmlmZXN0KTsKLQkJCUhlYWRlcnMgaGVhZGVycyA9IEhlYWRlcnMucGFyc2VNYW5pZmVzdChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWFuaWZlc3QuZ2V0Qnl0ZXMoKSkpOwotCQkJTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudCA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigiYnNuIiwgKFN0cmluZykgaGVhZGVycy5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIuc2V0U3ltYm9saWNOYW1lKGVsZW1lbnRbMF0uZ2V0VmFsdWUoKSk7Ci0JCQlzdXBlci5zZXRWZXJzaW9uKChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVByb2R1Y3REZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHJvZHVjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkMWMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHJvZHVjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJUHJvZHVjdERlc2NyaXB0b3IgewotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGJ1bmRsZXMgaW4gdGhpcyBwcm9kdWN0LgotCSAqIEBwYXJhbSBpbmNsdWRlRnJhZ21lbnRzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIGZyYWdtZW50cyBpbiB0aGUgcmV0dXJuIHZhbHVlCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBidW5kbGVzIGluIHRoaXMgcHJvZHVjdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJ1bmRsZXMoYm9vbGVhbiBpbmNsdWRlRnJhZ21lbnRzKTsKLQotCXB1YmxpYyBMaXN0IGdldEZyYWdtZW50cygpOwotCi0JcHVibGljIExpc3QgZ2V0RmVhdHVyZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnSW5pUGF0aChTdHJpbmcgb3MpOwotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRTcGxhc2hMb2NhdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpOwotCi0JcHVibGljIGJvb2xlYW4gdXNlRmVhdHVyZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRWTUFyZ3VtZW50cyhTdHJpbmcgb3MpOwotCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzKFN0cmluZyBvcyk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGVySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlMjk4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoZXJJbmZvIHsKLQotCS8qKgotCSAqIEEgYml0d2lzZSBmbGFnIHRvIHNheSB3aGV0aGVyIG9yIG5vdCB0aGUgaW5kZXggZm9yIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IHNob3VsZAotCSAqIGJlIHVwZGF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQV9JTkRFWCA9IDE7Ci0KLQkvKioKLQkgKiBBIGJpdHdpc2UgZmxhZyB0byBzYXkgd2hldGhlciBvciB0aGUgYXJ0aWZhY3RzIHRoZW1zZWx2ZXMgc2hvdWxkIGJlIHB1Ymxpc2hlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBX1BVQkxJU0ggPSAyOwotCi0JLyoqCi0JICogQSBiaXR3aXNlIGZsYWcgdG8gc2F5IHdoZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSBkaXNrIGNvbnRlbnQgZGlzY292ZXJlZAotCSAqIGluIHRoZSByZXBvc2l0b3J5IHdoZW4gcHVibGlzaGluZyBhbiBhcnRpZmFjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfT1ZFUldSSVRFID0gNDsKLQotCS8qKgotCSAqIEEgYml0d2lzZSBmbGFnIHRvIHNheSB3aGV0aGVyIG9yIG5vdCB0byBsZWF2ZSB0aGUgZGlzayBjb250ZW50IGRpc2NvdmVyZWQKLQkgKiBhcyBpcyB3aGVuIHB1Ymxpc2hpbmcgYW4gYXJ0aWZhY3QuICBUaGF0IGlzLCBpZiBhIGRpcmVjdG9yeSBpcyBkaXNjb3ZlcmVkLCBpdCBpcwotCSAqIGxlZnQgYXMgYSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQV9BU19JUyA9IDg7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IGludG8gd2hpY2ggYW55IHB1Ymxpc2hhYmxlIGFydGlmYWN0cyBhcmUgcHVibGlzaGVkCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGEgZGVzdGluYXRpb24gYXJ0aWZhY3QgcmVwb3NpdG9yeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBpbnRvIHdoaWNoIGFueSBwdWJsaXNoYWJsZSBtZXRhZGF0YSBpcyBwdWJsaXNoZWQKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIEByZXR1cm4gYSBkZXN0aW5hdGlvbiBtZXRhZGF0YSByZXBvc2l0b3J5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFydGlmYWN0cyB0aGVtc2VsdmVzIHNob3VsZCBiZSBwdWJsaXNoZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhcnRpZmFjdHMgc2hvdWxkIGJlIHB1Ymxpc2hlZC4gIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGludCBnZXRBcnRpZmFjdE9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgYWR2aWNlIGZvciB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBvZiBXUywgT1MgYW5kIEFSQ0ggd2hlcmUgdGhlCi0JICogYWR2aWNlIGlzIG9mIHRoZSBnaXZlbiB0eXBlLiAgSWYgbWVyZ2VEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIGFkdmljZSBmb3IKLQkgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIG1lcmdlZCBpbnRvIHRoZSByZXN1bHQuCi0JICogQHBhcmFtIGNvbmZpZ1NwZWMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gcXVlcnkuICBOb3RlIHRoYXQgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiBtdXN0IHNwZWNpZnkgdmFsdWVzIGZvciBXUywgT1MgYW5kIEFSQ0guCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgYWR2aWNlIHRvIGxvb2sgZm9yCi0JICogQHBhcmFtIG1lcmdlRGVmYXVsdCB3aGV0aGVyIG9yIG5vdCB0byBtZXJnZSBpbiB0aGUgYWR2aWNlIGNvbW1vbiB0byBhbGwgY29uZmlndXJhdGlvbnMKLQkgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYWR2aWNlIG9mIHRoZSBnaXZlbiB0eXBlIGZvciB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkdmljZShTdHJpbmcgY29uZmlnU3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24sIENsYXNzIHR5cGUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBhZHZpY2UgdG8gdGhlIHNldCBvZiBwdWJsaXNoaW5nIGFkdmljZXMuICAKLQkgKiBAcGFyYW0gYWR2aWNlIHRoZSBhZHZpY2UgdG8gcmV0YWluCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWR2aWNlKElQdWJsaXNoaW5nQWR2aWNlIGFkdmljZSk7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoZXJSZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoZXJSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNTc1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGVyUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoZXJSZXN1bHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FUkdFX01BVENISU5HID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVJHRV9BTExfUk9PVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfQUxMX05PTl9ST09UID0gMjsKLQotCS8vIHR5cGUgbWFya2VycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fUk9PVCA9ICJub25fcm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGFkZElVKElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyB0eXBlKTsKLQotCXB1YmxpYyB2b2lkIGFkZElVcyhDb2xsZWN0aW9uIGl1cywgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVVzIGluIHRoaXMgcmVzdWx0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldElVcyhTdHJpbmcgaWQsIFN0cmluZyB0eXBlKTsKLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldElVKFN0cmluZyBpZCwgU3RyaW5nIHR5cGUpOwotCi0JcHVibGljIHZvaWQgbWVyZ2UoSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQsIGludCBtb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWMxYWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoaW5nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVB1Ymxpc2hpbmdBY3Rpb24gewotCi0JSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoaW5nQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVhOWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoaW5nQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVB1Ymxpc2hpbmdBZHZpY2UgewotCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFN0cmluZyBjb25maWdTcGVjLCBib29sZWFuIGluY2x1ZGVEZWZhdWx0LCBTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0luc3RhbGxQdWJsaXNoZXJBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSW5zdGFsbFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjNiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSW5zdGFsbFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zLkVjbGlwc2VJbnN0YWxsQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFB1Ymxpc2hlckFwcGxpY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoZXJBcHBsaWNhdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBmbGF2b3I7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHRvcExldmVsOwotCXByb3RlY3RlZCBib29sZWFuIHN0YXJ0OwotCXByb3RlY3RlZCBTdHJpbmdbXSByb290RXhjbHVzaW9uczsKLQotCXB1YmxpYyBJbnN0YWxsUHVibGlzaGVyQXBwbGljYXRpb24oKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZsYWcoU3RyaW5nIGFyZywgUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCXN1cGVyLnByb2Nlc3NGbGFnKGFyZywgaW5mbyk7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItc3RhcnRBbGwiKSkgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXJhbWV0ZXIoU3RyaW5nIGFyZywgU3RyaW5nIHBhcmFtZXRlciwgUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCXN1cGVyLnByb2Nlc3NQYXJhbWV0ZXIoYXJnLCBwYXJhbWV0ZXIsIGluZm8pOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCWlkID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXZlcnNpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJdmVyc2lvbiA9IHBhcmFtZXRlcjsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1uYW1lIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItZmxhdm9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCWZsYXZvciA9IHBhcmFtZXRlcjsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi10b3AiKSkgLy8kTk9OLU5MUy0xJAotCQkJdG9wTGV2ZWwgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uZ2V0QXJyYXlGcm9tU3RyaW5nKHBhcmFtZXRlciwgIiwiKTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1yb290RXhjbHVzaW9ucyIpKSAvLyROT04tTkxTLTEkCi0JCQlyb290RXhjbHVzaW9ucyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5nZXRBcnJheUZyb21TdHJpbmcocGFyYW1ldGVyLCAiLCIpOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbltdIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlRWNsaXBzZUluc3RhbGxBY3Rpb24oKSk7Ci0JCXJldHVybiAoSVB1Ymxpc2hpbmdBY3Rpb25bXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQdWJsaXNoaW5nQWN0aW9uW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUVjbGlwc2VJbnN0YWxsQWN0aW9uKCkgewotCQlTdHJpbmdbXSBleGNsdXNpb25zID0gZ2V0QmFzZUV4Y2x1c2lvbnMoKTsKLQkJaWYgKHJvb3RFeGNsdXNpb25zICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbZXhjbHVzaW9ucy5sZW5ndGggKyByb290RXhjbHVzaW9ucy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShleGNsdXNpb25zLCAwLCByZXN1bHQsIDAsIGV4Y2x1c2lvbnMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocm9vdEV4Y2x1c2lvbnMsIDAsIHJlc3VsdCwgZXhjbHVzaW9ucy5sZW5ndGgsIHJvb3RFeGNsdXNpb25zLmxlbmd0aCk7Ci0JCQlleGNsdXNpb25zID0gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUluc3RhbGxBY3Rpb24oc291cmNlLCBpZCwgdmVyc2lvbiwgbmFtZSwgZmxhdm9yLCB0b3BMZXZlbCwgZXhjbHVzaW9ucywgc3RhcnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRCYXNlRXhjbHVzaW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7InBsdWdpbnMiLCAiZmVhdHVyZXMiLCAiY29uZmlndXJhdGlvbiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThkMjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Vycm9yQ29udmVydGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fb3V0cHV0U3RyZWFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9lcnJvclBhcnNpbmdVcGRhdGVTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9zdGF0ZUFkZGl0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9zb3VyY2VEaXJlY3RvcnlJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Mb2NhdGlvblVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fYXJ0aWZhY3RSZXBvTm90V3JpdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX21ldGFkYXRhUmVwb0xvY2F0aW9uVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Ob3RXcml0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fYmFzZUxvY2F0aW9uTm90U3BlY2lmaWVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZV9nZW5lcmF0aW5nTWV0YWRhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZV9nZW5lcmF0aW9uQ29tcGxldGVkOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9NZXRhZGF0YUdlbmVyYXRvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzYzczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9NZXRhZGF0YUdlbmVyYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQyAtIGFkZGVkIGxpY2Vuc2Ugc3VwcG9ydAotICogICAgIENvZGUgOSAtIE9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5JbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkVudmlyb25tZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIgewotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIEVjbGlwc2UgcmVzb3VyY2UgKGJ1bmRsZSwgZmVhdHVyZSwgc291cmNlIGJ1bmRsZSwgZXRjKQotCSAqIEBzZWUgUmVxdWlyZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICogQHNlZSBQcm92aWRlZENhcGFiaWxpdHkjZ2V0TmFtZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWUgaW4gdGhlIHtAbGluayAjTkFNRVNQQUNFX0VDTElQU0VfVFlQRX0gbmFtZXNwYWNlIAotCSAqIHJlcHJlc2VudGluZyBhbmQgT1NHaSBidW5kbGUgcmVzb3VyY2UKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKiBAc2VlIFByb3ZpZGVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VDTElQU0VfQlVORExFID0gImJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIGNhcGFiaWxpdHkgbmFtZSBpbiB0aGUge0BsaW5rICNOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFfSBuYW1lc3BhY2UgCi0JICogcmVwcmVzZW50aW5nIGEgZmVhdHVyZQotCSAqIEBzZWUgUmVxdWlyZWRDYXBhYmlsaXR5I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRUNMSVBTRV9GRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNhcGFiaWxpdHkgbmFtZSBpbiB0aGUge0BsaW5rICNOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFfSBuYW1lc3BhY2UgCi0JICogcmVwcmVzZW50aW5nIGEgc291cmNlIGJ1bmRsZQotCSAqIEBzZWUgUmVxdWlyZWRDYXBhYmlsaXR5I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRUNMSVBTRV9TT1VSQ0UgPSAic291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWVzcGFjZSByZXByZXNlbnRpbmcgdGhlIGxvY2FsaXphdGlvbiAodHJhbnNsYXRpb24pCi0JICogb2Ygc3RyaW5ncyBmcm9tIGEgc3BlY2lmaWVkIElVIGluIGEgc3BlY2lmaWVkIGxvY2FsZQotCSAqIEBzZWUgUmVxdWlyZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICogQHNlZSBQcm92aWRlZENhcGFiaWxpdHkjZ2V0TmFtZXNwYWNlKCkKLQkgKiBUT0RPOiB0aGlzIHNob3VsZCBiZSBpbiBBUEksIHByb2JhYmx5IGluIElJbnN0YWxsYWJsZVVuaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfSVVfTE9DQUxJWkFUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gT25seSBjZXJ0YWluIHByb3BlcnRpZXMgaW4gdGhlIGJ1bmRsZSBtYW5pZmVzdCBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbGl6ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVMgPSB7Q29uc3RhbnRzLkJVTkRMRV9OQU1FLCBDb25zdGFudHMuQlVORExFX0RFU0NSSVBUSU9OLCBDb25zdGFudHMuQlVORExFX1ZFTkRPUiwgQ29uc3RhbnRzLkJVTkRMRV9DT05UQUNUQUREUkVTUywgQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsIENvbnN0YW50cy5CVU5ETEVfVVBEQVRFTE9DQVRJT059OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9MT0NBTElaQVRJT05fSU5ERVggPSBCVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVMubGVuZ3RoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlVORExFX0lVX1BST1BFUlRZX01BUCA9IHtDb25zdGFudHMuQlVORExFX05BTUUsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBDb25zdGFudHMuQlVORExFX0RFU0NSSVBUSU9OLCBJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04sIENvbnN0YW50cy5CVU5ETEVfVkVORE9SLCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPVklERVIsIENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9DT05UQUNULCBDb25zdGFudHMuQlVORExFX0RPQ1VSTCwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RPQ19VUkx9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfSkFWQV9QQUNLQUdFID0gImphdmEucGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSA9ICJvc2dpLmJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9OU19PU0dJX0ZSQUdNRU5UID0gIm9zZ2kuZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX05TX1VQREFURV9GRUFUVVJFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5mZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiBERUZBVUxUX0pSRV9WRVJTSU9OID0gbmV3IFZlcnNpb24oIjEuNiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0ZFQVRVUkVfQ0xBU1NJRklFUiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU0dJX0JVTkRMRV9DTEFTU0lGSUVSID0gIm9zZ2kuYnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9BUlRJRkFDVF9DTEFTU0lGSUVSID0gImJpbmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExfRkVBVFVSRVNfRklMVEVSID0gIihvcmcuZWNsaXBzZS51cGRhdGUuaW5zdGFsbC5mZWF0dXJlcz10cnVlKSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVX05BTUVTUEFDRSA9IElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX0lEX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VfSU5TVEFMTF9IQU5ETEVSX1BST1AgPSAib3JnLmVjbGlwc2UudXBkYXRlLmluc3RhbGxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UT0RPIC0gbmVlZCB0byBjb21lIHVwIHdpdGggYSB3YXkgdG8gaW5mZXIgbGF1bmNoZXIgdmVyc2lvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gTEFVTkNIRVJfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2ZXJzaW9uTWF4ID0gbmV3IFZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIFRPVUNIUE9JTlRfTkFUSVZFID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hdGl2ZSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG91Y2hwb2ludFR5cGUgVE9VQ0hQT0lOVF9PU0dJID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2kiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5IEJVTkRMRV9DQVBBQklMSVRZID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfQlVORExFLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm92aWRlZENhcGFiaWxpdHkgRkVBVFVSRV9DQVBBQklMSVRZID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfRkVBVFVSRSwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5IFNPVVJDRV9CVU5ETEVfQ0FQQUJJTElUWSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX1NPVVJDRSwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JVTkRMRV9MT0NBTElaQVRJT04gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04gPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9MT0NBTElaQVRJT05TID0gImVjbGlwc2UucDIubWFuaWZlc3QubG9jYWxpemF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBMb2NhbGUgREVGQVVMVF9MT0NBTEUgPSBuZXcgTG9jYWxlKCJkZiIsICJMVCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBmaW5hbCBMb2NhbGUgUFNFVURPX0xPQ0FMRSA9IG5ldyBMb2NhbGUoInp6IiwgIlpaIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdERlc2NyaXB0b3IgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKElBcnRpZmFjdEtleSBrZXksIEZpbGUgcGF0aE9uRGlzaykgewotCQkvL1RPRE8gdGhpcyBzaXplIGNhbGN1bGF0aW9uIGlzIGJvZ3VzCi0JCUFydGlmYWN0RGVzY3JpcHRvciByZXN1bHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChwYXRoT25EaXNrICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUsIExvbmcudG9TdHJpbmcocGF0aE9uRGlzay5sZW5ndGgoKSkpOwotCQkJLy8gVE9ETyAtIHRoaXMgaXMgd3JvbmcgYnV0IEknbSB0ZXN0aW5nIGEgd29yay1hcm91bmQgZm9yIGJ1ZyAyMDU4NDIKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUsIExvbmcudG9TdHJpbmcocGF0aE9uRGlzay5sZW5ndGgoKSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3REZXNjcmlwdG9yIGNyZWF0ZVBhY2syMDBBcnRpZmFjdERlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSwgRmlsZSBwYXRoT25EaXNrLCBTdHJpbmcgaW5zdGFsbFNpemUpIHsKLQkJZmluYWwgU3RyaW5nIFBBQ0tFRF9GT1JNQVQgPSAicGFja2VkIjsgLy8kTk9OLU5MUy0xJAotCQkvL1RPRE8gdGhpcyBzaXplIGNhbGN1bGF0aW9uIGlzIGJvZ3VzCi0JCUFydGlmYWN0RGVzY3JpcHRvciByZXN1bHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChwYXRoT25EaXNrICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUsIGluc3RhbGxTaXplKTsKLQkJCS8vIFRPRE8gLSB0aGlzIGlzIHdyb25nIGJ1dCBJJ20gdGVzdGluZyBhIHdvcmstYXJvdW5kIGZvciBidWcgMjA1ODQyCi0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFLCBMb25nLnRvU3RyaW5nKHBhdGhPbkRpc2subGVuZ3RoKCkpKTsKLQkJfQotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0UHJvY2Vzc2luZ1N0ZXBzKHN0ZXBzKTsKLQkJcmVzdWx0LnNldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRk9STUFULCBQQUNLRURfRk9STUFUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdEtleSBjcmVhdGVCdW5kbGVBcnRpZmFjdEtleShTdHJpbmcgYnNuLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0S2V5KE9TR0lfQlVORExFX0NMQVNTSUZJRVIsIGJzbiwgbmV3IFZlcnNpb24odmVyc2lvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBmbGF2b3IsIFN0cmluZyBjb25maWdTcGVjLCBNYXAgdG91Y2hwb2ludERhdGEpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyByZXN1bHRJZCA9IGZsYXZvciArIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5jcmVhdGVJZFN0cmluZyhjb25maWdTcGVjKSArIGlkOwotCQljdS5zZXRJZChyZXN1bHRJZCk7Ci0JCVZlcnNpb24gcmVzdWx0VmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb24pOwotCQljdS5zZXRWZXJzaW9uKHJlc3VsdFZlcnNpb24pOwotCi0JCWN1LnNldEZpbHRlcihBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uY3JlYXRlRmlsdGVyU3BlYyhjb25maWdTcGVjKSk7Ci0JCWN1LnNldEhvc3QobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBpZCwgbmV3IFZlcnNpb25SYW5nZShyZXN1bHRWZXJzaW9uLCB0cnVlLCByZXN1bHRWZXJzaW9uLCB0cnVlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0pOwotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShyZXN1bHRJZCwgcmVzdWx0VmVyc2lvbil9KTsKLQotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCdW5kbGVDb25maWd1cmF0aW9uVW5pdChTdHJpbmcgaG9zdElkLCBWZXJzaW9uIGhvc3RWZXJzaW9uLCBib29sZWFuIGlzQnVuZGxlRnJhZ21lbnQsIEdlbmVyYXRvckJ1bmRsZUluZm8gY29uZmlnSW5mbywgU3RyaW5nIGNvbmZpZ3VyYXRpb25GbGF2b3IsIFN0cmluZyBmaWx0ZXIpIHsKLQkJaWYgKGNvbmZpZ0luZm8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnVW5pdElkID0gY29uZmlndXJhdGlvbkZsYXZvciArIGhvc3RJZDsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJY3Uuc2V0VmVyc2lvbihob3N0VmVyc2lvbik7Ci0KLQkJLy9JbmRpY2F0ZSB0aGUgSVUgdG8gd2hpY2ggdGhpcyBDVSBhcHBseQotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7IC8vCi0JCQkJTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX09TR0lfQlVORExFLCBob3N0SWQsIG5ldyBWZXJzaW9uUmFuZ2UoaG9zdFZlcnNpb24sIHRydWUsIHZlcnNpb25NYXgsIHRydWUpLCBudWxsLCBmYWxzZSwgZmFsc2UpLCAvLyAKLQkJCQkJCU1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0JVTkRMRSwgbmV3IFZlcnNpb25SYW5nZShuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0pOwotCi0JCS8vQWRkcyBjYXBhYmlsaXRpZXMgZm9yIGZyYWdtZW50LCBzZWxmLCBhbmQgZGVzY3JpYmluZyB0aGUgZmxhdm9yIHN1cHBvcnRlZAotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIGhvc3RWZXJzaW9uKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9GTEFWT1IsIGNvbmZpZ3VyYXRpb25GbGF2b3IsIG5ldyBWZXJzaW9uKDEsIDAsIDApKX0pOwotCi0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsICJpbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgInVuaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoImNvbmZpZ3VyZSIsIGNyZWF0ZUNvbmZpZ1NjcmlwdChjb25maWdJbmZvLCBpc0J1bmRsZUZyYWdtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmNvbmZpZ3VyZSIsIGNyZWF0ZVVuY29uZmlnU2NyaXB0KGNvbmZpZ0luZm8sIGlzQnVuZGxlRnJhZ21lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJY3Uuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQnVuZGxlSVUoQnVuZGxlRGVzY3JpcHRpb24gYmQsIE1hcCBtYW5pZmVzdCwgYm9vbGVhbiBpc0ZvbGRlclBsdWdpbiwgSUFydGlmYWN0S2V5IGtleSkgewotCQlNYXAgbWFuaWZlc3RMb2NhbGl6YXRpb25zID0gbnVsbDsKLQkJaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgYmQuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQltYW5pZmVzdExvY2FsaXphdGlvbnMgPSBnZXRNYW5pZmVzdExvY2FsaXphdGlvbnMobWFuaWZlc3QsIG5ldyBGaWxlKGJkLmdldExvY2F0aW9uKCkpKTsKLQkJfQotCi0JCXJldHVybiBjcmVhdGVCdW5kbGVJVShiZCwgbWFuaWZlc3QsIGlzRm9sZGVyUGx1Z2luLCBrZXksIG1hbmlmZXN0TG9jYWxpemF0aW9ucyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUJ1bmRsZUlVKEJ1bmRsZURlc2NyaXB0aW9uIGJkLCBNYXAgbWFuaWZlc3QsIGJvb2xlYW4gaXNGb2xkZXJQbHVnaW4sIElBcnRpZmFjdEtleSBrZXksIE1hcCBtYW5pZmVzdExvY2FsaXphdGlvbnMpIHsKLQkJYm9vbGVhbiBpc0JpbmFyeUJ1bmRsZSA9IHRydWU7Ci0JCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmNvbnRhaW5zS2V5KCJFY2xpcHNlLVNvdXJjZUJ1bmRsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlzQmluYXJ5QnVuZGxlID0gZmFsc2U7Ci0JCX0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbihiZC5pc1NpbmdsZXRvbigpKTsKLQkJaXUuc2V0SWQoYmQuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlpdS5zZXRWZXJzaW9uKGJkLmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldEZpbHRlcihiZC5nZXRQbGF0Zm9ybUZpbHRlcigpKTsKLQotCQlpdS5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKGJkLmdldFN5bWJvbGljTmFtZSgpLCBuZXcgVmVyc2lvblJhbmdlKG5ldyBWZXJzaW9uKDAsIDAsIDApLCB0cnVlLCBiZC5nZXRWZXJzaW9uKCksIGZhbHNlKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0KLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gYmQuZ2V0SG9zdCgpICE9IG51bGw7Ci0JCS8vCQlib29sZWFuIHJlcXVpcmVzQUZyYWdtZW50ID0gaXNGcmFnbWVudCA/IGZhbHNlIDogcmVxdWlyZUFGcmFnbWVudChiZCwgbWFuaWZlc3QpOwotCi0JCS8vUHJvY2VzcyB0aGUgcmVxdWlyZWQgYnVuZGxlcwotCQlCdW5kbGVTcGVjaWZpY2F0aW9uIHJlcXVpcmVkQnVuZGxlc1tdID0gYmQuZ2V0UmVxdWlyZWRCdW5kbGVzKCk7Ci0JCUFycmF5TGlzdCByZXFzRGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8JCWlmIChyZXF1aXJlc0FGcmFnbWVudCkKLQkJLy8JCQlyZXFzRGVwcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX1RZUEVfT1NHSV9GUkFHTUVOVFMsIGJkLmdldFN5bWJvbGljTmFtZSgpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWlmIChpc0ZyYWdtZW50KQotCQkJcmVxc0RlcHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSwgYmQuZ2V0SG9zdCgpLmdldE5hbWUoKSwgYmQuZ2V0SG9zdCgpLmdldFZlcnNpb25SYW5nZSgpLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXF1aXJlZEJ1bmRsZXMubGVuZ3RoOyBqKyspCi0JCQlyZXFzRGVwcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX09TR0lfQlVORExFLCByZXF1aXJlZEJ1bmRsZXNbal0uZ2V0TmFtZSgpLCByZXF1aXJlZEJ1bmRsZXNbal0uZ2V0VmVyc2lvblJhbmdlKCkgPT0gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgPyBudWxsIDogcmVxdWlyZWRCdW5kbGVzW2pdLmdldFZlcnNpb25SYW5nZSgpLCBudWxsLCByZXF1aXJlZEJ1bmRsZXNbal0uaXNPcHRpb25hbCgpLCBmYWxzZSkpOwotCi0JCS8vIFByb2Nlc3MgdGhlIGltcG9ydCBwYWNrYWdlcwotCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbiBvc2dpSW1wb3J0c1tdID0gYmQuZ2V0SW1wb3J0UGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvc2dpSW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJLy8gVE9ETyB3ZSBuZWVkIHRvIHNvcnQgb3V0IGhvdyB3ZSB3YW50IHRvIGhhbmRsZSB3aWxkLWNhcmRlZCBkeW5hbWljIGltcG9ydHMgLSBmb3Igbm93IHdlIGlnbm9yZSB0aGVtCi0JCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbiBpbXBvcnRTcGVjID0gb3NnaUltcG9ydHNbaV07Ci0JCQlTdHJpbmcgaW1wb3J0UGFja2FnZU5hbWUgPSBpbXBvcnRTcGVjLmdldE5hbWUoKTsKLQkJCWlmIChpbXBvcnRQYWNrYWdlTmFtZS5pbmRleE9mKCcqJykgIT0gLTEpCi0JCQkJY29udGludWU7Ci0KLQkJCVZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgPSBpbXBvcnRTcGVjLmdldFZlcnNpb25SYW5nZSgpID09IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlID8gbnVsbCA6IGltcG9ydFNwZWMuZ2V0VmVyc2lvblJhbmdlKCk7Ci0KLQkJCS8vVE9ETyB0aGlzIG5lZWRzIHRvIGJlIHJlZmluZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgYWxsIHRoZSBhdHRyaWJ1dGUgaGFuZGxlZCBieSBpbXBvcnRzCi0JCQlyZXFzRGVwcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX0pBVkFfUEFDS0FHRSwgaW1wb3J0UGFja2FnZU5hbWUsIHZlcnNpb25SYW5nZSwgbnVsbCwgaXNPcHRpb25hbChpbXBvcnRTcGVjKSwgZmFsc2UpKTsKLQkJfQotCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcygoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlcXNEZXBzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXFzRGVwcy5zaXplKCldKSk7Ci0KLQkJLy8gQ3JlYXRlIHNldCBvZiBwcm92aWRlZCBjYXBhYmlsaXRpZXMKLQkJQXJyYXlMaXN0IHByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoY3JlYXRlU2VsZkNhcGFiaWxpdHkoYmQuZ2V0U3ltYm9saWNOYW1lKCksIGJkLmdldFZlcnNpb24oKSkpOwotCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX09TR0lfQlVORExFLCBiZC5nZXRTeW1ib2xpY05hbWUoKSwgYmQuZ2V0VmVyc2lvbigpKSk7Ci0KLQkJLy8gUHJvY2VzcyB0aGUgZXhwb3J0IHBhY2thZ2UKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cG9ydHNbXSA9IGJkLmdldEV4cG9ydFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJLy9UT0RPIG1ha2Ugc3VyZSB0aGF0IHdlIHN1cHBvcnQgYWxsIHRoZSByZWZpbmVtZW50IG9uIHRoZSBleHBvcnRzCi0JCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX0pBVkFfUEFDS0FHRSwgZXhwb3J0c1tpXS5nZXROYW1lKCksIGV4cG9ydHNbaV0uZ2V0VmVyc2lvbigpID09IFZlcnNpb24uZW1wdHlWZXJzaW9uID8gbnVsbCA6IGV4cG9ydHNbaV0uZ2V0VmVyc2lvbigpKSk7Ci0JCX0KLQkJLy8gSGVyZSB3ZSBhZGQgYSBidW5kbGUgY2FwYWJpbGl0eSB0byBpZGVudGlmeSBidW5kbGVzCi0JCWlmIChpc0JpbmFyeUJ1bmRsZSkKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChCVU5ETEVfQ0FQQUJJTElUWSk7Ci0JCWVsc2UKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChTT1VSQ0VfQlVORExFX0NBUEFCSUxJVFkpOwotCi0JCWlmIChpc0ZyYWdtZW50KQotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0ZSQUdNRU5ULCBiZC5nZXRIb3N0KCkuZ2V0TmFtZSgpLCBiZC5nZXRWZXJzaW9uKCkpKTsKLQotCQlpZiAobWFuaWZlc3RMb2NhbGl6YXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hbmlmZXN0TG9jYWxpemF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgaXRlci5uZXh0KCk7Ci0JCQkJUHJvcGVydGllcyB0cmFuc2xhdGVkU3RyaW5ncyA9IChQcm9wZXJ0aWVzKSBtYW5pZmVzdExvY2FsaXphdGlvbnMuZ2V0KGxvY2FsZSk7Ci0JCQkJRW51bWVyYXRpb24gcHJvcGVydHlLZXlzID0gdHJhbnNsYXRlZFN0cmluZ3MucHJvcGVydHlOYW1lcygpOwotCQkJCXdoaWxlIChwcm9wZXJ0eUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJU3RyaW5nIG5leHRLZXkgPSAoU3RyaW5nKSBwcm9wZXJ0eUtleXMubmV4dEVsZW1lbnQoKTsKLQkJCQkJaXUuc2V0UHJvcGVydHkobG9jYWxlLnRvU3RyaW5nKCkgKyAnLicgKyBuZXh0S2V5LCB0cmFuc2xhdGVkU3RyaW5ncy5nZXRQcm9wZXJ0eShuZXh0S2V5KSk7Ci0JCQkJfQotCQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChtYWtlVHJhbnNsYXRpb25DYXBhYmlsaXR5KGJkLmdldFN5bWJvbGljTmFtZSgpLCBsb2NhbGUpKTsKLQkJCX0KLQkJfQotCi0JCWl1LnNldENhcGFiaWxpdGllcygoUHJvdmlkZWRDYXBhYmlsaXR5W10pIHByb3ZpZGVkQ2FwYWJpbGl0aWVzLnRvQXJyYXkobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtwcm92aWRlZENhcGFiaWxpdGllcy5zaXplKCldKSk7Ci0KLQkJaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0KLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9PU0dJKTsKLQotCQkvLyBTZXQgY2VydGFpbiBwcm9wZXJ0aWVzIGZyb20gdGhlIG1hbmlmZXN0IGhlYWRlciBhdHRyaWJ1dGVzIGFzIElVIHByb3BlcnRpZXMuCi0JCS8vIFRoZSB2YWx1ZXMgb2YgdGhlc2UgYXR0cmlidXRlcyBtYXkgYmUgbG9jYWxpemVkIChzdHJpbmdzIHN0YXJ0aW5nIHdpdGggJyUnKQotCQkvLyB3aXRoIHRoZSB0cmFuc2xhdGVkIHZhbHVlcyBhcHBlYXJpbmcgaW4gdGhlIGxvY2FsaXphdGlvbiBJVSBmcmFnbWVudHMKLQkJLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBidW5kbGUgSVUuCi0JCWlmIChtYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IEJVTkRMRV9JVV9QUk9QRVJUWV9NQVAubGVuZ3RoKSB7Ci0JCQkJaWYgKG1hbmlmZXN0LmNvbnRhaW5zS2V5KEJVTkRMRV9JVV9QUk9QRVJUWV9NQVBbaV0pKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChCVU5ETEVfSVVfUFJPUEVSVFlfTUFQW2ldKTsKLQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpdS5zZXRQcm9wZXJ0eShCVU5ETEVfSVVfUFJPUEVSVFlfTUFQW2kgKyAxXSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWkgKz0gMjsKLQkJCX0KLQkJfQotCi0JCS8vIERlZmluZSB0aGUgaW1tdXRhYmxlIG1ldGFkYXRhIGZvciB0aGlzIElVLiBJbiB0aGlzIGNhc2UgaW1tdXRhYmxlIG1lYW5zCi0JCS8vIHRoYXQgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCB3aWxsIG5vdCBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChpc0ZvbGRlclBsdWdpbikKLQkJCXRvdWNocG9pbnREYXRhLnB1dCgiemlwcGVkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgibWFuaWZlc3QiLCB0b01hbmlmZXN0U3RyaW5nKG1hbmlmZXN0KSk7IC8vJE5PTi1OTFMtMSQKLQkJaXUuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVIb3N0TG9jYWxpemF0aW9uRnJhZ21lbnQoSUluc3RhbGxhYmxlVW5pdCBidW5kbGVJVSwgQnVuZGxlRGVzY3JpcHRpb24gYmQsIFN0cmluZyBob3N0SWQsIFN0cmluZ1tdIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcywgU2V0IGxvY2FsaXphdGlvbklVcykgewotCQlNYXAgaG9zdExvY2FsaXphdGlvbnMgPSBnZXRIb3N0TG9jYWxpemF0aW9ucyhuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKSwgaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzKTsKLQkJaWYgKGhvc3RMb2NhbGl6YXRpb25zICE9IG51bGwpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBsb2NhbGl6YXRpb25GcmFnbWVudCA9IGNyZWF0ZUxvY2FsaXphdGlvbkZyYWdtZW50T2ZIb3N0KGJkLCBob3N0SWQsIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcywgaG9zdExvY2FsaXphdGlvbnMpOwotCQkJbG9jYWxpemF0aW9uSVVzLmFkZChsb2NhbGl6YXRpb25GcmFnbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBob3N0SWQKLQkgKiBAcGFyYW0gYmQKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogQHBhcmFtIGxvY2FsaXplZFN0cmluZ3MKLQkgKiBAcmV0dXJuIGluc3RhbGxhYmxlVW5pdEZyYWdtZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGNyZWF0ZUxvY2FsaXphdGlvbkZyYWdtZW50T2ZIb3N0KEJ1bmRsZURlc2NyaXB0aW9uIGJkLCBTdHJpbmcgaG9zdElkLCBTdHJpbmdbXSBob3N0TWFuaWZlc3RWYWx1ZXMsIE1hcCBob3N0TG9jYWxpemF0aW9ucykgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGZyYWdtZW50ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBmcmFnbWVudElkID0gbWFrZUhvc3RMb2NhbGl6YXRpb25GcmFnbWVudElkKGJkLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJZnJhZ21lbnQuc2V0SWQoZnJhZ21lbnRJZCk7Ci0JCWZyYWdtZW50LnNldFZlcnNpb24oYmQuZ2V0VmVyc2lvbigpKTsgLy8gVE9ETzogaXMgdGhpcyBhIG1lYW5pbmdmdWwgdmVyc2lvbj8KLQotCQlIb3N0U3BlY2lmaWNhdGlvbiBob3N0U3BlYyA9IGJkLmdldEhvc3QoKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gaG9zdFJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGhvc3RTcGVjLmdldE5hbWUoKSwgaG9zdFNwZWMuZ2V0VmVyc2lvblJhbmdlKCksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfTsKLQkJZnJhZ21lbnQuc2V0SG9zdChob3N0UmVxcyk7Ci0KLQkJZnJhZ21lbnQuc2V0U2luZ2xldG9uKHRydWUpOwotCQlmcmFnbWVudC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCi0JCS8vIENyZWF0ZSBhIHByb3ZpZGVkIGNhcGFiaWxpdHkgZm9yIGVhY2ggbG9jYWxlIGFuZCBhZGQgdGhlIHRyYW5zbGF0ZWQgcHJvcGVydGllcy4KLQkJQXJyYXlMaXN0IHByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdChob3N0TG9jYWxpemF0aW9ucy5rZXlTZXQoKS5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBob3N0TG9jYWxpemF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBpdGVyLm5leHQoKTsKLQkJCVByb3BlcnRpZXMgdHJhbnNsYXRlZFN0cmluZ3MgPSAoUHJvcGVydGllcykgaG9zdExvY2FsaXphdGlvbnMuZ2V0KGxvY2FsZSk7Ci0KLQkJCUVudW1lcmF0aW9uIHByb3BlcnR5S2V5cyA9IHRyYW5zbGF0ZWRTdHJpbmdzLnByb3BlcnR5TmFtZXMoKTsKLQkJCXdoaWxlIChwcm9wZXJ0eUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmV4dEtleSA9IChTdHJpbmcpIHByb3BlcnR5S2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCWZyYWdtZW50LnNldFByb3BlcnR5KGxvY2FsZS50b1N0cmluZygpICsgJy4nICsgbmV4dEtleSwgdHJhbnNsYXRlZFN0cmluZ3MuZ2V0UHJvcGVydHkobmV4dEtleSkpOwotCQkJfQotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKG1ha2VUcmFuc2xhdGlvbkNhcGFiaWxpdHkoaG9zdElkLCBsb2NhbGUpKTsKLQkJfQotCQlmcmFnbWVudC5zZXRDYXBhYmlsaXRpZXMoKFByb3ZpZGVkQ2FwYWJpbGl0eVtdKSBwcm92aWRlZENhcGFiaWxpdGllcy50b0FycmF5KG5ldyBQcm92aWRlZENhcGFiaWxpdHlbcHJvdmlkZWRDYXBhYmlsaXRpZXMuc2l6ZSgpXSkpOwotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0RnJhZ21lbnQoZnJhZ21lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gdGhlIGlkIGZvciB0aGUgaXUgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHByb3BlcnRpZXMKLQkgKiAJCSAgIGZvciB0aGUgYnVuZGxlIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VCdW5kbGVMb2NhbGl6YXRpb25GcmFnbWVudElkKFN0cmluZyBpZCkgewotCS8vCQlyZXR1cm4gaWQgKyAiLnRyYW5zbGF0ZWRfcHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkvLwl9Ci0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiB0aGUgaWQgZm9yIHRoZSBpdSBmcmFnbWVudCBjb250YWluaW5nIGxvY2FsaXplZCBwcm9wZXJ0aWVzCi0JICogCQkgICBmb3IgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlSG9zdExvY2FsaXphdGlvbkZyYWdtZW50SWQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBpZCArICIudHJhbnNsYXRlZF9ob3N0X3Byb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZWRDYXBhYmlsaXR5IG1ha2VUcmFuc2xhdGlvbkNhcGFiaWxpdHkoU3RyaW5nIGhvc3RJZCwgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfSVVfTE9DQUxJWkFUSU9OLCBsb2NhbGUudG9TdHJpbmcoKSwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSVUgY29ycmVzcG9uZGluZyB0byBhbiB1cGRhdGUgc2l0ZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBmZWF0dXJlSVVzIFRoZSBJVXMgb2YgdGhlIGZlYXR1cmVzIHRoYXQgYmVsb25nIHRvIHRoZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBwYXJlbnRDYXRlZ29yeSBUaGUgcGFyZW50IGNhdGVnb3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gYW4gSVUgcmVwcmVzZW50aW5nIHRoZSBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVDYXRlZ29yeUlVKFNpdGVDYXRlZ29yeSBjYXRlZ29yeSwgU2V0IGZlYXR1cmVJVXMsIElJbnN0YWxsYWJsZVVuaXQgcGFyZW50Q2F0ZWdvcnkpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gY2F0ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQljYXQuc2V0U2luZ2xldG9uKHRydWUpOwotCQljYXQuc2V0SWQoY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJY2F0LnNldFZlcnNpb24oVmVyc2lvbi5lbXB0eVZlcnNpb24pOwotCQljYXQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX05BTUUsIGNhdGVnb3J5LmdldExhYmVsKCkpOwotCQljYXQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBjYXRlZ29yeS5nZXREZXNjcmlwdGlvbigpKTsKLQotCQlBcnJheUxpc3QgcmVxc0NvbmZpZ3VyYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZUlVcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZUlVcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UoaXUuZ2V0VmVyc2lvbigpLCB0cnVlLCBpdS5nZXRWZXJzaW9uKCksIHRydWUpOwotCQkJcmVxc0NvbmZpZ3VyYXRpb25Vbml0cy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaXUuZ2V0SWQoKSwgcmFuZ2UsIGl1LmdldEZpbHRlcigpLCBmYWxzZSwgZmFsc2UpKTsKLQkJfQotCQkvL25vdGUgdGhhdCB1cGRhdGUgc2l0ZXMgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgbmVzdGVkIGNhdGVnb3JpZXMsIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIHRvIGFkZCBpbiB0aGUgZnV0dXJlCi0JCWlmIChwYXJlbnRDYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlyZXFzQ29uZmlndXJhdGlvblVuaXRzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBwYXJlbnRDYXRlZ29yeS5nZXRJZCgpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgcGFyZW50Q2F0ZWdvcnkuZ2V0RmlsdGVyKCksIGZhbHNlLCBmYWxzZSkpOwotCQl9Ci0JCWNhdC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcygoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlcXNDb25maWd1cmF0aW9uVW5pdHMudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXNDb25maWd1cmF0aW9uVW5pdHMuc2l6ZSgpXSkpOwotCQljYXQuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY2F0ZWdvcnkuZ2V0TmFtZSgpLCBWZXJzaW9uLmVtcHR5VmVyc2lvbil9KTsKLQkJY2F0LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5WzBdKTsKLQkJY2F0LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0NBVEVHT1JZLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGNhdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbmZpZ1NjcmlwdChHZW5lcmF0b3JCdW5kbGVJbmZvIGNvbmZpZ0luZm8sIGJvb2xlYW4gaXNCdW5kbGVGcmFnbWVudCkgewotCQlpZiAoY29uZmlnSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNvbmZpZ1NjcmlwdCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKCFpc0J1bmRsZUZyYWdtZW50ICYmIGNvbmZpZ0luZm8uZ2V0U3RhcnRMZXZlbCgpICE9IEJ1bmRsZUluZm8uTk9fTEVWRUwpIHsKLQkJCWNvbmZpZ1NjcmlwdCArPSAic2V0U3RhcnRMZXZlbChzdGFydExldmVsOiIgKyBjb25maWdJbmZvLmdldFN0YXJ0TGV2ZWwoKSArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghaXNCdW5kbGVGcmFnbWVudCAmJiBjb25maWdJbmZvLmlzTWFya2VkQXNTdGFydGVkKCkpIHsKLQkJCWNvbmZpZ1NjcmlwdCArPSAibWFya1N0YXJ0ZWQoc3RhcnRlZDogdHJ1ZSk7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNvbmZpZ0luZm8uZ2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCkgIT0gbnVsbCkgewotCQkJY29uZmlnU2NyaXB0ICs9IGNvbmZpZ0luZm8uZ2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnU2NyaXB0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gY29uZmlnSW5mbykgewotCQlyZXR1cm4gY3JlYXRlQ29uZmlnU2NyaXB0KGNvbmZpZ0luZm8sIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdEJ1bmRsZUNvbmZpZ3VyYXRpb25Vbml0KEdlbmVyYXRvckJ1bmRsZUluZm8gY29uZmlnSW5mbywgR2VuZXJhdG9yQnVuZGxlSW5mbyB1bmNvbmZpZ0luZm8sIFN0cmluZyBjb25maWd1cmF0aW9uRmxhdm9yKSB7Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnVW5pdElkID0gY3JlYXRlRGVmYXVsdENvbmZpZ1VuaXRJZChPU0dJX0JVTkRMRV9DTEFTU0lGSUVSLCBjb25maWd1cmF0aW9uRmxhdm9yKTsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJVmVyc2lvbiBjb25maWdVbml0VmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCQljdS5zZXRWZXJzaW9uKGNvbmZpZ1VuaXRWZXJzaW9uKTsKLQotCQkvLyBBZGQgY2FwYWJpbGl0aWVzIGZvciBmcmFnbWVudCwgc2VsZiwgYW5kIGRlc2NyaWJpbmcgdGhlIGZsYXZvciBzdXBwb3J0ZWQKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBjb25maWdVbml0VmVyc2lvbiksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCBjb25maWd1cmF0aW9uRmxhdm9yLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9KTsKLQotCQkvLyBDcmVhdGUgYSByZXF1aXJlZCBjYXBhYmlsaXR5IG9uIGJ1bmRsZXMKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfQlVORExFLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIHRydWUpfTsKLQkJY3Uuc2V0SG9zdChyZXFzKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsICJ1bmluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJjb25maWd1cmUiLCBjcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlnU2NyaXB0KGNvbmZpZ0luZm8pKTsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgY3JlYXRlRGVmYXVsdEJ1bmRsZVVuY29uZmlnU2NyaXB0KHVuY29uZmlnSW5mbykpOyAvLyROT04tTkxTLTEkCi0KLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVmYXVsdEJ1bmRsZVVuY29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gdW5jb25maWdJbmZvKSB7Ci0JCXJldHVybiBjcmVhdGVVbmNvbmZpZ1NjcmlwdCh1bmNvbmZpZ0luZm8sIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkZsYXZvciArICIuIiArIGNsYXNzaWZpZXIgKyAiLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdEZlYXR1cmVDb25maWd1cmF0aW9uVW5pdChTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIsIGNvbmZpZ3VyYXRpb25GbGF2b3IpOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQlWZXJzaW9uIGNvbmZpZ1VuaXRWZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0JCWN1LnNldFZlcnNpb24oY29uZmlnVW5pdFZlcnNpb24pOwotCi0JCS8vIEFkZCBjYXBhYmlsaXRpZXMgZm9yIGZyYWdtZW50LCBzZWxmLCBhbmQgZGVzY3JpYmluZyB0aGUgZmxhdm9yIHN1cHBvcnRlZAotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIGNvbmZpZ1VuaXRWZXJzaW9uKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9GTEFWT1IsIGNvbmZpZ3VyYXRpb25GbGF2b3IsIG5ldyBWZXJzaW9uKDEsIDAsIDApKX0pOwotCi0JCS8vIENyZWF0ZSBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgb24gZmVhdHVyZXMKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfRkVBVFVSRSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIHRydWUpfTsKLQkJY3Uuc2V0SG9zdChyZXFzKTsKLQotCQljdS5zZXRGaWx0ZXIoSU5TVEFMTF9GRUFUVVJFU19GSUxURVIpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiaW5zdGFsbEZlYXR1cmUoZmVhdHVyZToke2FydGlmYWN0fSxmZWF0dXJlSWQ6ZGVmYXVsdCxmZWF0dXJlVmVyc2lvbjpkZWZhdWx0KSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsICJ1bmluc3RhbGxGZWF0dXJlKGZlYXR1cmU6JHthcnRpZmFjdH0sZmVhdHVyZUlkOmRlZmF1bHQsZmVhdHVyZVZlcnNpb246ZGVmYXVsdCkiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvblVuaXRGb3JTb3VyY2VCdW5kbGVzKFN0cmluZyBjb25maWd1cmF0aW9uRmxhdm9yKSB7Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnVW5pdElkID0gY3JlYXRlRGVmYXVsdENvbmZpZ1VuaXRJZCgic291cmNlIiwgY29uZmlndXJhdGlvbkZsYXZvcik7IC8vJE5PTi1OTFMtMSQKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJVmVyc2lvbiBjb25maWdVbml0VmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCQljdS5zZXRWZXJzaW9uKGNvbmZpZ1VuaXRWZXJzaW9uKTsKLQotCQkvLyBBZGQgY2FwYWJpbGl0aWVzIGZvciBmcmFnbWVudCwgc2VsZiwgYW5kIGRlc2NyaWJpbmcgdGhlIGZsYXZvciBzdXBwb3J0ZWQKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBjb25maWdVbml0VmVyc2lvbiksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCBjb25maWd1cmF0aW9uRmxhdm9yLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9KTsKLQotCQkvLyBDcmVhdGUgYSByZXF1aXJlZCBjYXBhYmlsaXR5IG9uIHNvdXJjZSBwcm92aWRlcnMKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShOQU1FU1BBQ0VfRUNMSVBTRV9UWVBFLCBUWVBFX0VDTElQU0VfU09VUkNFLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgdHJ1ZSl9OwotCQljdS5zZXRIb3N0KHJlcXMpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsICJhZGRTb3VyY2VCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAicmVtb3ZlU291cmNlQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFeHRyYVByb3BlcnRpZXMoSUluc3RhbGxhYmxlVW5pdCBpaXUsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCWlmIChpaXUgaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXQpIHsKLQkJCUluc3RhbGxhYmxlVW5pdCBpdSA9IChJbnN0YWxsYWJsZVVuaXQpIGlpdTsKLQotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZXh0cmFQcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0W10gY3JlYXRlRWNsaXBzZUlVKEJ1bmRsZURlc2NyaXB0aW9uIGJkLCBNYXAgbWFuaWZlc3QsIGJvb2xlYW4gaXNGb2xkZXJQbHVnaW4sIElBcnRpZmFjdEtleSBrZXksIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUFycmF5TGlzdCBpdXNDcmVhdGVkID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gY3JlYXRlQnVuZGxlSVUoYmQsIG1hbmlmZXN0LCBpc0ZvbGRlclBsdWdpbiwga2V5KTsKLQkJYWRkRXh0cmFQcm9wZXJ0aWVzKGl1LCBleHRyYVByb3BlcnRpZXMpOwotCQlpdXNDcmVhdGVkLmFkZChpdSk7Ci0KLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIChpdXNDcmVhdGVkLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbaXVzQ3JlYXRlZC5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdEtleSBjcmVhdGVGZWF0dXJlQXJ0aWZhY3RLZXkoU3RyaW5nIGZzbiwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShFQ0xJUFNFX0ZFQVRVUkVfQ0xBU1NJRklFUiwgZnNuLCBuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRmVhdHVyZUphcklVKEZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGNoaWxkSVVzLCBib29sZWFuIGlzRXhwbG9kZWQsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBnZXRUcmFuc2Zvcm1lZElkKGZlYXR1cmUuZ2V0SWQoKSwgLyppc1BsdWdpbiovZmFsc2UsIC8qaXNHcm91cCovZmFsc2UpOwotCQlpdS5zZXRJZChpZCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaWYgKGZlYXR1cmUuZ2V0TGljZW5zZSgpICE9IG51bGwpCi0JCQlpdS5zZXRMaWNlbnNlKG5ldyBMaWNlbnNlKGZlYXR1cmUuZ2V0TGljZW5zZVVSTCgpLCBmZWF0dXJlLmdldExpY2Vuc2UoKSkpOwotCQlpZiAoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSAhPSBudWxsKQotCQkJaXUuc2V0Q29weXJpZ2h0KG5ldyBDb3B5cmlnaHQoZmVhdHVyZS5nZXRDb3B5cmlnaHRVUkwoKSwgZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSkpOwotCi0JCS8vIFRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMgYXJlIG5vdCBzcGVjaWZpZWQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZlYXR1cmUgamFyIHRvIGJlIGF0dHJhY3RpdmUgdG8gaW5zdGFsbC4KLQotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX09TR0kpOwotCQlpdS5zZXRGaWx0ZXIoSU5TVEFMTF9GRUFUVVJFU19GSUxURVIpOwotCQlpdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0KLQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXIoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSA9ICJoYW5kbGVyPSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KCkgIT0gbnVsbCkKLQkJCQlpbnN0YWxsSGFuZGxlclByb3BlcnR5ICs9ICIsIGxpYnJhcnk9IiArIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJVUkwoKSAhPSBudWxsKQotCQkJCWluc3RhbGxIYW5kbGVyUHJvcGVydHkgKz0gIiwgdXJsPSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyVVJMKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaXUuc2V0UHJvcGVydHkoRUNMSVBTRV9JTlNUQUxMX0hBTkRMRVJfUFJPUCwgaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSk7Ci0JCX0KLQotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbiksIEZFQVRVUkVfQ0FQQUJJTElUWSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShDQVBBQklMSVRZX05TX1VQREFURV9GRUFUVVJFLCBmZWF0dXJlLmdldElkKCksIHZlcnNpb24pfSk7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2NyZWF0ZUZlYXR1cmVBcnRpZmFjdEtleShmZWF0dXJlLmdldElkKCksIHZlcnNpb24udG9TdHJpbmcoKSl9KTsKLQotCQkvLyBsaW5rIGluIGFsbCB0aGUgY2hpbGRyZW4gKGlmIGFueSkgYXMgcmVxdWlyZW1lbnRzLgotCQkvLyBUT0RPIGNvbnNpZGVyIGlmIHRoZXNlIHNob3VsZCBiZSBsaW5rZWQgYXMgZXhhY3QgdmVyc2lvbiBudW1iZXJzLiAgU2hvdWxkIGJlIG9rIGJ1dCBtYXkgYmUgYnJpdHRsZS4KLQkJaWYgKGNoaWxkSVVzICE9IG51bGwpIHsKLQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtjaGlsZElVcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZElVcy5zaXplKCk7IGkrKykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgY2hpbGQgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2hpbGRJVXMuZ2V0KGkpOwotCQkJCXJlcXVpcmVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJVV9OQU1FU1BBQ0UsIGNoaWxkLmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2UoY2hpbGQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjaGlsZC5nZXRWZXJzaW9uKCksIHRydWUpLCBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlcXVpcmVkKTsKLQkJfQotCi0JCWlmIChpc0V4cGxvZGVkKSB7Ci0JCQkvLyBEZWZpbmUgdGhlIGltbXV0YWJsZSBtZXRhZGF0YSBmb3IgdGhpcyBJVS4gSW4gdGhpcyBjYXNlIGltbXV0YWJsZSBtZWFucwotCQkJLy8gdGhhdCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgbm90IGltcGFjdCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl0b3VjaHBvaW50RGF0YS5wdXQoInppcHBlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXUuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCX0KLQotCQlpZiAoZXh0cmFQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIEZlYXR1cmVzQWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUdyb3VwSVUoRmVhdHVyZSBmZWF0dXJlLCBJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSkgewotCQlyZXR1cm4gY3JlYXRlR3JvdXBJVShmZWF0dXJlLCBmZWF0dXJlSVUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIEZlYXR1cmVzQWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUdyb3VwSVUoRmVhdHVyZSBmZWF0dXJlLCBJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSwgUHJvcGVydGllcyBleHRyYVByb3BlcnRpZXMpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBpZCA9IGdldFRyYW5zZm9ybWVkSWQoZmVhdHVyZS5nZXRJZCgpLCAvKmlzUGx1Z2luKi9mYWxzZSwgLyppc0dyb3VwKi90cnVlKTsKLQkJaXUuc2V0SWQoaWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWl1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBmZWF0dXJlLmdldExhYmVsKCkpOwotCQlpZiAoZmVhdHVyZS5nZXRMaWNlbnNlKCkgIT0gbnVsbCkKLQkJCWl1LnNldExpY2Vuc2UobmV3IExpY2Vuc2UoZmVhdHVyZS5nZXRMaWNlbnNlVVJMKCksIGZlYXR1cmUuZ2V0TGljZW5zZSgpKSk7Ci0JCWlmIChmZWF0dXJlLmdldENvcHlyaWdodCgpICE9IG51bGwpCi0JCQlpdS5zZXRDb3B5cmlnaHQobmV3IENvcHlyaWdodChmZWF0dXJlLmdldENvcHlyaWdodFVSTCgpLCBmZWF0dXJlLmdldENvcHlyaWdodCgpKSk7Ci0JCWl1LnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoaWQsIG5ldyBWZXJzaW9uUmFuZ2UobmV3IFZlcnNpb24oMCwgMCwgMCksIHRydWUsIG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKSwgZmFsc2UpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlGZWF0dXJlRW50cnkgZW50cmllc1tdID0gZmVhdHVyZS5nZXRFbnRyaWVzKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtlbnRyaWVzLmxlbmd0aCArIDFdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IGdldFZlcnNpb25SYW5nZShlbnRyaWVzW2ldKTsKLQkJCXJlcXVpcmVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJVV9OQU1FU1BBQ0UsIGdldFRyYW5zZm9ybWVkSWQoZW50cmllc1tpXS5nZXRJZCgpLCBlbnRyaWVzW2ldLmlzUGx1Z2luKCksIC8qaXNHcm91cCovdHJ1ZSksIHJhbmdlLCBnZXRGaWx0ZXIoZW50cmllc1tpXSksIGVudHJpZXNbaV0uaXNPcHRpb25hbCgpLCBmYWxzZSk7Ci0JCX0KLQkJcmVxdWlyZWRbZW50cmllcy5sZW5ndGhdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJVV9OQU1FU1BBQ0UsIGZlYXR1cmVJVS5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGZlYXR1cmVJVS5nZXRWZXJzaW9uKCksIHRydWUsIGZlYXR1cmVJVS5nZXRWZXJzaW9uKCksIHRydWUpLCBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZWQpOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZS5OT05FKTsKLQkJaXUuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVAsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJLy8gVE9ETzogc2hvdWxkbid0IHRoZSBmaWx0ZXIgZm9yIHRoZSBncm91cCBiZSBjb25zdHJ1Y3RlZCBmcm9tIG9zLCB3cywgYXJjaCwgbmwKLQkJLy8gCQkgb2YgdGhlIGZlYXR1cmU/Ci0JCS8vIGl1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbil9KTsKLQotCQlpZiAoZXh0cmFQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgSVVzIGFuZCBhcnRpZmFjdCBkZXNjcmlwdG9ycyBmb3IgdGhlIEpSRS4gIFRoZSByZXN1bHRpbmcgSVVzIGFyZSBhZGRlZAotCSAqIHRvIHRoZSBnaXZlbiBzZXQsIGFuZCB0aGUgcmVzdWx0aW5nIGFydGlmYWN0IGRlc2NyaXB0b3IsIGlmIGFueSwgaXMgcmV0dXJuZWQuCi0JICogSWYgdGhlIGpyZUxvY2F0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBkZWZhdWx0IGluZm9ybWF0aW9uIGlzIGdlbmVyYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdERlc2NyaXB0b3IgY3JlYXRlSlJFRGF0YShGaWxlIGpyZUxvY2F0aW9uLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbihmYWxzZSk7Ci0JCVN0cmluZyBpZCA9ICJhLmpyZSI7IC8vJE5PTi1OTFMtMSQKLQkJVmVyc2lvbiB2ZXJzaW9uID0gREVGQVVMVF9KUkVfVkVSU0lPTjsKLQkJaXUuc2V0SWQoaWQpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX05BVElWRSk7Ci0KLQkJaWYgKGpyZUxvY2F0aW9uID09IG51bGwgfHwgIWpyZUxvY2F0aW9uLmV4aXN0cygpKSB7Ci0JCQkvLyBzZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzCi0JCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQkJaXUuc2V0Q2FwYWJpbGl0aWVzKGdlbmVyYXRlSlJFQ2FwYWJpbGl0eShpZCwgdmVyc2lvbiwgbnVsbCkpOwotCQkJcmVzdWx0cy5hZGRJVShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWdlbmVyYXRlSlJFSVVEYXRhKGl1LCBpZCwgdmVyc2lvbiwganJlTG9jYXRpb24pOwotCi0JCS8vR2VuZXJhdGUgYXJ0aWZhY3QgZm9yIEpSRQotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KEJJTkFSWV9BUlRJRkFDVF9DTEFTU0lGSUVSLCBpZCwgdmVyc2lvbik7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCQlyZXN1bHRzLmFkZElVKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCi0JCS8vQ3JlYXRlIGNvbmZpZyBpbmZvIGZvciB0aGUgQ1UKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdJZCA9ICJjb25maWcuIiArIGlkOy8vJE5PTi1OTFMtMSQKLQkJY3Uuc2V0SWQoY29uZmlnSWQpOwotCQljdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaWQsIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbk1heCwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnSWQsIHZlcnNpb24pfSk7Ci0JCWN1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gInVuemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsIGNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5Db25maWd1cmF0aW9uRGF0YSA9ICJjbGVhbnVwemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgdW5Db25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJlc3VsdHMuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy9DcmVhdGUgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IKLQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXksIGpyZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0S2V5IGNyZWF0ZUxhdW5jaGVyQXJ0aWZhY3RLZXkoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShCSU5BUllfQVJUSUZBQ1RfQ0xBU1NJRklFUiwgaWQsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgSVVzIGFuZCBhcnRpZmFjdHMgZm9yIHRoZSBMYXVuY2hlciBleGVjdXRhYmxlLiBUaGUgcmVzdWx0aW5nIElVcyBhcmUgYWRkZWQKLQkgKiB0byB0aGUgZ2l2ZW4gc2V0LCBhbmQgdGhlIHJlc3VsdGluZyBhcnRpZmFjdCBkZXNjcmlwdG9yIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0RGVzY3JpcHRvciBjcmVhdGVMYXVuY2hlcklVKEZpbGUgbGF1bmNoZXIsIFN0cmluZyBjb25maWd1cmF0aW9uRmxhdm9yLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdGFudElVcykgewotCQlpZiAobGF1bmNoZXIgPT0gbnVsbCB8fCAhbGF1bmNoZXIuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvL0NyZWF0ZSB0aGUgSVUKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGxhdW5jaGVySWQgPSBMQVVOQ0hFUl9JRF9QUkVGSVggKyAnXycgKyBsYXVuY2hlci5nZXROYW1lKCk7Ci0JCWl1LnNldElkKGxhdW5jaGVySWQpOwotCQlpdS5zZXRWZXJzaW9uKExBVU5DSEVSX1ZFUlNJT04pOwotCi0JCUlBcnRpZmFjdEtleSBrZXkgPSBjcmVhdGVMYXVuY2hlckFydGlmYWN0S2V5KGxhdW5jaGVySWQsIExBVU5DSEVSX1ZFUlNJT04pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkobGF1bmNoZXJJZCwgTEFVTkNIRVJfVkVSU0lPTil9KTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlyZXN1bHRhbnRJVXMuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy9DcmVhdGUgdGhlIENVCi0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnVW5pdElkID0gY29uZmlndXJhdGlvbkZsYXZvciArIGxhdW5jaGVySWQ7Ci0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCWN1LnNldFZlcnNpb24oTEFVTkNIRVJfVkVSU0lPTik7Ci0JCWN1LnNldEhvc3QobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBsYXVuY2hlcklkLCBuZXcgVmVyc2lvblJhbmdlKExBVU5DSEVSX1ZFUlNJT04sIHRydWUsIHZlcnNpb25NYXgsIHRydWUpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSk7Ci0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgTEFVTkNIRVJfVkVSU0lPTil9KTsKLQkJY3Uuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAidW56aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJRW52aXJvbm1lbnRJbmZvIGluZm8gPSAoRW52aXJvbm1lbnRJbmZvKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRW52aXJvbm1lbnRJbmZvLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmICghaW5mby5nZXRPUygpLmVxdWFscyhvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX1dJTjMyKSkgewotCQkJaWYgKGluZm8uZ2V0T1MoKS5lcXVhbHMob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19NQUNPU1gpKSB7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfS9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUywgdGFyZ2V0RmlsZTplY2xpcHNlLCBwZXJtaXNzaW9uczo3NTUpOyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgY29uZmlnID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmNyZWF0ZUNvbmZpZ1NwZWMobnVsbCwgIm1hY29zeCIsIG51bGwpOwotCQkJCWdlbmVyYXRlTGF1bmNoZXJTZXR0ZXIoIkVjbGlwc2UiLCBsYXVuY2hlcklkLCBMQVVOQ0hFUl9WRVJTSU9OLCBjb25maWcsIHJlc3VsdGFudElVcyk7Ci0JCQl9IGVsc2UKLQkJCQljb25maWd1cmF0aW9uRGF0YSArPSAiIGNobW9kKHRhcmdldERpcjoke2luc3RhbGxGb2xkZXJ9LCB0YXJnZXRGaWxlOiIgKyBsYXVuY2hlci5nZXROYW1lKCkgKyAiLCBwZXJtaXNzaW9uczo3NTUpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJU3RyaW5nIGNvbmZpZyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5jcmVhdGVDb25maWdTcGVjKG51bGwsICJ3aW4zMiIsIG51bGwpOwotCQkJZ2VuZXJhdGVMYXVuY2hlclNldHRlcigiZWNsaXBzZSIsIGxhdW5jaGVySWQsIExBVU5DSEVSX1ZFUlNJT04sIGNvbmZpZywgcmVzdWx0YW50SVVzKTsKLQkJfQotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXN1bHRhbnRJVXMuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KGN1KSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQotCQkvL0NyZWF0ZSB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvcgotCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGtleSwgbGF1bmNoZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUxhdW5jaGVyU2V0dGVyKFN0cmluZyBsYXVuY2hlck5hbWUsIFN0cmluZyBpdUlkLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBjb25maWdTcGVjLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdWQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBpZCA9IGl1SWQgKyAnLicgKyBsYXVuY2hlck5hbWU7Ci0JCWl1ZC5zZXRJZChpZCk7Ci0JCWl1ZC5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdWQuc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9PU0dJKTsKLQkJaXVkLnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGlkLCB2ZXJzaW9uKX0pOwotCi0JCVN0cmluZyBmaWx0ZXIgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uY3JlYXRlRmlsdGVyU3BlYyhjb25maWdTcGVjKTsKLQkJaWYgKGZpbHRlci5sZW5ndGgoKSA+IDApCi0JCQlpdWQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiY29uZmlndXJlIiwgInNldExhdW5jaGVyTmFtZShuYW1lOiIgKyBsYXVuY2hlck5hbWUgKyAiKSIpOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgInNldExhdW5jaGVyTmFtZSgpIik7Ci0JCWl1ZC5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJcmVzdWx0LmFkZElVKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXVkKSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3ZpZGVkQ2FwYWJpbGl0eSBjcmVhdGVTZWxmQ2FwYWJpbGl0eShTdHJpbmcgaW5zdGFsbGFibGVVbml0SWQsIFZlcnNpb24gaW5zdGFsbGFibGVVbml0VmVyc2lvbikgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJVV9OQU1FU1BBQ0UsIGluc3RhbGxhYmxlVW5pdElkLCBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5jb25maWdTY3JpcHQoR2VuZXJhdG9yQnVuZGxlSW5mbyB1bmNvbmZpZ0luZm8sIGJvb2xlYW4gaXNCdW5kbGVGcmFnbWVudCkgewotCQlpZiAodW5jb25maWdJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuY29uZmlnU2NyaXB0ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAoIWlzQnVuZGxlRnJhZ21lbnQgJiYgdW5jb25maWdJbmZvLmdldFN0YXJ0TGV2ZWwoKSAhPSBCdW5kbGVJbmZvLk5PX0xFVkVMKSB7Ci0JCQl1bmNvbmZpZ1NjcmlwdCArPSAic2V0U3RhcnRMZXZlbChzdGFydExldmVsOiIgKyBCdW5kbGVJbmZvLk5PX0xFVkVMICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKCFpc0J1bmRsZUZyYWdtZW50ICYmIHVuY29uZmlnSW5mby5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQl1bmNvbmZpZ1NjcmlwdCArPSAibWFya1N0YXJ0ZWQoc3RhcnRlZDogZmFsc2UpOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICh1bmNvbmZpZ0luZm8uZ2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoKSAhPSBudWxsKSB7Ci0JCQl1bmNvbmZpZ1NjcmlwdCArPSB1bmNvbmZpZ0luZm8uZ2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoKTsKLQkJfQotCQlyZXR1cm4gdW5jb25maWdTY3JpcHQ7Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIElucHV0U3RyZWFtIHByb2ZpbGVTdHJlYW0pIHsKLQkJaWYgKHByb2ZpbGVTdHJlYW0gPT0gbnVsbCkgewotCQkJLy91c2UgdGhlIDEuNiBwcm9maWxlIHN0b3JlZCBpbiB0aGUgZ2VuZXJhdG9yIGJ1bmRsZQotCQkJdHJ5IHsKLQkJCQlwcm9maWxlU3RyZWFtID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiL3Byb2ZpbGVzL0phdmFTRS0xLjYucHJvZmlsZSIpLm9wZW5TdHJlYW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlwLmxvYWQocHJvZmlsZVN0cmVhbSk7Ci0JCQlNYW5pZmVzdEVsZW1lbnRbXSBqcmVQYWNrYWdlcyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIsIChTdHJpbmcpIHAuZ2V0KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGV4cG9ydGVkUGFja2FnZUFzQ2FwYWJpbGl0aWVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtqcmVQYWNrYWdlcy5sZW5ndGggKyAxXTsKLQkJCWV4cG9ydGVkUGFja2FnZUFzQ2FwYWJpbGl0aWVzWzBdID0gY3JlYXRlU2VsZkNhcGFiaWxpdHkoaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0ganJlUGFja2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllc1tpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19KQVZBX1BBQ0tBR0UsIGpyZVBhY2thZ2VzW2kgLSAxXS5nZXRWYWx1ZSgpLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllczsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvZmlsZVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvZmlsZVN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUgc2Vjb25kYXJ5IGZhaWx1cmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBQcm92aWRlZENhcGFiaWxpdHlbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUpSRUlVRGF0YShJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSwgU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIEZpbGUganJlTG9jYXRpb24pIHsKLQkJLy9Mb29rIGZvciBhIEpSRSBwcm9maWxlIGZpbGUgdG8gc2V0IHZlcnNpb24gYW5kIGNhcGFiaWxpdGllcwotCQlGaWxlW10gcHJvZmlsZXMgPSBqcmVMb2NhdGlvbi5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiBwYXRobmFtZS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLnByb2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJaWYgKHByb2ZpbGVzLmxlbmd0aCAhPSAxKSB7Ci0JCQlpdS5zZXRWZXJzaW9uKERFRkFVTFRfSlJFX1ZFUlNJT04pOwotCQkJaXUuc2V0Q2FwYWJpbGl0aWVzKGdlbmVyYXRlSlJFQ2FwYWJpbGl0eShpbnN0YWxsYWJsZVVuaXRJZCwgaW5zdGFsbGFibGVVbml0VmVyc2lvbiwgbnVsbCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBwcm9maWxlTmFtZSA9IHByb2ZpbGVzWzBdLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhwcm9maWxlc1swXS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZignLycpKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gREVGQVVMVF9KUkVfVkVSU0lPTjsKLQkJLy9UT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSBKUkUgdmVyc2lvbgotCQlpZiAocHJvZmlsZU5hbWUuaW5kZXhPZigiMS42IikgPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbigiMS42Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9maWxlTmFtZS5pbmRleE9mKCIxLjUiKSA+IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJdmVyc2lvbiA9IG5ldyBWZXJzaW9uKCIxLjUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb2ZpbGVOYW1lLmluZGV4T2YoIjEuNCIpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQl2ZXJzaW9uID0gbmV3IFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJdHJ5IHsKLQkJCWl1LnNldENhcGFiaWxpdGllcyhnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvZmlsZXNbMF0pKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1Nob3VsZG4ndCBoYXBwZW4sIGJ1dCBpZ25vcmUgYW5kIGZhbGwgdGhyb3VnaCB0byB1c2UgZGVmYXVsdAotCQl9Ci0JfQotCi0JLy8gIG1vdmVkIHRvIEZlYXR1cmVBY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWx0ZXIoRmVhdHVyZUVudHJ5IGVudHJ5KSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJlc3VsdC5hcHBlbmQoIigmIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldEZpbHRlcigpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKGVudHJ5LmdldEZpbHRlcigpKTsKLQkJaWYgKGVudHJ5LmdldE9TKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLm9zPSIgKyBlbnRyeS5nZXRPUygpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXRXUygpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS53cz0iICsgZW50cnkuZ2V0V1MoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0QXJjaCgpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5hcmNoPSIgKyBlbnRyeS5nZXRBcmNoKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldE5MKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLm5sPSIgKyBlbnRyeS5nZXROTCgpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMikKLQkJCXJldHVybiBudWxsOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyBtb3ZlZCB0byBGZWF0dXJlQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZWRJZChTdHJpbmcgb3JpZ2luYWwsIGJvb2xlYW4gaXNQbHVnaW4sIGJvb2xlYW4gaXNHcm91cCkgewotCQlyZXR1cm4gKGlzUGx1Z2luID8gb3JpZ2luYWwgOiBvcmlnaW5hbCArIChpc0dyb3VwID8gIi5mZWF0dXJlLmdyb3VwIiA6ICIuZmVhdHVyZS5qYXIiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotCi0JLy8gbW92ZWQgdG8gRmVhdHVyZUFjdGlvbgotCXB1YmxpYyBzdGF0aWMgVmVyc2lvblJhbmdlIGdldFZlcnNpb25SYW5nZShGZWF0dXJlRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIHZlcnNpb25TcGVjID0gZW50cnkuZ2V0VmVyc2lvbigpOwotCQlpZiAodmVyc2lvblNwZWMgPT0gbnVsbCkKLQkJCS8vIFRPRE8gc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgaGVyZS4uLgotCQkJcmV0dXJuIG51bGw7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb25TcGVjKTsKLQkJaWYgKCFlbnRyeS5pc1JlcXVpcmVzKCkpIHsKLQkJCWlmICgiMC4wLjAiLmVxdWFscyhlbnRyeS5nZXRWZXJzaW9uKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCX0KLQkJU3RyaW5nIG1hdGNoID0gZW50cnkuZ2V0TWF0Y2goKTsKLQkJaWYgKG1hdGNoID09IG51bGwpCi0JCQkvLyBUT0RPIHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIGhlcmUuLi4KLQkJCXJldHVybiBudWxsOwotCQlpZiAobWF0Y2guZXF1YWxzKCJwZXJmZWN0IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpOwotCQlpZiAobWF0Y2guZXF1YWxzKCJlcXVpdmFsZW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB1cHBlciA9IG5ldyBWZXJzaW9uKHZlcnNpb24uZ2V0TWFqb3IoKSwgdmVyc2lvbi5nZXRNaW5vcigpICsgMSwgMCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB1cHBlciwgZmFsc2UpOwotCQl9Ci0JCWlmIChtYXRjaC5lcXVhbHMoImNvbXBhdGlibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlWZXJzaW9uIHVwcGVyID0gbmV3IFZlcnNpb24odmVyc2lvbi5nZXRNYWpvcigpICsgMSwgMCwgMCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB1cHBlciwgZmFsc2UpOwotCQl9Ci0JCWlmIChtYXRjaC5lcXVhbHMoImdyZWF0ZXJPckVxdWFsIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIG5ldyBWZXJzaW9uUmFuZ2UobnVsbCkuZ2V0TWF4aW11bSgpLCB0cnVlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09wdGlvbmFsKEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uIGltcG9ydGVkUGFja2FnZSkgewotCQlpZiAoaW1wb3J0ZWRQYWNrYWdlLmdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpLmVxdWFscyhJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbi5SRVNPTFVUSU9OX0RZTkFNSUMpIHx8IGltcG9ydGVkUGFja2FnZS5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKS5lcXVhbHMoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24uUkVTT0xVVElPTl9PUFRJT05BTCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b01hbmlmZXN0U3RyaW5nKE1hcCBwKSB7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29sbGVjdGlvbiBwcm9wZXJ0aWVzID0gcC5lbnRyeVNldCgpOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydGllcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgYVByb3BlcnR5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFQcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5LkJVTkRMRV9TSEFQRSkpCi0JCQkJY29udGludWU7Ci0JCQlyZXN1bHQuYXBwZW5kKGFQcm9wZXJ0eS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChhUHJvcGVydHkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vIFJldHVybiBhIG1hcCBmcm9tIGxvY2FsZSB0byBwcm9wZXJ0eSBzZXQgZm9yIHRoZSBtYW5pZmVzdCBsb2NhbGl6YXRpb25zCi0JLy8gZnJvbSB0aGUgZ2l2ZW4gYnVuZGxlIGRpcmVjdG9yeSBhbmQgZ2l2ZW4gYnVuZGxlIGxvY2FsaXphdGlvbiBwYXRoL25hbWUKLQkvLyBtYW5pZmVzdCBwcm9wZXJ0eSB2YWx1ZS4KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0TWFuaWZlc3RMb2NhbGl6YXRpb25zKE1hcCBtYW5pZmVzdCwgRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlNYXAgbG9jYWxpemF0aW9uczsKLQkJTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBudWxsOyAvLyA9IExvY2FsZS5FTkdMSVNIOyAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIEdlbmVyYXRvckluZm8KLQkJU3RyaW5nW10gYnVuZGxlTWFuaWZlc3RWYWx1ZXMgPSBnZXRNYW5pZmVzdENhY2hlZFZhbHVlcyhtYW5pZmVzdCk7Ci0JCVN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24gPSBidW5kbGVNYW5pZmVzdFZhbHVlc1tCVU5ETEVfTE9DQUxJWkFUSU9OX0lOREVYXTsKLQotCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShuZXcgUGF0aChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCWJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7Ci0JCQlsb2NhbGl6YXRpb25zID0gZ2V0SmFyTWFuaWZlc3RMb2NhbGl6YXRpb24oYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbiwgZGVmYXVsdExvY2FsZSwgYnVuZGxlTWFuaWZlc3RWYWx1ZXMpOwotCQl9IGVsc2UgewotCQkJbG9jYWxpemF0aW9ucyA9IGdldERpck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24sIGRlZmF1bHRMb2NhbGUsIGJ1bmRsZU1hbmlmZXN0VmFsdWVzKTsKLQkJfQotCi0JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0TWFuaWZlc3RDYWNoZWRWYWx1ZXMoTWFwIG1hbmlmZXN0KSB7Ci0JCVN0cmluZ1tdIGNhY2hlZFZhbHVlcyA9IG5ldyBTdHJpbmdbQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTLmxlbmd0aCArIDFdOwotCQlmb3IgKGludCBqID0gMDsgaiA8IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLkJVTkRMRV9MT0NBTElaRURfUFJPUEVSVElFUy5sZW5ndGg7IGorKykgewotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KEJVTkRMRV9MT0NBTElaRURfUFJPUEVSVElFU1tqXSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09ICclJykgewotCQkJCWNhY2hlZFZhbHVlc1tqXSA9IHZhbHVlLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzLkJVTkRMRV9MT0NBTElaQVRJT04pOwotCQljYWNoZWRWYWx1ZXNbQlVORExFX0xPQ0FMSVpBVElPTl9JTkRFWF0gPSAobG9jYWxpemF0aW9uRmlsZSAhPSBudWxsID8gbG9jYWxpemF0aW9uRmlsZSA6IERFRkFVTFRfQlVORExFX0xPQ0FMSVpBVElPTik7Ci0JCXJldHVybiBjYWNoZWRWYWx1ZXM7Ci0JfQotCi0JLy8gUmV0dXJuIGEgbWFwIGZyb20gbG9jYWxlIHRvIHByb3BlcnR5IHNldCBmb3IgdGhlIG1hbmlmZXN0IGxvY2FsaXphdGlvbnMKLQkvLyBmcm9tIHRoZSBnaXZlbiBidW5kbGUgZGlyZWN0b3J5IGFuZCBnaXZlbiBidW5kbGUgbG9jYWxpemF0aW9uIHBhdGgvbmFtZQotCS8vIG1hbmlmZXN0IHByb3BlcnR5IHZhbHVlLgotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEhvc3RMb2NhbGl6YXRpb25zKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZ1tdIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcykgewotCQlNYXAgbG9jYWxpemF0aW9uczsKLQkJTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBudWxsOyAvLyA9IExvY2FsZS5FTkdMSVNIOyAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIEdlbmVyYXRvckluZm8KLQkJU3RyaW5nIGhvc3RCdW5kbGVMb2NhbGl6YXRpb24gPSBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXNbQlVORExFX0xPQ0FMSVpBVElPTl9JTkRFWF07Ci0KLQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UobmV3IFBhdGgoYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQlidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgewotCQkJbG9jYWxpemF0aW9ucyA9IGdldEphck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBob3N0QnVuZGxlTG9jYWxpemF0aW9uLCBkZWZhdWx0TG9jYWxlLCBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMpOwotCQl9IGVsc2UgewotCQkJbG9jYWxpemF0aW9ucyA9IGdldERpck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBob3N0QnVuZGxlTG9jYWxpemF0aW9uLCBkZWZhdWx0TG9jYWxlLCBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldEphck1hbmlmZXN0TG9jYWxpemF0aW9uKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24sIExvY2FsZSBkZWZhdWx0TG9jYWxlLCBTdHJpbmdbXSBidW5kbGVNYW5pZmVzdFZhbHVlcykgewotCQlaaXBGaWxlIGphckZpbGUgPSBudWxsOwotCQlNYXAgbG9jYWxpemF0aW9ucyA9IG5ldyBIYXNoTWFwKDQpOwotCQl0cnkgewotCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlaaXBFbnRyeSBuZXh0RW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmV4dE5hbWUgPSBuZXh0RW50cnkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBsb2NhbGVTdHJpbmcgPSBnZXRMb2NhbGVTdHJpbmcobmV4dE5hbWUsIGJ1bmRsZUxvY2FsaXphdGlvbik7Ci0KLQkJCQlpZiAoIW5leHRFbnRyeS5pc0RpcmVjdG9yeSgpICYmIGxvY2FsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCUxvY2FsZSBuZXh0TG9jYWxlID0gZ2V0TG9jYWxlKGxvY2FsZVN0cmluZyk7Ci0JCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdHJlYW0gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKG5leHRFbnRyeSk7Ci0JCQkJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCQkJcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0JCQkJCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFN0cmluZ3MgPSBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKGJ1bmRsZU1hbmlmZXN0VmFsdWVzLCBwcm9wZXJ0aWVzKTsKLQkJCQkJCWlmIChsb2NhbGl6ZWRTdHJpbmdzLnNpemUoKSA+IDApIHsKLQkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkJCQkJCQlpZiAoREVGQVVMVF9MT0NBTEUuZXF1YWxzKG5leHRMb2NhbGUpICYmIGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgewotCQkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoc3RyZWFtICE9IG51bGwpCi0JCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGphckZpbGUgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWphckZpbGUuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBnZXREaXJNYW5pZmVzdExvY2FsaXphdGlvbihGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uLCBMb2NhbGUgZGVmYXVsdExvY2FsZSwgU3RyaW5nW10gaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzKSB7Ci0JCUZpbGUgbG9jYWxpemF0aW9uUGF0aCA9IG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24pOwotCQlGaWxlIGxvY2FsaXphdGlvbkRpciA9IGxvY2FsaXphdGlvblBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQlmaW5hbCBTdHJpbmcgbG9jYWxpemF0aW9uRmlsZSA9IGxvY2FsaXphdGlvblBhdGguZ2V0TmFtZSgpOwotCQlNZXRhZGF0YUdlbmVyYXRvckhlbHBlciBmb28gPSBuZXcgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIoKTsKLQkJU3RyaW5nW10gbG9jYWxpemF0aW9uRmlsZXMgPSBsb2NhbGl6YXRpb25EaXIubGlzdChmb28ubmV3IExvY2FsaXphdGlvbkZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBmaWxlbmFtZSkgewotCQkJCXJldHVybiAoZ2V0TG9jYWxlU3RyaW5nKGZpbGVuYW1lLCBsb2NhbGl6YXRpb25GaWxlKSAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJSGFzaE1hcCBsb2NhbGl6YXRpb25zID0gbnVsbDsKLQotCQlpZiAobG9jYWxpemF0aW9uRmlsZXMgIT0gbnVsbCkgewotCQkJbG9jYWxpemF0aW9ucyA9IG5ldyBIYXNoTWFwKGxvY2FsaXphdGlvbkZpbGVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsaXphdGlvbkZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5leHRGaWxlID0gbG9jYWxpemF0aW9uRmlsZXNbaV07Ci0JCQkJTG9jYWxlIG5leHRMb2NhbGUgPSBnZXRMb2NhbGUoZ2V0TG9jYWxlU3RyaW5nKG5leHRGaWxlLCBsb2NhbGl6YXRpb25GaWxlKSk7Ci0KLQkJCQl0cnkgewotCQkJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhidW5kbGVMb2NhdGlvbiwgbmV4dEZpbGUpOwotCQkJCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFN0cmluZ3MgPSBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcywgcHJvcGVydGllcyk7Ci0JCQkJCWlmIChsb2NhbGl6ZWRTdHJpbmdzLnNpemUoKSA+IDApIHsKLQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCQkJCQkJaWYgKERFRkFVTFRfTE9DQUxFLmVxdWFscyhuZXh0TG9jYWxlKSAmJiBkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKLQkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotCi0JCXB1YmxpYyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyKCkgewotCQkJLy8gTm90aGluZyB0byBkbwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVuYW1lKTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRMb2NhbGVTdHJpbmcoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZmlsZW5hbWVQcmVmaXgpIHsKLQkJU3RyaW5nIGxvY2FsZVN0cmluZyA9IG51bGw7Ci0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKGZpbGVuYW1lUHJlZml4KSAmJiBmaWxlbmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OKSkgewotCQkJaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gZmlsZW5hbWVQcmVmaXgubGVuZ3RoKCkgKyBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCgpKSB7Ci0JCQkJbG9jYWxlU3RyaW5nID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lUHJlZml4Lmxlbmd0aCgpICsgMSwgZmlsZW5hbWUubGVuZ3RoKCkgLSBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9jYWxlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9jYWxlU3RyaW5nOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGxvY2FsaXphdGlvbkZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJSW5wdXRTdHJlYW0gcHJvcGVydHlTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlpZiAoYnVuZGxlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSkKLQkJCQkJcHJvcGVydHlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBsb2NhbGl6YXRpb25GaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBVUkwoImphcjoiICsgYnVuZGxlTG9jYXRpb24udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpICsgIiEvIiArIGxvY2FsaXphdGlvbkZpbGUpLm9wZW5Db25uZWN0aW9uKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQljb25uZWN0aW9uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJCXByb3BlcnR5U3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgdGhlcmUgaXMgbm8gbWVzc2FnZXMgZmlsZSB0aGVuIGp1c3QgcmV0dXJuOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlyZXN1bHQubG9hZChwcm9wZXJ0eVN0cmVhbSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkKLQkJCQlwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgTG9jYWxlIGdldExvY2FsZShTdHJpbmcgbG9jYWxlU3RyaW5nKSB7Ci0JCUxvY2FsZSBsb2NhbGUgPSBERUZBVUxUX0xPQ0FMRTsKLQkJaWYgKGxvY2FsZVN0cmluZy5sZW5ndGgoKSA9PSA1ICYmIGxvY2FsZVN0cmluZy5pbmRleE9mKCdfJykgPT0gMikgewotCQkJbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDIpLCBsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDMsIDUpKTsKLQkJfSBlbHNlIGlmIChsb2NhbGVTdHJpbmcubGVuZ3RoKCkgPT0gMikgewotCQkJbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDIpKTsKLQkJfQotCQlyZXR1cm4gbG9jYWxlOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFByb3BlcnRpZXMgZ2V0TG9jYWxpemVkUHJvcGVydGllcyhTdHJpbmdbXSBidW5kbGVNYW5pZmVzdEtleXMsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlQcm9wZXJ0aWVzIGxvY2FsaXplZFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEJVTkRMRV9MT0NBTElaRURfUFJPUEVSVElFUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGtleSA9IGJ1bmRsZU1hbmlmZXN0S2V5c1tpXTsKLQkJCWlmIChrZXkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbGl6ZWRWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQlpZiAobG9jYWxpemVkVmFsdWUgIT0gbnVsbCkKLQkJCQkJbG9jYWxpemVkUHJvcGVydGllcy5wdXQoa2V5LCBsb2NhbGl6ZWRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsaXplZFByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjcmVhdGVGZWF0dXJlUm9vdEZpbGVJVShTdHJpbmcgZmVhdHVyZUlkLCBTdHJpbmcgZmVhdHVyZVZlcnNpb24sIEZpbGUgbG9jYXRpb24sIEZpbGVTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGlkID0gZmVhdHVyZUlkICsgJ18nICsgZGVzY3JpcHRvci5nZXRLZXkoKTsKLQkJaXUuc2V0SWQoaWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlVmVyc2lvbik7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWl1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGlkLCB2ZXJzaW9uKX0pOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX05BVElWRSk7Ci0JCVN0cmluZyBjb25maWdTcGVjID0gZGVzY3JpcHRvci5nZXRDb25maWdTcGVjKCk7Ci0JCWlmIChjb25maWdTcGVjICE9IG51bGwpCi0JCQlpdS5zZXRGaWx0ZXIoQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmNyZWF0ZUZpbHRlclNwZWMoY29uZmlnU3BlYykpOwotCQlGaWxlW10gZmlsZVJlc3VsdCA9IGF0dGFjaEZpbGVzKGl1LCBkZXNjcmlwdG9yLCBsb2NhdGlvbik7Ci0JCXNldHVwTGlua3MoaXUsIGRlc2NyaXB0b3IpOwotCQlzZXR1cFBlcm1pc3Npb25zKGl1LCBkZXNjcmlwdG9yKTsKLQotCQlJSW5zdGFsbGFibGVVbml0IGl1UmVzdWx0ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCS8vIG5lZWQgdG8gcmV0dXJuIGJvdGggdGhlIGl1IGFuZCBhbnkgZmlsZXMuCi0JCXJldHVybiBuZXcgT2JqZWN0W10ge2l1UmVzdWx0LCBmaWxlUmVzdWx0fTsKLQl9Ci0KLQkvLyBhdHRhY2ggdGhlIGRlc2NyaWJlZCBmaWxlcyBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gaXUgZGVzY3JpcHRpb24uICBSZXR1cm4KLQkvLyB0aGUgbGlzdCBvZiBmaWxlcyBpZGVudGlmaWVkLgotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBhdHRhY2hGaWxlcyhJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSwgRmlsZVNldERlc2NyaXB0b3IgZGVzY3JpcHRvciwgRmlsZSBsb2NhdGlvbikgewotCQlTdHJpbmcgZmlsZUxpc3QgPSBkZXNjcmlwdG9yLmdldEZpbGVzKCk7Ci0JCVN0cmluZ1tdIGZpbGVTcGVjcyA9IGdldEFycmF5RnJvbVN0cmluZyhmaWxlTGlzdCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtmaWxlU3BlY3MubGVuZ3RoXTsKLQkJaWYgKGZpbGVTcGVjcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTcGVjcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBzcGVjID0gZmlsZVNwZWNzW2ldOwotCQkJCWlmIChzcGVjLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0JCQkJCXNwZWMgPSBzcGVjLnN1YnN0cmluZyg1KTsKLQkJCQlmaWxlc1tpXSA9IG5ldyBGaWxlKGxvY2F0aW9uLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkvLyBhZGQgdG91Y2hwb2ludCBhY3Rpb25zIHRvIHVuemlwIGFuZCBjbGVhbnVwIGFzIG5lZWRlZAotCQkvLyBUT0RPIG5lZWQgdG8gc3VwcG9ydCBmYW5jeSByb290IGZpbGUgbG9jYXRpb24gc3BlY3MKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoMik7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWl1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCi0JCS8vIHByaW1lIHRoZSBJVSB3aXRoIGFuIGFydGlmYWN0IGtleSB0aGF0IHdpbGwgY29ycmVzcG9uZCB0byB0aGUgemlwcGVkIHVwIHJvb3QgZmlsZXMuCi0JCUlBcnRpZmFjdEtleSBrZXkgPSBjcmVhdGVMYXVuY2hlckFydGlmYWN0S2V5KGl1LmdldElkKCksIGl1LmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXR1cFBlcm1pc3Npb25zKEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1LCBGaWxlU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZ1tdW10gcGVybXNMaXN0ID0gZGVzY3JpcHRvci5nZXRQZXJtaXNzaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcm1zTGlzdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGVybVNwZWMgPSBwZXJtc0xpc3RbaV07Ci0JCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAiIGNobW9kKHRhcmdldERpcjoke2luc3RhbGxGb2xkZXJ9LCB0YXJnZXRGaWxlOiIgKyBwZXJtU3BlY1sxXSArICIsIHBlcm1pc3Npb25zOiIgKyBwZXJtU3BlY1swXSArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJCWl1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXR1cExpbmtzKEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1LCBGaWxlU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIFRPRE8gc2V0dXAgdGhlIGxpbmsgc3VwcG9ydC4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFycmF5RnJvbVN0cmluZyhTdHJpbmcgbGlzdCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCBzZXBhcmF0b3IpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICghdG9rZW4uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGQodG9rZW4pOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHJvZHVjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9Qcm9kdWN0UHVibGlzaGVyQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMTQyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9Qcm9kdWN0UHVibGlzaGVyQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zLlByb2R1Y3RBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0UHVibGlzaGVyQXBwbGljYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hlckFwcGxpY2F0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhlY3V0YWJsZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCi0JcHVibGljIFByb2R1Y3RQdWJsaXNoZXJBcHBsaWNhdGlvbigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZVByb2R1Y3RBY3Rpb24oKSk7Ci0JCXJldHVybiAoSVB1Ymxpc2hpbmdBY3Rpb25bXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQdWJsaXNoaW5nQWN0aW9uW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZVByb2R1Y3RBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvZHVjdEFjdGlvbihzb3VyY2UsIHByb2R1Y3QsIGZsYXZvciwgbmV3IEZpbGUoZXhlY3V0YWJsZXMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFyYW1ldGVyKFN0cmluZyBhcmcsIFN0cmluZyBwYXJhbWV0ZXIsIFB1Ymxpc2hlckluZm8gaW5mbykgewotCQlzdXBlci5wcm9jZXNzUGFyYW1ldGVyKGFyZywgcGFyYW1ldGVyLCBpbmZvKTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1wcm9kdWN0RmlsZSIpKSAvLyROT04tTkxTLTEkCi0JCQlwcm9kdWN0ID0gcGFyYW1ldGVyOwotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1leGVjdXRhYmxlcyIpKSAvLyROT04tTkxTLTEkCi0JCQlleGVjdXRhYmxlcyA9IHBhcmFtZXRlcjsKLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItZmxhdm9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCWZsYXZvciA9IHBhcmFtZXRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOWI3ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXIgewotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUyA9ICJwdWJsaXNoUGFja0ZpbGVzQXNTaWJsaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVB1Ymxpc2hlckluZm8gaW5mbzsKLQlwcml2YXRlIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0czsKLQotCS8qKgotCSAqIFJldHVybnMgYSBtZXRhZGF0YSByZXBvc2l0b3J5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHNldHRpbmdzLiAgSWYgYSByZXBvIGF0IHRoZSAKLQkgKiBnaXZlbiBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cywgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBzZXR0aW5ncyBhbmQgcmV0dXJuZWQuICBJZiBubyByZXBvc2l0b3J5Ci0JICogaXMgZm91bmQgdGhlbiBhIG5ldyBTaW1wbGUgcmVwb3NpdG9yeSBpcyBjcmVhdGVkLCBjb25maWd1cmVkIGFuZCByZXR1cm5lZAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgVVJMIGxvY2F0aW9uIG9mIHRoZSByZXBvCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcG8KLQkgKiBAcGFyYW0gYXBwZW5kIHdoZXRoZXIgb3Igbm90IHRoZSByZXBvIHNob3VsZCBhcHBlbmRlZCBvciBjbGVhcmVkCi0JICogQHBhcmFtIGNvbXByZXNzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzIHRoZSByZXBvc2l0b3J5IGluZGV4Ci0JICogQHJldHVybiB0aGUgZGlzY292ZXJlZCBvciBjcmVhdGVkIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBjcmVhdGVNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBhcHBlbmQsIGJvb2xlYW4gY29tcHJlc3MpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgdXJsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Mb2NhdGlvblVSTCwgbG9jYXRpb24pKTsKLQkJfQotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmNvbnRleHQsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlc3VsdCA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkodXJsLCBudWxsKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX0NPTVBSRVNTRUQsIGNvbXByZXNzID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJaWYgKCFyZXN1bHQuaXNNb2RpZmlhYmxlKCkpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX21ldGFkYXRhUmVwb05vdFdyaXRhYmxlLCB1cmwpKTsKLQkJCQlpZiAoIWFwcGVuZCkKLQkJCQkJcmVzdWx0LnJlbW92ZUFsbCgpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCi0JCS8vIAl0aGUgZ2l2ZW4gcmVwbyBsb2NhdGlvbiBpcyBub3QgYW4gZXhpc3RpbmcgcmVwbyBzbyB3ZSBoYXZlIHRvIGNyZWF0ZSBzb21ldGhpbmcKLQkJLy8gVE9ETyBmb3Igbm93IGNyZWF0ZSBhIHJhbmRvbSByZXBvIGJ5IGRlZmF1bHQuCi0JCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IG5hbWUgPT0gbnVsbCA/IGxvY2F0aW9uICsgIiAtIG1ldGFkYXRhIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXN1bHQgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkodXJsLCByZXBvc2l0b3J5TmFtZSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSk7Ci0JCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXN1bHQuZ2V0TG9jYXRpb24oKSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX0NPTVBSRVNTRUQsIGNvbXByZXNzID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnRpZmFjdCByZXBvc2l0b3J5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHNldHRpbmdzLiAgSWYgYSByZXBvIGF0IHRoZSAKLQkgKiBnaXZlbiBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cywgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBzZXR0aW5ncyBhbmQgcmV0dXJuZWQuICBJZiBubyByZXBvc2l0b3J5Ci0JICogaXMgZm91bmQgdGhlbiBhIG5ldyBTaW1wbGUgcmVwb3NpdG9yeSBpcyBjcmVhdGVkLCBjb25maWd1cmVkIGFuZCByZXR1cm5lZAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgVVJMIGxvY2F0aW9uIG9mIHRoZSByZXBvCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcG8KLQkgKiBAcGFyYW0gYXBwZW5kIHdoZXRoZXIgb3Igbm90IHRoZSByZXBvIHNob3VsZCBhcHBlbmRlZCBvciBjbGVhcmVkCi0JICogQHBhcmFtIGNvbXByZXNzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzIHRoZSByZXBvc2l0b3J5IGluZGV4Ci0JICogQHBhcmFtIHJldXNlUGFja2VkRmlsZXMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBkaXNjb3ZlcmVkIFBhY2syMDAgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkKLQkgKiBAcmV0dXJuIHRoZSBkaXNjb3ZlcmVkIG9yIGNyZWF0ZWQgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZUFydGlmYWN0UmVwb3NpdG9yeShTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGFwcGVuZCwgYm9vbGVhbiBjb21wcmVzcywgYm9vbGVhbiByZXVzZVBhY2tlZEZpbGVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5jb250ZXh0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgdXJsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Mb2NhdGlvblVSTCwgbG9jYXRpb24pKTsKLQkJfQotCQl0cnkgewotCQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXN1bHQgPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHVybCwgbnVsbCk7Ci0JCQlpZiAoIXJlc3VsdC5pc01vZGlmaWFibGUoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Ob3RXcml0YWJsZSwgdXJsKSk7Ci0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCBjb21wcmVzcyA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJaWYgKHJldXNlUGFja2VkRmlsZXMpCi0JCQkJcmVzdWx0LnNldFByb3BlcnR5KFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUywgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFhcHBlbmQpCi0JCQkJcmVzdWx0LnJlbW92ZUFsbCgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0KLQkJLy8gCXRoZSBnaXZlbiByZXBvIGxvY2F0aW9uIGlzIG5vdCBhbiBleGlzdGluZyByZXBvIHNvIHdlIGhhdmUgdG8gY3JlYXRlIHNvbWV0aGluZwotCQkvLyBUT0RPIGZvciBub3cgY3JlYXRlIGEgU2ltcGxlIHJlcG8gYnkgZGVmYXVsdC4KLQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gbmFtZSAhPSBudWxsID8gbmFtZSA6IGxvY2F0aW9uICsgIiAtIGFydGlmYWN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXN1bHQgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkodXJsLCByZXBvc2l0b3J5TmFtZSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSk7Ci0JCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXN1bHQuZ2V0TG9jYXRpb24oKSk7Ci0JCS8vIFRPRE8gdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgd2UgaGF2ZSB0byBkbyB0byBzZXQgdXAgdGhlIG1hcHBpbmcgcnVsZXMgaGVyZS4uLgotCQkvLwkJaWYgKGlucGxhY2UpIHsKLQkJLy8JCX0KLQkJcmVzdWx0LnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgY29tcHJlc3MgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaWYgKHJldXNlUGFja2VkRmlsZXMpCi0JCQlyZXN1bHQuc2V0UHJvcGVydHkoUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFB1Ymxpc2hlcihJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JCXJlc3VsdHMgPSBuZXcgUHVibGlzaGVyUmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIFB1Ymxpc2hlcihJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJdGhpcy5yZXN1bHRzID0gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKElQdWJsaXNoaW5nQWN0aW9uW10gYWN0aW9ucykgewotCQkvLyBydW4gYWxsIHRoZSBhY3Rpb25zCi0JCU11bHRpU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKCJ0aGlzIiwgMCwgInB1Ymxpc2hpbmcgcmVzdWx0IiwgbnVsbCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBhY3Rpb25zW2ldLnBlcmZvcm0oaW5mbywgcmVzdWx0cyk7Ci0JCQlmaW5hbFN0YXR1cy5tZXJnZShzdGF0dXMpOwotCQl9Ci0JCWlmICghZmluYWxTdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZpbmFsU3RhdHVzOwotCi0JCS8vIGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLCBwdWJsaXNoIGFsbCB0aGUgaXVzLgotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeSA9IGluZm8uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCWlmIChtZXRhZGF0YVJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdXMgPSByZXN1bHRzLmdldElVcyhudWxsLCBudWxsKTsKLQkJCW1ldGFkYXRhUmVwb3NpdG9yeS5hZGRJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIGl1cy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1cy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU3NTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hlckluZm8gaW1wbGVtZW50cyBJUHVibGlzaGVySW5mbyB7Ci0KLQlwcml2YXRlIGludCBhcnRpZmFjdE9wdGlvbnMgPSAwOwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG9zaXRvcnk7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFydGlmYWN0UmVwb3NpdG9yeTsKLQlwcml2YXRlIFN0cmluZ1tdIGNvbmZpZ3VyYXRpb25zOwotCXByaXZhdGUgTGlzdCBhZHZpY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgxMSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZHZpY2UoSVB1Ymxpc2hpbmdBZHZpY2UgYWR2aWNlKSB7Ci0JCWFkdmljZUxpc3QuYWRkKGFkdmljZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWR2aWNlKFN0cmluZyBjb25maWdTcGVjLCBib29sZWFuIGluY2x1ZGVEZWZhdWx0LCBTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbiwgQ2xhc3MgdHlwZSkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhZHZpY2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShvYmplY3QpICYmICgoSVB1Ymxpc2hpbmdBZHZpY2UpIG9iamVjdCkuaXNBcHBsaWNhYmxlKGNvbmZpZ1NwZWMsIGluY2x1ZGVEZWZhdWx0LCBpZCwgdmVyc2lvbikpCi0JCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhUmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFydGlmYWN0T3B0aW9ucygpIHsKLQkJcmV0dXJuIGFydGlmYWN0T3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSB2YWx1ZSkgewotCQlhcnRpZmFjdFJlcG9zaXRvcnkgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoSU1ldGFkYXRhUmVwb3NpdG9yeSB2YWx1ZSkgewotCQltZXRhZGF0YVJlcG9zaXRvcnkgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE9wdGlvbnMoaW50IHZhbHVlKSB7Ci0JCWFydGlmYWN0T3B0aW9ucyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25zKFN0cmluZ1tdIHZhbHVlKSB7Ci0JCWNvbmZpZ3VyYXRpb25zID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gInNvbWUgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGlzIHNldHVwIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlclJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVyUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHVibGlzaGVyUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hlclJlc3VsdCBpbXBsZW1lbnRzIElQdWJsaXNoZXJSZXN1bHQgewotCS8vIHR5cGUgbWFya2VycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fUk9PVCA9ICJub25fcm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzZXQgb2YgdG9wIGxldmVsIElVcwotCWZpbmFsIE1hcCByb290SVVzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBzZXQgb2YgaW50ZXJuYWwgYW5kIGxlYWYgSVVzCi0JZmluYWwgTWFwIG5vblJvb3RJVXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHZvaWQgYWRkSVUoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gUk9PVCkKLQkJCWFkZElVKHJvb3RJVXMsIGl1LmdldElkKCksIGl1KTsKLQkJaWYgKHR5cGUgPT0gTk9OX1JPT1QpCi0JCQlhZGRJVShub25Sb290SVVzLCBpdS5nZXRJZCgpLCBpdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSVVzKENvbGxlY3Rpb24gaXVzLCBTdHJpbmcgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBpdXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJYWRkSVUoKElJbnN0YWxsYWJsZVVuaXQpIGkubmV4dCgpLCB0eXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSVUoTWFwIG1hcCwgU3RyaW5nIGlkLCBJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVNldCBpdXMgPSAoU2V0KSBtYXAuZ2V0KGlkKTsKLQkJaWYgKGl1cyA9PSBudWxsKSB7Ci0JCQlpdXMgPSBuZXcgSGFzaFNldCgxMSk7Ci0JCQltYXAucHV0KGlkLCBpdXMpOwotCQl9Ci0JCWl1cy5hZGQoaXUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIElVcyBnZW5lcmF0ZWQgZHVyaW5nIHRoaXMgZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JICovCi0JcHVibGljIE1hcCBnZXRHZW5lcmF0ZWRJVXMoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJSGFzaE1hcCBhbGwgPSBuZXcgSGFzaE1hcCgpOwotCQkJYWxsLnB1dEFsbChyb290SVVzKTsKLQkJCWFsbC5wdXRBbGwobm9uUm9vdElVcyk7Ci0JCQlyZXR1cm4gYWxsOwotCQl9Ci0JCWlmICh0eXBlID09IFJPT1QpCi0JCQlyZXR1cm4gcm9vdElVczsKLQkJaWYgKHR5cGUgPT0gTk9OX1JPT1QpCi0JCQlyZXR1cm4gbm9uUm9vdElVczsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBJVSB0eXBlOiAiICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBUT0RPIHRoaXMgbWV0aG9kIHJlYWxseSBzaG91bGQgbm90IGJlIG5lZWRlZCBhcyBpdCBqdXN0IHJldHVybnMgdGhlIGZpcnN0Ci0JLy8gbWF0Y2hpbmcgSVUgbm9uLWRldGVybWluaXN0aWNhbGx5LgotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldElVKFN0cmluZyBpZCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlID09IFJPT1QpIHsKLQkJCUNvbGxlY3Rpb24gaXVzID0gKENvbGxlY3Rpb24pIHJvb3RJVXMuZ2V0KGlkKTsKLQkJCWlmIChpdXMgIT0gbnVsbCAmJiBpdXMuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXQpIGl1cy5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQotCQlpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUgPT0gTk9OX1JPT1QpIHsKLQkJCUNvbGxlY3Rpb24gaXVzID0gKENvbGxlY3Rpb24pIG5vblJvb3RJVXMuZ2V0KGlkKTsKLQkJCWlmIChpdXMgIT0gbnVsbCAmJiBpdXMuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXQpIGl1cy5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJVXMgaW4gdGhpcyByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SVVzKFN0cmluZyBpZCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlc3VsdC5hZGRBbGwoaWQgPT0gbnVsbCA/IGZsYXR0ZW4ocm9vdElVcy52YWx1ZXMoKSkgOiAoQ29sbGVjdGlvbikgcm9vdElVcy5nZXQoaWQpKTsKLQkJCXJlc3VsdC5hZGRBbGwoaWQgPT0gbnVsbCA/IGZsYXR0ZW4obm9uUm9vdElVcy52YWx1ZXMoKSkgOiAoQ29sbGVjdGlvbikgbm9uUm9vdElVcy5nZXQoaWQpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gUk9PVCkKLQkJCXJldHVybiBpZCA9PSBudWxsID8gZmxhdHRlbihyb290SVVzLnZhbHVlcygpKSA6IChDb2xsZWN0aW9uKSByb290SVVzLmdldChpZCk7Ci0JCWlmICh0eXBlID09IE5PTl9ST09UKQotCQkJcmV0dXJuIGlkID09IG51bGwgPyBmbGF0dGVuKG5vblJvb3RJVXMudmFsdWVzKCkpIDogKENvbGxlY3Rpb24pIG5vblJvb3RJVXMuZ2V0KGlkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGZsYXR0ZW4oQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IChJSW5zdGFsbGFibGVVbml0W10pIGkubmV4dCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpdXMubGVuZ3RoOyBqKyspCi0JCQkJcmVzdWx0LmFkZChpdXNbal0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVyZ2UoSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQsIGludCBtb2RlKSB7Ci0JCWlmIChtb2RlID09IE1FUkdFX01BVENISU5HKSB7Ci0JCQlhZGRJVXMocmVzdWx0LmdldElVcyhudWxsLCBST09UKSwgUk9PVCk7Ci0JCQlhZGRJVXMocmVzdWx0LmdldElVcyhudWxsLCBOT05fUk9PVCksIE5PTl9ST09UKTsKLQkJfSBlbHNlIGlmIChtb2RlID09IE1FUkdFX0FMTF9ST09UKSB7Ci0JCQlhZGRJVXMocmVzdWx0LmdldElVcyhudWxsLCBST09UKSwgUk9PVCk7Ci0JCQlhZGRJVXMocmVzdWx0LmdldElVcyhudWxsLCBOT05fUk9PVCksIFJPT1QpOwotCQl9IGVsc2UgaWYgKG1vZGUgPT0gTUVSR0VfQUxMX05PTl9ST09UKSB7Ci0JCQlhZGRJVXMocmVzdWx0LmdldElVcyhudWxsLCBST09UKSwgTk9OX1JPT1QpOwotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgTk9OX1JPT1QpLCBOT05fUk9PVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQWJzdHJhY3RBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQWJzdHJhY3RBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwZGNiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0Fic3RyYWN0QWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5BYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSVB1Ymxpc2hpbmdBZHZpY2UgewotCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFN0cmluZyBjb25maWdTcGVjLCBib29sZWFuIGluY2x1ZGVEZWZhdWx0LCBTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gbWF0Y2hDb25maWcoY29uZmlnU3BlYywgaW5jbHVkZURlZmF1bHQpICYmIG1hdGNoSWQoaWQpICYmIG1hdGNoVmVyc2lvbih2ZXJzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFZlcnNpb24oVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCVZlcnNpb24gYWR2aWNlVmVyc2lvbiA9IGdldFZlcnNpb24oKTsKLQkJaWYgKGFkdmljZVZlcnNpb24gIT0gbnVsbCkKLQkJCXJldHVybiB2ZXJzaW9uLmVxdWFscyhhZHZpY2VWZXJzaW9uKTsKLQkJVmVyc2lvblJhbmdlIHJhbmdlID0gZ2V0VmVyc2lvblJhbmdlKCk7Ci0JCWlmIChyYW5nZSAhPSBudWxsKQotCQkJcmV0dXJuIHJhbmdlLmlzSW5jbHVkZWQodmVyc2lvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBWZXJzaW9uUmFuZ2UgZ2V0VmVyc2lvblJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaElkKFN0cmluZyBpZCkgewotCQlTdHJpbmcgYWR2aWNlSWQgPSBnZXRJZCgpOwotCQlyZXR1cm4gYWR2aWNlSWQgPT0gbnVsbCA/IHRydWUgOiBhZHZpY2VJZC5lcXVhbHMoaWQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoQ29uZmlnKFN0cmluZyBjb25maWdTcGVjLCBib29sZWFuIGluY2x1ZGVEZWZhdWx0KSB7Ci0JCVN0cmluZyBhZHZpY2VDb25maWdTcGVjID0gZ2V0Q29uZmlnU3BlYygpOwotCQlpZiAoYWR2aWNlQ29uZmlnU3BlYyA9PSBudWxsKQotCQkJcmV0dXJuIGluY2x1ZGVEZWZhdWx0OwotCQlTdHJpbmdbXSBmdWxsID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLnBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKLQkJU3RyaW5nW10gcGFydGlhbCA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoYWR2aWNlQ29uZmlnU3BlYyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGlhbC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0cmluZyA9IHBhcnRpYWxbaV07Ci0JCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgIXN0cmluZy5lcXVhbHMoZnVsbFtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnU3BlYygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0FjY3VtdWxhdGVDb25maWdEYXRhQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0FjY3VtdWxhdGVDb25maWdEYXRhQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2RlMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9BY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkNvbmZpZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBBY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBjb25maWdTcGVjOwotCXByaXZhdGUgRGF0YUxvYWRlciBsb2FkZXI7Ci0KLQlwdWJsaWMgQWNjdW11bGF0ZUNvbmZpZ0RhdGFBY3Rpb24oSVB1Ymxpc2hlckluZm8gaW5mbywgU3RyaW5nIGNvbmZpZ1NwZWMsIEZpbGUgY29uZmlndXJhdGlvbkxvY2F0aW9uLCBGaWxlIGV4ZWN1dGFibGVMb2NhdGlvbikgewotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCQlsb2FkZXIgPSBuZXcgRGF0YUxvYWRlcihjb25maWd1cmF0aW9uTG9jYXRpb24sIGV4ZWN1dGFibGVMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJc3RvcmVDb25maWdEYXRhKGluZm8sIGNvbmZpZ1NwZWMsIHJlc3VsdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZUNvbmZpZ0RhdGEoSVB1Ymxpc2hlckluZm8gaW5mbywgU3RyaW5nIGNvbmZpZ1NwZWMsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCUNvbmZpZ0RhdGEgZGF0YSA9IGxvYWRlci5nZXRDb25maWdEYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWluZm8uYWRkQWR2aWNlKG5ldyBDb25maWdBZHZpY2UoZGF0YSwgY29uZmlnU3BlYykpOwotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbG9hZGVyLmdldExhdW5jaGVyRGF0YSgpOwotCQlpZiAobGF1bmNoZXJEYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWluZm8uYWRkQWR2aWNlKG5ldyBMYXVuY2hpbmdBZHZpY2UobGF1bmNoZXJEYXRhLCBjb25maWdTcGVjKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CcmFuZGVkRXhlY3V0YWJsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CcmFuZGVkRXhlY3V0YWJsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZmMzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnJhbmRlZEV4ZWN1dGFibGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLlByb2R1Y3RGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLnByb2R1Y3QuQnJhbmRpbmdJcm9uOwotCi1wdWJsaWMgY2xhc3MgQnJhbmRlZEV4ZWN1dGFibGVBY3Rpb24gZXh0ZW5kcyBFcXVpbm94RXhlY3V0YWJsZUFjdGlvbiB7Ci0KLQlwcml2YXRlIFByb2R1Y3RGaWxlIHByb2R1Y3Q7Ci0KLQlwdWJsaWMgQnJhbmRlZEV4ZWN1dGFibGVBY3Rpb24oRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGV4ZWN1dGFibGVzLCBTdHJpbmcgcHJvZHVjdExvY2F0aW9uLCBTdHJpbmcgZmxhdm9yLCBTdHJpbmcgY29uZmlnU3BlYykgewotCQlzdXBlcigpOwotCQl0aGlzLmV4ZWN1dGFibGVzID0gZXhlY3V0YWJsZXM7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCQlwcm9kdWN0ID0gbG9hZFByb2R1Y3QocHJvZHVjdExvY2F0aW9uKTsKLQkJaWRCYXNlID0gcHJvZHVjdC5nZXRQcm9kdWN0TmFtZSgpOwotCQl2ZXJzaW9uU3BlYyA9IHByb2R1Y3QuZ2V0VmVyc2lvbigpOwotCX0KLQotCXByaXZhdGUgUHJvZHVjdEZpbGUgbG9hZFByb2R1Y3QoU3RyaW5nIHByb2R1Y3RMb2NhdGlvbikgewotCQlQcm9kdWN0RmlsZSByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gbmV3IFByb2R1Y3RGaWxlKHByb2R1Y3RMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmFibGUgdG8gbG9hZCBwcm9kdWN0IGZpbGUiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmFuZHMgYSBjb3B5IG9mIHRoZSBnaXZlbiBleGVjdXRhYmxlIGRlc2NyaXB0b3Igd2l0aCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIAotCSAqIGN1cnJlbnQgcHJvZHVjdCBkZWZpbml0aW9uLiAgVGhlIGZpbGVzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRvciBhcmUgYWxzbyBjb3BpZWQKLQkgKiB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbiB0byBhdm9pZCBkZXN0cnVjdGl2ZSBtb2RpZmljYXRpb24KLQkgKiBAcGFyYW0gdGhlIGV4ZWN1dGFibGUgZGVzY3JpcHRvciB0byBicmFuZC4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgZGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgYnJhbmRFeGVjdXRhYmxlcyhFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJcmVzdWx0Lm1ha2VUZW1wb3JhcnlDb3B5KCk7Ci0JCUJyYW5kaW5nSXJvbiBpcm9uID0gbmV3IEJyYW5kaW5nSXJvbigpOwotCQlTdHJpbmcgb3MgPSBwYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYylbMV07Ci0JCWlyb24uc2V0SWNvbnMocHJvZHVjdC5nZXRJY29ucyhvcykpOwotCQlpcm9uLnNldE5hbWUocHJvZHVjdC5nZXRMYXVuY2hlck5hbWUoKSk7Ci0JCWlyb24uc2V0T1Mob3MpOwotCQlpcm9uLnNldFJvb3QocmVzdWx0LmdldExvY2F0aW9uKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cnkgewotCQkJaXJvbi5icmFuZCgpOwotCQkJcmVzdWx0LnNldEV4ZWN1dGFibGVOYW1lKHByb2R1Y3QuZ2V0TGF1bmNoZXJOYW1lKCksIHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnVuZGxlU2hhcGVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnVuZGxlU2hhcGVBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNDIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0J1bmRsZVNoYXBlQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEJ1bmRsZVNoYXBlQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RBZHZpY2UgaW1wbGVtZW50cyBJQnVuZGxlU2hhcGVBZHZpY2UgewotCi0JcHJpdmF0ZSBTdHJpbmcgc2hhcGU7Ci0JcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgQnVuZGxlU2hhcGVBZHZpY2UoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBzaGFwZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuc2hhcGUgPSBzaGFwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZSgpIHsKLQkJcmV0dXJuIHNoYXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CdW5kbGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0J1bmRsZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxYTdlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0J1bmRsZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLQotLyoqCi0gKiBQdWJsaXNoIElVcyBmb3IgYWxsIG9mIHRoZSBidW5kbGVzIGluIHRoZSBnaXZlbiBzZXQgb2YgbG9jYXRpb25zLiAgVGhlIGxvY2F0aW9ucyBjYW4gCi0gKiBiZSBhY3R1YWwgbG9jYXRpb25zIG9mIHRoZSBidW5kbGVzIG9yIGZvbGRlcnMgb2YgYnVuZGxlcy4KLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZXNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1IgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVVBEQVRFX0NPTkZJR1VSQVRPUiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGaWxlW10gbG9jYXRpb25zOwotCXByaXZhdGUgU3RhdGVPYmplY3RGYWN0b3J5IHN0YXRlT2JqZWN0RmFjdG9yeTsKLQotCXB1YmxpYyBCdW5kbGVzQWN0aW9uKEZpbGVbXSBsb2NhdGlvbnMpIHsKLQkJdGhpcy5sb2NhdGlvbnMgPSBleHBhbmRMb2NhdGlvbnMobG9jYXRpb25zKTsKLQkJLy8gVE9ETyBuZWVkIHRvIGZpZ3VyZSBhIGJldHRlciB3YXkgb2YgY29uZmlndXJpbmcgdGhlIGdlbmVyYXRvci4uLgotCQlQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW4gPSAoUGxhdGZvcm1BZG1pbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHBsYXRmb3JtQWRtaW4gIT0gbnVsbCkKLQkJCXN0YXRlT2JqZWN0RmFjdG9yeSA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlcyA9IGdldEJ1bmRsZURlc2NyaXB0aW9ucyhsb2NhdGlvbnMpOwotCQlnZW5lcmF0ZUJ1bmRsZUlVcyhidW5kbGVzLCByZXN1bHRzLCBpbmZvKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gZXhwYW5kTG9jYXRpb25zKEZpbGVbXSBsaXN0KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWV4cGFuZExvY2F0aW9ucyhsaXN0LCByZXN1bHQpOwotCQlyZXR1cm4gKEZpbGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IEZpbGVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRMb2NhdGlvbnMoRmlsZVtdIGxpc3QsIEFycmF5TGlzdCByZXN1bHQpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGxvY2F0aW9uID0gbGlzdFtpXTsKLQkJCWlmIChsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gaWYgdGhlIGxvY2F0aW9uIGlzIGl0c2VsZiBhIGJ1bmRsZSwganVzdCBhZGQgaXQuICBPdGhlcndpc2UgciBkb3duCi0JCQkJaWYgKCFuZXcgRmlsZShsb2NhdGlvbiwgIk1FVEEtSU5GL01BTklGRVNULk1GIikuZXhpc3RzKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZXhwYW5kTG9jYXRpb25zKGxvY2F0aW9uLmxpc3RGaWxlcygpLCByZXN1bHQpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChsb2NhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hZGQobG9jYXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCdW5kbGVJVXMoQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVzLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQkvLyBDb21wdXRpbmcgdGhlIHBhdGggZm9yIGxvY2FsaXplZCBwcm9wZXJ0eSBmaWxlcyBpbiBhIE5MIGZyYWdtZW50IGJ1bmRsZQotCQkvLyByZXF1aXJlcyB0aGUgQlVORExFX0xPQ0FMSVpBVElPTiBwcm9wZXJ0eSBmcm9tIHRoZSBtYW5pZmVzdCBvZiB0aGUgaG9zdCBidW5kbGUsCi0JCS8vIHNvIGEgZmlyc3QgcGFzcyBpcyBkb25lIG92ZXIgYWxsIHRoZSBidW5kbGVzIHRvIGNhY2hlIHRoaXMgdmFsdWUgYXMgd2VsbCBhcyB0aGUgdGFncwotCQkvLyBmcm9tIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGxvY2FsaXphYmxlIHByb3BlcnRpZXMuCi0JCWZpbmFsIGludCBDQUNIRV9QSEFTRSA9IDA7Ci0JCWZpbmFsIGludCBHRU5FUkFURV9QSEFTRSA9IDE7Ci0JCU1hcCBidW5kbGVMb2NhbGl6YXRpb25NYXAgPSBuZXcgSGFzaE1hcChidW5kbGVzLmxlbmd0aCk7Ci0JCVNldCBsb2NhbGl6YXRpb25JVXMgPSBuZXcgSGFzaFNldCgzMik7Ci0JCWZvciAoaW50IHBoYXNlID0gQ0FDSEVfUEhBU0U7IHBoYXNlIDw9IEdFTkVSQVRFX1BIQVNFOyBwaGFzZSsrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGVEZXNjcmlwdGlvbiBiZCA9IGJ1bmRsZXNbaV07Ci0JCQkJLy8gQSBidW5kbGUgbWF5IGJlIG51bGwgaWYgdGhlIGFzc29jaWF0ZWQgcGx1Zy1pbiBkb2VzIG5vdCBoYXZlIGEgbWFuaWZlc3QgZmlsZSAtCi0JCQkJLy8gZm9yIGV4YW1wbGUsIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuajkKLQkJCQlpZiAoYmQgIT0gbnVsbCAmJiBiZC5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIGJkLmdldFZlcnNpb24oKSAhPSBudWxsKSB7Ci0JCQkJCU1hcCBidW5kbGVNYW5pZmVzdCA9IChNYXApIGJkLmdldFVzZXJPYmplY3QoKTsKLQotCQkJCQlpZiAocGhhc2UgPT0gQ0FDSEVfUEhBU0UpIHsKLQkJCQkJCWlmIChidW5kbGVNYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nW10gY2FjaGVkVmFsdWVzID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2V0TWFuaWZlc3RDYWNoZWRWYWx1ZXMoYnVuZGxlTWFuaWZlc3QpOwotCQkJCQkJCWJ1bmRsZUxvY2FsaXphdGlvbk1hcC5wdXQobWFrZVNpbXBsZUtleShiZCksIGNhY2hlZFZhbHVlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJQXJ0aWZhY3RLZXkga2V5ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQnVuZGxlQXJ0aWZhY3RLZXkoYmQuZ2V0U3ltYm9saWNOYW1lKCksIGJkLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJCQkJCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgYWQgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVBcnRpZmFjdERlc2NyaXB0b3Ioa2V5LCBsb2NhdGlvbik7Ci0JCQkJCQlhZGRQcm9wZXJ0aWVzKChBcnRpZmFjdERlc2NyaXB0b3IpIGFkLCBsb2NhdGlvbiwgaW5mbyk7Ci0JCQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uID0gaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJCQkJCS8vIGRvbid0IGNvbnNpZGVyIGFueSBhZHZpY2UgaGVyZSBhcyB3ZSB3YW50IHRvIGtub3cgYWJvdXQgdGhlIHJlYWwgZm9ybSBvbiBkaXNrCi0JCQkJCQlib29sZWFuIGlzRGlyID0gaXNEaXIoYmQsIGluZm8pOwotCQkJCQkJLy8gaWYgdGhlIGFydGlmYWN0IGlzIGEgZGlyIGFuZCB3ZSBhcmUgbm90IGRvaW5nICJBU19JUyIsIHppcCBpdCB1cC4KLQkJCQkJCWlmIChpc0RpciAmJiAhKChpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpICYgSVB1Ymxpc2hlckluZm8uQV9BU19JUykgPiAwKSkKLQkJCQkJCQlwdWJsaXNoQXJ0aWZhY3QoYWQsIG5ldyBGaWxlKGJkLmdldExvY2F0aW9uKCkpLCBuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKS5saXN0RmlsZXMoKSwgaW5mbywgSU5DTFVERV9ST09UKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwdWJsaXNoQXJ0aWZhY3QoYWQsIG5ldyBGaWxlKGJkLmdldExvY2F0aW9uKCkpLCBuZXcgRmlsZVtdIHtuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKX0sIGluZm8sIEFTX0lTIHwgSU5DTFVERV9ST09UKTsKLQkJCQkJCUlJbnN0YWxsYWJsZVVuaXQgYnVuZGxlSVUgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVJVShiZCwgYnVuZGxlTWFuaWZlc3QsIGlzRGlyLCBrZXkpOwotCi0JCQkJCQlpZiAoaXNGcmFnbWVudChiZCkpIHsKLQkJCQkJCQkvLyBUT0RPOiBDYW4gTkwgZnJhZ21lbnRzIGJlIG11bHRpLWhvc3Q/ICBXaGF0IHNwZWNpYWwgaGFuZGxpbmcKLQkJCQkJCQkvLwkJIGlzIHJlcXVpcmVkIGZvciBtdWx0aS1ob3N0IGZyYWdtZW50cyBpbiBnZW5lcmFsPwotCQkJCQkJCVN0cmluZyBob3N0SWQgPSBiZC5nZXRIb3N0KCkuZ2V0TmFtZSgpOwotCQkJCQkJCVN0cmluZyBob3N0S2V5ID0gbWFrZVNpbXBsZUtleShob3N0SWQpOwotCQkJCQkJCVN0cmluZ1tdIGNhY2hlZFZhbHVlcyA9IChTdHJpbmdbXSkgYnVuZGxlTG9jYWxpemF0aW9uTWFwLmdldChob3N0S2V5KTsKLQotCQkJCQkJCWlmIChjYWNoZWRWYWx1ZXMgIT0gbnVsbCkgewotCQkJCQkJCQlNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVIb3N0TG9jYWxpemF0aW9uRnJhZ21lbnQoYnVuZGxlSVUsIGJkLCBob3N0SWQsIGNhY2hlZFZhbHVlcywgbG9jYWxpemF0aW9uSVVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJlc3VsdC5hZGRJVShidW5kbGVJVSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJCQkJCXJlc3VsdC5hZGRJVXMobG9jYWxpemF0aW9uSVVzLCBJUHVibGlzaGVyUmVzdWx0Lk5PTl9ST09UKTsKLQkJCQkJCWxvY2FsaXphdGlvbklVcy5jbGVhcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCBvZiB0aGUgYWR2aWNlIGZvciB0aGUgYnVuZGxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvciB0byBkZWNvcmF0ZQotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGJ1bmRsZQotCSAqIEBwYXJhbSBpbmZvIHRoZSBwdWJsaXNoZXIgaW5mbyBzdXBwbHlpbmcgdGhlIGFkdmljZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0aWVzKEFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBGaWxlIGxvY2F0aW9uLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUNvbGxlY3Rpb24gYWR2aWNlID0gaW5mby5nZXRBZHZpY2UobnVsbCwgZmFsc2UsIG51bGwsIG51bGwsIElCdW5kbGVBZHZpY2UuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhZHZpY2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJQnVuZGxlQWR2aWNlIGVudHJ5ID0gKElCdW5kbGVBZHZpY2UpIGkubmV4dCgpOwotCQkJUHJvcGVydGllcyBwcm9wcyA9IGVudHJ5LmdldFByb3BlcnRpZXMobG9jYXRpb24pOwotCQkJaWYgKHByb3BzID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBwcm9wcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgai5uZXh0KCk7Ci0JCQkJZGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoa2V5LCBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcihCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJQ29sbGVjdGlvbiBhZHZpY2UgPSBpbmZvLmdldEFkdmljZShudWxsLCB0cnVlLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIGJ1bmRsZS5nZXRWZXJzaW9uKCksIElCdW5kbGVTaGFwZUFkdmljZS5jbGFzcyk7Ci0JCS8vIGlmIHRoZSBhZHZpY2UgaGFzIGEgc2hhcGUsIHVzZSBpdAotCQlpZiAoYWR2aWNlICE9IG51bGwgJiYgIWFkdmljZS5pc0VtcHR5KCkpIHsKLQkJCS8vIHdlIGtub3cgdGhlcmUgaXMgc29tZSBhZHZpY2UgYnV0IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHRha2UgdGhlIGZpcnN0LgotCQkJU3RyaW5nIHNoYXBlID0gKChJQnVuZGxlU2hhcGVBZHZpY2UpIGFkdmljZS5pdGVyYXRvcigpLm5leHQoKSkuZ2V0U2hhcGUoKTsKLQkJCWlmIChzaGFwZSAhPSBudWxsKQotCQkJCXJldHVybiBzaGFwZS5lcXVhbHMoSUJ1bmRsZVNoYXBlQWR2aWNlLkRJUik7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGdvIHdpdGggd2hhdGV2ZXIgd2UgZmlndXJlZCBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgb3IgdGhlIHNoYXBlIG9uIGRpc2sKLQkJTWFwIG1hbmlmZXN0ID0gKE1hcCkgYnVuZGxlLmdldFVzZXJPYmplY3QoKTsKLQkJU3RyaW5nIGZvcm1hdCA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuQlVORExFX1NIQVBFKTsKLQkJcmV0dXJuIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5ESVIuZXF1YWxzKGZvcm1hdCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVNpbXBsZUtleShCdW5kbGVEZXNjcmlwdGlvbiBiZCkgewotCQkvLyBUT0RPOiBjYW4ndCB1c2UgdGhlIGJ1bmRsZSB2ZXJzaW9uIGluIHRoZSBrZXkgZm9yIHRoZSBCdW5kbGVMb2NhbGl6YXRpb24KLQkJLy8JCSBwcm9wZXJ0eSBtYXAgc2luY2UgdGhlIGhvc3Qgc3BlY2lmaWNhdGlvbiBmb3IgYSBmcmFnbWVudCBoYXMgYQotCQkvLwkJIHZlcnNpb24gcmFuZ2UsIG5vdCBhIHZlcnNpb24uIEhlbmNlLCB0aGlzIG1lY2hhbmlzbSBmb3IgZmluZGluZwotCQkvLyAJCSBtYW5pZmVzdCBsb2NhbGl6YXRpb24gcHJvcGVydHkgZmlsZXMgbWF5IGJyZWFrIHVuZGVyIGNoYW5nZXMKLQkJLy8JCSB0byB0aGUgQnVuZGxlTG9jYWxpemF0aW9uIHByb3BlcnR5IG9mIGEgYnVuZGxlLgotCQlyZXR1cm4gbWFrZVNpbXBsZUtleShiZC5nZXRTeW1ib2xpY05hbWUoKSAvKiwgYmQuZ2V0VmVyc2lvbigpICovKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlU2ltcGxlS2V5KFN0cmluZyBpZCAvKiwgVmVyc2lvbiB2ZXJzaW9uICovKSB7Ci0JCXJldHVybiBpZDsgLy8gKyAnXycgKyB2ZXJzaW9uLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoQnVuZGxlRGVzY3JpcHRpb24gYmQpIHsKLQkJcmV0dXJuIChiZC5nZXRIb3N0KCkgIT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1bmRsZURlc2NyaXB0aW9uW10gZ2V0QnVuZGxlRGVzY3JpcHRpb25zKEZpbGVbXSBidW5kbGVMb2NhdGlvbnMpIHsKLQkJaWYgKGJ1bmRsZUxvY2F0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVEZXNjcmlwdGlvblswXTsKLQkJYm9vbGVhbiBhZGRTaW1wbGVDb25maWd1cmF0b3IgPSBmYWxzZTsKLQkJYm9vbGVhbiBzY0luID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlTG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWFkZFNpbXBsZUNvbmZpZ3VyYXRvcikKLQkJCQlhZGRTaW1wbGVDb25maWd1cmF0b3IgPSBidW5kbGVMb2NhdGlvbnNbaV0udG9TdHJpbmcoKS5pbmRleE9mKE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IpID4gMDsKLQkJCWlmICghc2NJbikgewotCQkJCXNjSW4gPSBidW5kbGVMb2NhdGlvbnNbaV0udG9TdHJpbmcoKS5pbmRleE9mKE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SKSA+IDA7Ci0JCQkJaWYgKHNjSW4pCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChzY0luKQotCQkJYWRkU2ltcGxlQ29uZmlndXJhdG9yID0gZmFsc2U7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gcmVzdWx0ID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW2J1bmRsZUxvY2F0aW9ucy5sZW5ndGggKyAoYWRkU2ltcGxlQ29uZmlndXJhdG9yID8gMSA6IDApXTsKLQkJQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRCdW5kbGVGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlTG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBmYWN0b3J5LmdldEJ1bmRsZURlc2NyaXB0aW9uKGJ1bmRsZUxvY2F0aW9uc1tpXSk7Ci0JCX0KLQkJaWYgKGFkZFNpbXBsZUNvbmZpZ3VyYXRvcikgewotCQkJLy8gQWRkIHNpbXBsZSBjb25maWd1cmF0b3IgdG8gdGhlIGxpc3Qgb2YgYnVuZGxlcwotCQkJdHJ5IHsKLQkJCQlVUkwgY29uZmlndXJhdG9yVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1IgKyAiLmphciIpKTsKLQkJCQlpZiAoY29uZmlndXJhdG9yVVJMID09IG51bGwpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGZpbmQgc2ltcGxlY29uZmlndXJhdG9yIGJ1bmRsZSIpOwotCQkJCWVsc2UgewotCQkJCQlGaWxlIGxvY2F0aW9uID0gbmV3IEZpbGUoY29uZmlndXJhdG9yVVJMLmdldEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24obG9jYXRpb24pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBnZXRCdW5kbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShzdGF0ZU9iamVjdEZhY3RvcnksIG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Db25maWdBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQ29uZmlnQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YTllYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Db25maWdBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkNvbmZpZ0RhdGE7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdBZHZpY2UgZXh0ZW5kcyBBYnN0cmFjdEFkdmljZSBpbXBsZW1lbnRzIElDb25maWdBZHZpY2UgewotCi0JcHJpdmF0ZSBDb25maWdEYXRhIGRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYzsKLQotCXB1YmxpYyBDb25maWdBZHZpY2UoQ29uZmlnRGF0YSBkYXRhLCBTdHJpbmcgY29uZmlnU3BlYykgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0QnVuZGxlcygpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0QnVuZGxlcygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnU3BlYygpIHsKLQkJcmV0dXJuIGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQlyZXN1bHQucHV0QWxsKGRhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpKTsKLQkJcmVzdWx0LnB1dEFsbChkYXRhLmdldEZ3SW5kZXBlbmRlbnRQcm9wcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQ29uZmlnQ1VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0NvbmZpZ0NVc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjVmNGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQ29uZmlnQ1VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUHVibGlzaCBDVXMgZm9yIGFsbCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGluIHRoZSBjdXJyZW50IHJlc3VsdC4KLSAqIFRoaXMgYWRkcyBjb25maWctc3BlY2lmaWMgQ1VzIHRvIGNhcHR1cmUgc3RhcnQgbGV2ZWxzIGV0YyBmb3VuZCBpbiB0aGUgY29uZmlnLmluaQotICogZXRjIGZvciBpcyBvcywgd3MsIGFyY2ggY29tYmluYXRpb24gc2VlbiBzbyBmYXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDVXNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVVBEQVRFX0NPTkZJR1VSQVRPUiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgZmxhdm9yOwotCi0JcHVibGljIENvbmZpZ0NVc0FjdGlvbihJUHVibGlzaGVySW5mbyBpbmZvLCBTdHJpbmcgZmxhdm9yLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJLy8gZ2VuZXJhdGlvbiBmcm9tIHJlbWVtYmVyZWQgY29uZmlnLmluaSdzCi0JCS8vIHdlIGhhdmUgTiBwbGF0Zm9ybXMsIGdlbmVyYXRlIGEgQ1UgZm9yIGVhY2gKLQkJLy8gVE9ETyB0cnkgYW5kIGZpbmQgY29tbW9uIHByb3BlcnRpZXMgYWNyb3NzIHBsYXRmb3JtcwotCQlTdHJpbmdbXSBjb25maWdTcGVjcyA9IGluZm8uZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTcGVjcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbmZpZ1NwZWMgPSBjb25maWdTcGVjc1tpXTsKLQkJCUNvbGxlY3Rpb24gY29uZmlnQWR2aWNlID0gaW5mby5nZXRBZHZpY2UoY29uZmlnU3BlYywgZmFsc2UsIG51bGwsIG51bGwsIElDb25maWdBZHZpY2UuY2xhc3MpOwotCQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBmaWxsSW5CdW5kbGVzKGNvbmZpZ0FkdmljZSwgcmVzdWx0cyk7Ci0JCQlnZW5lcmF0ZUJ1bmRsZUNvbmZpZ0lVcyhpbmZvLCBidW5kbGVzLCBjb25maWdTcGVjLCByZXN1bHRzKTsKLQotCQkJQ29sbGVjdGlvbiBsYXVuY2hpbmdBZHZpY2UgPSBpbmZvLmdldEFkdmljZShjb25maWdTcGVjLCBmYWxzZSwgbnVsbCwgbnVsbCwgSUxhdW5jaGluZ0FkdmljZS5jbGFzcyk7Ci0JCQlwdWJsaXNoSW5pSVVzKGNvbmZpZ0FkdmljZSwgbGF1bmNoaW5nQWR2aWNlLCByZXN1bHRzLCBjb25maWdTcGVjKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvLyB0aGVyZSBzZWVtIHRvIGJlIGNhc2VzIHdoZXJlIHRoZSBidW5kbGUgaW5mb3MgYXJlIG5vdCBmaWxsZWQgaW4gd2l0aCBzeW1ib2xpYyBuYW1lIGFuZCB2ZXJzaW9uLgotCS8vIGZpbGwgaW4gdGhlIG1pc3NpbmcgZGF0YS4KLQlwcml2YXRlIEJ1bmRsZUluZm9bXSBmaWxsSW5CdW5kbGVzKENvbGxlY3Rpb24gY29uZmlnQWR2aWNlLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBqID0gY29uZmlnQWR2aWNlLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJSUNvbmZpZ0FkdmljZSBhZHZpY2UgPSAoSUNvbmZpZ0FkdmljZSkgai5uZXh0KCk7Ci0JCQlCdW5kbGVJbmZvW10gYnVuZGxlcyA9IGFkdmljZS5nZXRCdW5kbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBidW5kbGVzW2ldOwotCQkJCS8vIHByaW1lIHRoZSByZXN1bHQgd2l0aCB0aGUgY3VycmVudCBpbmZvLiAgVGhpcyB3aWxsIGJlIHJlcGxhY2VkIGlmIHRoZXJlIGlzIG1vcmUgaW5mby4uLgotCQkJCWlmICgoYnVuZGxlSW5mby5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIGJ1bmRsZUluZm8uZ2V0VmVyc2lvbigpICE9IG51bGwpIHx8IGJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKSA9PSBudWxsKQotCQkJCQlyZXN1bHQuYWRkKGJ1bmRsZXNbaV0pOwotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKG5ldyBVUkwoYnVuZGxlSW5mby5nZXRMb2NhdGlvbigpKS5nZXRQYXRoKCkpOwotCQkJCQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5sb2FkTWFuaWZlc3QobG9jYXRpb24pOwotCQkJCQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlHZW5lcmF0b3JCdW5kbGVJbmZvIG5ld0luZm8gPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKLQkJCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnQgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoImR1bW15LWJzbiIsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQluZXdJbmZvLnNldFN5bWJvbGljTmFtZShlbGVtZW50WzBdLmdldFZhbHVlKCkpOwotCQkJCQkJbmV3SW5mby5zZXRWZXJzaW9uKChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsKLQkJCQkJCXJlc3VsdC5hZGQobmV3SW5mbyk7Ci0JCQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoQnVuZGxlSW5mb1tdKSByZXN1bHQudG9BcnJheShuZXcgQnVuZGxlSW5mb1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hJbmlJVXMoQ29sbGVjdGlvbiBjb25maWdBZHZpY2UsIENvbGxlY3Rpb24gbGF1bmNoaW5nQWR2aWNlLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMsIFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCWlmIChjb25maWdBZHZpY2UuaXNFbXB0eSgpICYmIGxhdW5jaGluZ0FkdmljZS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGNvbmZpZ3VyZURhdGEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5jb25maWd1cmVEYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIWNvbmZpZ0FkdmljZS5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGRhdGFTdHJpbmdzID0gZ2V0Q29uZmlndXJhdGlvblN0cmluZ3MoY29uZmlnQWR2aWNlKTsKLQkJCWNvbmZpZ3VyZURhdGEgKz0gZGF0YVN0cmluZ3NbMF07Ci0JCQl1bmNvbmZpZ3VyZURhdGEgKz0gZGF0YVN0cmluZ3NbMV07Ci0JCX0KLQotCQlpZiAoIWxhdW5jaGluZ0FkdmljZS5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGRhdGFTdHJpbmdzID0gZ2V0TGF1bmNoZXJDb25maWdTdHJpbmdzKGxhdW5jaGluZ0FkdmljZSk7Ci0JCQljb25maWd1cmVEYXRhICs9IGRhdGFTdHJpbmdzWzBdOwotCQkJdW5jb25maWd1cmVEYXRhICs9IGRhdGFTdHJpbmdzWzFdOwotCQl9Ci0KLQkJLy8gaWYgdGhlcmUgaXMgbm90aGluZyB0byBjb25maWd1cmUgb3IgdW5jb25maWd1cmUsIHRoZW4gZG9uJ3QgZXZlbiBib3RoZXIgZ2VuZXJhdGluZyB0aGlzIElVCi0JCWlmIChjb25maWd1cmVEYXRhLmxlbmd0aCgpID09IDAgJiYgdW5jb25maWd1cmVEYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJjb25maWd1cmUiLCBjb25maWd1cmVEYXRhKTsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuY29uZmlndXJlIiwgdW5jb25maWd1cmVEYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlJSW5zdGFsbGFibGVVbml0IGN1ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlSVVGcmFnbWVudChpZCwgdmVyc2lvbiwgZmxhdm9yLCBjb25maWdTcGVjLCB0b3VjaHBvaW50RGF0YSk7Ci0JCXJlc3VsdHMuYWRkSVUoY3UsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25TdHJpbmdzKENvbGxlY3Rpb24gY29uZmlnQWR2aWNlKSB7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bmNvbmZpZ3VyYXRpb25EYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpID0gY29uZmlnQWR2aWNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUNvbmZpZ0FkdmljZSBhZHZpY2UgPSAoSUNvbmZpZ0FkdmljZSkgaS5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWR2aWNlLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFbnRyeSBhUHJvcGVydHkgPSAoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gKChTdHJpbmcpIGFQcm9wZXJ0eS5nZXRLZXkoKSk7Ci0JCQkJaWYgKGtleS5lcXVhbHMoIm9zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoIikgfHwga2V5LmVxdWFscygib3NnaS5mcmFtZXdvcmsiKSB8fCBrZXkuZXF1YWxzKCJvc2dpLmJ1bmRsZXMiKSB8fCBrZXkuZXF1YWxzKCJlb2YiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQljb250aW51ZTsKLQkJCQljb25maWd1cmF0aW9uRGF0YSArPSAic2V0UHJvZ3JhbVByb3BlcnR5KHByb3BOYW1lOiIgKyBrZXkgKyAiLCBwcm9wVmFsdWU6IiArICgoU3RyaW5nKSBhUHJvcGVydHkuZ2V0VmFsdWUoKSkgKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXVuY29uZmlndXJhdGlvbkRhdGEgKz0gInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZToiICsga2V5ICsgIiwgcHJvcFZhbHVlOik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Y29uZmlndXJhdGlvbkRhdGEsIHVuY29uZmlndXJhdGlvbkRhdGF9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRMYXVuY2hlckNvbmZpZ1N0cmluZ3MoQ29sbGVjdGlvbiBsYXVuY2hpbmdBZHZpY2UpIHsKLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuY29uZmlndXJhdGlvbkRhdGEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaiA9IGxhdW5jaGluZ0FkdmljZS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCUlMYXVuY2hpbmdBZHZpY2UgYWR2aWNlID0gKElMYXVuY2hpbmdBZHZpY2UpIGoubmV4dCgpOwotCQkJU3RyaW5nW10ganZtQXJncyA9IGFkdmljZS5nZXRWTUFyZ3VtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqdm1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gImFkZEp2bUFyZyhqdm1Bcmc6IiArIGp2bUFyZ3NbaV0gKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJyZW1vdmVKdm1BcmcoanZtQXJnOiIgKyBqdm1BcmdzW2ldICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlTdHJpbmdbXSBwcm9ncmFtQXJncyA9IGFkdmljZS5nZXRQcm9ncmFtQXJndW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2dyYW1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHByb2dyYW1BcmcgPSBwcm9ncmFtQXJnc1tpXTsKLQkJCQlpZiAocHJvZ3JhbUFyZy5lcXVhbHMoIi0tbGF1bmNoZXIubGlicmFyeSIpIHx8IHByb2dyYW1BcmcuZXF1YWxzKCItc3RhcnR1cCIpIHx8IHByb2dyYW1BcmcuZXF1YWxzKCItY29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlpKys7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gImFkZFByb2dyYW1BcmcocHJvZ3JhbUFyZzoiICsgcHJvZ3JhbUFyZyArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXVuY29uZmlndXJhdGlvbkRhdGEgKz0gInJlbW92ZVByb2dyYW1BcmcocHJvZ3JhbUFyZzoiICsgcHJvZ3JhbUFyZyArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nW10ge2NvbmZpZ3VyYXRpb25EYXRhLCB1bmNvbmZpZ3VyYXRpb25EYXRhfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJ1bmRsZUNvbmZpZ0lVcyhJUHVibGlzaGVySW5mbyBpbmZvLCBCdW5kbGVJbmZvW10gYnVuZGxlcywgU3RyaW5nIGNvbmZpZ1NwZWMsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGN1SWRQcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlsdGVyID0gbnVsbDsKLQkJaWYgKGNvbmZpZ1NwZWMgIT0gbnVsbCkgewotCQkJY3VJZFByZWZpeCA9IGNyZWF0ZUlkU3RyaW5nKGNvbmZpZ1NwZWMpOwotCQkJZmlsdGVyID0gY3JlYXRlRmlsdGVyU3BlYyhjb25maWdTcGVjKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJR2VuZXJhdG9yQnVuZGxlSW5mbyBidW5kbGUgPSBjcmVhdGVHZW5lcmF0b3JCdW5kbGVJbmZvKGluZm8sIGJ1bmRsZXNbaV0sIHJlc3VsdCk7Ci0JCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IpKSB7Ci0JCQkJYnVuZGxlLnNldFN0YXJ0TGV2ZWwoQnVuZGxlSW5mby5OT19MRVZFTCk7Ci0JCQkJYnVuZGxlLnNldE1hcmtlZEFzU3RhcnRlZChmYWxzZSk7Ci0JCQkJYnVuZGxlLnNldFNwZWNpYWxDb25maWdDb21tYW5kcygic2V0UHJvZ3JhbVByb3BlcnR5KHByb3BOYW1lOm9yZy5lY2xpcHNlLnVwZGF0ZS5yZWNvbmNpbGUsIHByb3BWYWx1ZTpmYWxzZSk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidW5kbGUuc2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZTpvcmcuZWNsaXBzZS51cGRhdGUucmVjb25jaWxlLCBwcm9wVmFsdWU6KTsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChidW5kbGUuZ2V0U3RhcnRMZXZlbCgpID09IEJ1bmRsZUluZm8uTk9fTEVWRUwgJiYgIWJ1bmRsZS5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQkJLy8gdGhpcyBidW5kbGUgZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFydGljdWxhciBjb25maWd1cmF0aW9uLCB0aGUgcGx1Zy1pbiBkZWZhdWx0IElVIHdpbGwgaGFuZGxlIGluc3RhbGxpbmcgaXQKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSUluc3RhbGxhYmxlVW5pdCBjdSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUNvbmZpZ3VyYXRpb25Vbml0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgbmV3IFZlcnNpb24oYnVuZGxlLmdldFZlcnNpb24oKSksIGZhbHNlLCBidW5kbGUsIGZsYXZvciArIGN1SWRQcmVmaXgsIGZpbHRlcik7Ci0JCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCS8vIFByb2R1Y3QgUXVlcnkgd2lsbCBydW4gYWdhaW5zdCB0aGUgcmVwbywgbWFrZSBzdXJlIHRoZXNlIENVcyBhcmUgaW4gYmVmb3JlIHRoZW4KLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeSA9IGluZm8uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKG1ldGFkYXRhUmVwb3NpdG9yeSAhPSBudWxsKSB7Ci0JCQkJCW1ldGFkYXRhUmVwb3NpdG9yeS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2N1fSk7Ci0JCQkJfQotCQkJCXJlc3VsdC5hZGRJVShjdSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBHZW5lcmF0b3JCdW5kbGVJbmZvIGNyZWF0ZUdlbmVyYXRvckJ1bmRsZUluZm8oSVB1Ymxpc2hlckluZm8gaW5mbywgQnVuZGxlSW5mbyBidW5kbGVJbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQlpZiAoYnVuZGxlSW5mby5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBidW5kbGVJbmZvLmdldFN5bWJvbGljTmFtZSgpOwotCi0JCS8vZWFzeSBjYXNlOiBkbyB3ZSBoYXZlIGEgbWF0Y2hpbmcgSVU/Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSByZXN1bHQuZ2V0SVUobmFtZSwgbnVsbCk7Ci0JCWlmIChpdSAhPSBudWxsKSB7Ci0JCQlidW5kbGVJbmZvLnNldFZlcnNpb24oaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKGJ1bmRsZUluZm8pOwotCQl9Ci0KLQkJLy9oYXJkZXI6IHRyeSBpZF92ZXJzaW9uCi0JCWludCBpID0gbmFtZS5pbmRleE9mKCdfJyk7Ci0JCXdoaWxlIChpID4gLTEpIHsKLQkJCVZlcnNpb24gdmVyc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbihuYW1lLnN1YnN0cmluZyhpKSk7Ci0JCQkJYnVuZGxlSW5mby5zZXRTeW1ib2xpY05hbWUobmFtZS5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWJ1bmRsZUluZm8uc2V0VmVyc2lvbih2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdGhlICdfJyBmb3VuZCB3YXMgcHJvYmFibHkgcGFydCBvZiB0aGUgc3ltYm9saWMgaWQKLQkJCQlpID0gbmFtZS5pbmRleE9mKCdfJywgaSk7Ci0JCQl9Ci0JCX0KLQotCQkvL1F1ZXJ5IHRoZSByZXBvCi0JCVF1ZXJ5IHF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KG5hbWUpOwotCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQlJdGVyYXRvciBtYXRjaGVzID0gaW5mby5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoKS5xdWVyeShxdWVyeSwgY29sbGVjdG9yLCBudWxsKS5pdGVyYXRvcigpOwotCQkvL3BpY2sgdGhlIG5ld2VzdCBtYXRjaAotCQlJSW5zdGFsbGFibGVVbml0IG5ld2VzdCA9IG51bGw7Ci0JCXdoaWxlIChtYXRjaGVzLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgbWF0Y2hlcy5uZXh0KCk7Ci0JCQlpZiAobmV3ZXN0ID09IG51bGwgfHwgKG5ld2VzdC5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkpIDwgMCkpCi0JCQkJbmV3ZXN0ID0gY2FuZGlkYXRlOwotCQl9Ci0JCWlmIChuZXdlc3QgIT0gbnVsbCkgewotCQkJYnVuZGxlSW5mby5zZXRWZXJzaW9uKG5ld2VzdC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRGF0YUxvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9EYXRhTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2Q4Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9EYXRhTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LkVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotcHVibGljIGNsYXNzIERhdGFMb2FkZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTFRFUl9PQkpFQ1RDTEFTUyA9ICIoIiArIENvbnN0YW50cy5PQkpFQ1RDTEFTUyArICI9IiArIEZyYW1ld29ya0FkbWluLmNsYXNzLmdldE5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyRndOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9GV19OQU1FICsgIj1FcXVpbm94KSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vU3RyaW5nIGZpbHRlckZ3VmVyc2lvbiA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfVkVSU0lPTiArICI9IiArIHByb3BzLmdldFByb3BlcnR5KCJlcXVpbm94LmZ3LnZlcnNpb24iKSArICIpIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyTGF1bmNoZXJOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9OQU1FICsgIj1FY2xpcHNlLmV4ZSkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvL1N0cmluZyBmaWx0ZXJMYXVuY2hlclZlcnNpb24gPSAiKCIgKyBGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX1ZFUlNJT04gKyAiPSIgKyBwcm9wcy5nZXRQcm9wZXJ0eSgiZXF1aW5veC5sYXVuY2hlci52ZXJzaW9uIikgKyAiKSI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZyYW1ld29ya0FkbWluRmlsbHRlciA9ICIoJiIgKyBGSUxURVJfT0JKRUNUQ0xBU1MgKyBmaWx0ZXJGd05hbWUgKyBmaWx0ZXJMYXVuY2hlck5hbWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9FUVVJTk9YX0ZSQU1FV09SS0FETUlOX0VRVUlOT1ggPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYW5pcHVsYXRvciBtYW5pcHVsYXRvcjsKLQlwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkxvY2F0aW9uOwotCi0JcHVibGljIERhdGFMb2FkZXIoRmlsZSBjb25maWd1cmF0aW9uTG9jYXRpb24sIEZpbGUgZXhlY3V0YWJsZUxvY2F0aW9uKSB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbkxvY2F0aW9uID0gY29uZmlndXJhdGlvbkxvY2F0aW9uOwotCQlpbml0aWFsaXplRnJhbWV3b3JrTWFuaXB1bGF0b3IoY29uZmlndXJhdGlvbkxvY2F0aW9uLmdldFBhcmVudEZpbGUoKSwgZXhlY3V0YWJsZUxvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZyYW1ld29ya01hbmlwdWxhdG9yKEZpbGUgY29uZmlnLCBGaWxlIGV4ZWN1dGFibGUpIHsKLQkJZ2V0RnJhbWV3b3JrTWFuaXB1bGF0b3IoKTsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oY29uZmlnLCB0cnVlKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKGV4ZWN1dGFibGUpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gZTIpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29uZmlnRGF0YSBnZXRDb25maWdEYXRhKCkgewotCQlpZiAobWFuaXB1bGF0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVhZEZ3Q29uZmlnKG1hbmlwdWxhdG9yLCBjb25maWd1cmF0aW9uTG9jYXRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaGVyRGF0YSBnZXRMYXVuY2hlckRhdGEoKSB7Ci0JCXJldHVybiBtYW5pcHVsYXRvciA9PSBudWxsID8gbnVsbCA6IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIE9idGFpbnMgdGhlIGZyYW1ld29yayBtYW5pcHVsYXRvciBpbnN0YW5jZS4gVGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqIGlmIGl0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpIHsKLQkJRnJhbWV3b3JrQWRtaW4gYWRtaW4gPSBnZXRGcmFtZXdvcmtBZG1pbigpOwotCQlpZiAoYWRtaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGcmFtZXdvcmsgYWRtaW4gc2VydmljZSBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pcHVsYXRvciA9IGFkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0JCWlmIChtYW5pcHVsYXRvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZyYW1ld29yayBtYW5pcHVsYXRvciBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgRnJhbWV3b3JrQWRtaW4gZ2V0RnJhbWV3b3JrQWRtaW4oKSB7Ci0JCUZyYW1ld29ya0FkbWluIGZyYW1ld29ya0FkbWluID0gKEZyYW1ld29ya0FkbWluKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRnJhbWV3b3JrQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBmcmFtZXdvcmtBZG1pbkZpbGx0ZXIpOwotCQlpZiAoZnJhbWV3b3JrQWRtaW4gPT0gbnVsbCkgewotCQkJc3RhcnRCdW5kbGUoT1JHX0VDTElQU0VfRVFVSU5PWF9GUkFNRVdPUktBRE1JTl9FUVVJTk9YKTsKLQkJCXN0YXJ0QnVuZGxlKE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SKTsKLQkJCWZyYW1ld29ya0FkbWluID0gKEZyYW1ld29ya0FkbWluKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRnJhbWV3b3JrQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBmcmFtZXdvcmtBZG1pbkZpbGx0ZXIpOwotCQl9Ci0JCXJldHVybiBmcmFtZXdvcmtBZG1pbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRCdW5kbGUoU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCVBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwYWNrYWdlQWRtaW4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlCdW5kbGVbXSBidW5kbGVzID0gcGFja2FnZUFkbWluLmdldEJ1bmRsZXMoYnVuZGxlSWQsIG51bGwpOwotCQlpZiAoYnVuZGxlcyAhPSBudWxsICYmIGJ1bmRsZXMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKChidW5kbGVzWzBdLmdldFN0YXRlKCkgJiBCdW5kbGUuUkVTT0xWRUQpID4gMCkgewotCQkJCQkJYnVuZGxlc1swXS5zdGFydCgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBmYWlsZWQsIHRyeSBuZXh0IGJ1bmRsZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9EZWZhdWx0Q1VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0RlZmF1bHRDVXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5OTY1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0RlZmF1bHRDVXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLQotLyoqCi0gKiBQdWJsaXNoIElVcyB0aGF0IGluc3RhbGwvY29uZmlndXJlIHRoZSBzdGFuZGFyZCB0aGluZ3MgbGlrZSBidW5kbGVzLCBmZWF0dXJlcyBhbmQgc291cmNlIGJ1bmRsZXMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDVXNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCXByaXZhdGUgaW50IHN0YXJ0TGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0OwotCi0JcHVibGljIERlZmF1bHRDVXNBY3Rpb24oSVB1Ymxpc2hlckluZm8gaW5mbywgU3RyaW5nIGZsYXZvciwgaW50IHN0YXJ0TGV2ZWwsIGJvb2xlYW4gc3RhcnQpIHsKLQkJdGhpcy5mbGF2b3IgPSBmbGF2b3I7Ci0JCXRoaXMuc3RhcnRMZXZlbCA9IHN0YXJ0TGV2ZWw7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlnZW5lcmF0ZURlZmF1bHRDb25maWdJVShyZXN1bHRzKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVEZWZhdWx0Q29uZmlnSVUoSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJLy8JCVRPRE8gdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suICBXZSBuZWVkIHRvIGhhdmUgdGhlIGRlZmF1bHQgSVUgZnJhZ21lbnQgZ2VuZXJhdGVkIHdpdGggY29kZSB0aGF0IGNvbmZpZ3VyZXMKLQkJLy8JCWFuZCB1bmNvbmZpZ3VyZXMuICBUaGUgR2VuZXJhdG9yIHNob3VsZCBiZSBkZWNvdXBsZWQgZnJvbSBhbnkgcGFydGljdWxhciBwcm92aWRlciBidXQgaXQgaXMgbm90IGNsZWFyCi0JCS8vCQl0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGNyZWF0ZSogbWV0aG9kcyB0byBJR2VuZXJhdG9ySW5mby4uLgotCQkvLwkJTW9ja0J1bmRsZURlc2NyaXB0aW9uIGJkMSA9IG5ldyBNb2NrQnVuZGxlRGVzY3JpcHRpb24oImRlZmF1bHRDb25maWd1cmUiKTsKLQkJLy8JCU1vY2tCdW5kbGVEZXNjcmlwdGlvbiBiZDIgPSBuZXcgTW9ja0J1bmRsZURlc2NyaXB0aW9uKCJkZWZhdWx0VW5jb25maWd1cmUiKTsKLQkJcmVzdWx0LmFkZElVKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZURlZmF1bHRCdW5kbGVDb25maWd1cmF0aW9uVW5pdChjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSwgY3JlYXRlRGVmYXVsdFVuY29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSwgZmxhdm9yKSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJcmVzdWx0LmFkZElVKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZURlZmF1bHRGZWF0dXJlQ29uZmlndXJhdGlvblVuaXQoZmxhdm9yKSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJcmVzdWx0LmFkZElVKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uVW5pdEZvclNvdXJjZUJ1bmRsZXMoZmxhdm9yKSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVuZGxlSW5mbyBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSB7Ci0JCUdlbmVyYXRvckJ1bmRsZUluZm8gcmVzdWx0ID0gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oKTsKLQkJcmVzdWx0LnNldFN5bWJvbGljTmFtZSgiZGVmYXVsdENvbmZpZ3VyZSIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRWZXJzaW9uKCIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwpOwotCQlyZXN1bHQuc2V0TWFya2VkQXNTdGFydGVkKHN0YXJ0KTsKLQkJLy8gVGhlc2Ugc2hvdWxkIGp1c3QgYmUgaW4gdGhlIGluc3RhbGwgc2VjdGlvbiBub3cKLQkJLy8JCXJlc3VsdC5zZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoImluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KTsiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVuZGxlSW5mbyBjcmVhdGVEZWZhdWx0VW5jb25maWd1cmF0aW9uQnVuZGxlSW5mbygpIHsKLQkJR2VuZXJhdG9yQnVuZGxlSW5mbyByZXN1bHQgPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbygpOwotCQlyZXN1bHQuc2V0U3ltYm9saWNOYW1lKCJkZWZhdWx0VW5jb25maWd1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0VmVyc2lvbigiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUaGVzZSBzaG91bGQganVzdCBiZSBpbiB0aGUgdW5pbnN0YWxsIHNlY3Rpb24gbm93Ci0JCS8vCQlyZXN1bHQuc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCJ1bmluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KTsiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRWNsaXBzZUluc3RhbGxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRWNsaXBzZUluc3RhbGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxMGVkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0VjbGlwc2VJbnN0YWxsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VJbnN0YWxsQWN0aW9uIGltcGxlbWVudHMgSVB1Ymxpc2hpbmdBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZsYXZvcjsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gdG9wTGV2ZWw7Ci0JcHJvdGVjdGVkIElQdWJsaXNoZXJJbmZvIGluZm87Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIG5vblJvb3RGaWxlczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VJbnN0YWxsQWN0aW9uKCkgewotCX0KLQotCXB1YmxpYyBFY2xpcHNlSW5zdGFsbEFjdGlvbihTdHJpbmcgc291cmNlLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZsYXZvciwgU3RyaW5nW10gdG9wTGV2ZWwsIFN0cmluZ1tdIG5vblJvb3RGaWxlcywgYm9vbGVhbiBzdGFydCkgewotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLm5hbWUgPSBuYW1lID09IG51bGwgPyBpZCA6IG5hbWU7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCQl0aGlzLnRvcExldmVsID0gdG9wTGV2ZWw7Ci0JCXRoaXMubm9uUm9vdEZpbGVzID0gbm9uUm9vdEZpbGVzOwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJSVB1Ymxpc2hpbmdBY3Rpb25bXSBhY3Rpb25zID0gY3JlYXRlQWN0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlhY3Rpb25zW2ldLnBlcmZvcm0oaW5mbywgcmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbltdIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWNyZWF0ZUFkdmljZSgpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjcmVhdGUgYW4gYWN0aW9uIHRoYXQganVzdCBwdWJsaXNoZXMgdGhlIHJhdyBidW5kbGVzIGFuZCBmZWF0dXJlcwotCQlJUHVibGlzaGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgTWVyZ2VSZXN1bHRzQWN0aW9uKG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHtjcmVhdGVGZWF0dXJlc0FjdGlvbigpLCBjcmVhdGVCdW5kbGVzQWN0aW9uKCl9LCBJUHVibGlzaGVyUmVzdWx0Lk1FUkdFX0FMTF9OT05fUk9PVCk7Ci0JCXJlc3VsdC5hZGQoYWN0aW9uKTsKLQkJcmVzdWx0LmFkZEFsbChjcmVhdGVFeGVjdXRhYmxlc0FjdGlvbnMoaW5mby5nZXRDb25maWd1cmF0aW9ucygpKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlUm9vdEZpbGVzQWN0aW9uKCkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZUVxdWlub3hMYXVuY2hlckZyYWdtZW50c0FjdGlvbigpKTsKLQkJcmVzdWx0LmFkZEFsbChjcmVhdGVBY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbnMoaW5mby5nZXRDb25maWd1cmF0aW9ucygpKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlSlJFQWN0aW9uKCkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZUNvbmZpZ0NVc0FjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVEZWZhdWx0Q1VzQWN0aW9uKCkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZVJvb3RJVUFjdGlvbigpKTsKLQkJcmV0dXJuIChJUHVibGlzaGluZ0FjdGlvbltdKSByZXN1bHQudG9BcnJheShuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBZHZpY2UoKSB7Ci0JCWNyZWF0ZVJvb3RGaWxlc0FkdmljZSgpOwotCQljcmVhdGVSb290QWR2aWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdEFkdmljZSgpIHsKLQkJaW5mby5hZGRBZHZpY2UobmV3IFJvb3RJVUFkdmljZShnZXRUb3BMZXZlbCgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZURlZmF1bHRDVXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdENVc0FjdGlvbihpbmZvLCBmbGF2b3IsIDQsIHN0YXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb24gY3JlYXRlUm9vdElVQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJvb3RJVUFjdGlvbihpZCwgdmVyc2lvbiwgbmFtZSwgaW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0VG9wTGV2ZWwoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRvcExldmVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb24gY3JlYXRlSlJFQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpSRUFjdGlvbihpbmZvLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb24gY3JlYXRlRXF1aW5veExhdW5jaGVyRnJhZ21lbnRzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVxdWlub3hMYXVuY2hlckNVQWN0aW9uKGZsYXZvcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlQWNjdW11bGF0ZUNvbmZpZ0RhdGFBY3Rpb25zKFN0cmluZ1tdIGNvbmZpZ3MpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZ3MubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29uZmlnU3BlYyA9IGNvbmZpZ3NbaV07Ci0JCQlGaWxlIGNvbmZpZ3VyYXRpb24gPSBjb21wdXRlQ29uZmlndXJhdGlvbkxvY2F0aW9uKGNvbmZpZ1NwZWMpOwotCQkJU3RyaW5nIG9zID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLnBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKVsxXTsKLQkJCUZpbGUgZXhlY3V0YWJsZSA9IEV4ZWN1dGFibGVzRGVzY3JpcHRvci5maW5kRXhlY3V0YWJsZShvcywgY29tcHV0ZUV4ZWN1dGFibGVMb2NhdGlvbihjb25maWdTcGVjKSwgImVjbGlwc2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJSVB1Ymxpc2hpbmdBY3Rpb24gYWN0aW9uID0gbmV3IEFjY3VtdWxhdGVDb25maWdEYXRhQWN0aW9uKGluZm8sIGNvbmZpZ1NwZWMsIGNvbmZpZ3VyYXRpb24sIGV4ZWN1dGFibGUpOwotCQkJcmVzdWx0LmFkZChhY3Rpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUNvbmZpZ0NVc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWdDVXNBY3Rpb24oaW5mbywgZmxhdm9yLCBpZCwgdmVyc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUZlYXR1cmVzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVzQWN0aW9uKG5ldyBGaWxlW10ge25ldyBGaWxlKHNvdXJjZSwgImZlYXR1cmVzIil9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUV4ZWN1dGFibGVzQWN0aW9ucyhTdHJpbmdbXSBjb25maWdTcGVjcykgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY29uZmlnU3BlY3MubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTcGVjcy5sZW5ndGg7IGkrKykgewotCQkJRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGV4ZWN1dGFibGVzID0gY29tcHV0ZUV4ZWN1dGFibGVzKGNvbmZpZ1NwZWNzW2ldKTsKLQkJCUlQdWJsaXNoaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBFcXVpbm94RXhlY3V0YWJsZUFjdGlvbihleGVjdXRhYmxlcywgY29uZmlnU3BlY3NbaV0sIGlkLCB2ZXJzaW9uLCBmbGF2b3IpOwotCQkJcmVzdWx0LmFkZChhY3Rpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZVJvb3RGaWxlc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSb290RmlsZXNBY3Rpb24oaW5mbywgaWQsIHZlcnNpb24sIGZsYXZvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdEZpbGVzQWR2aWNlKCkgewotCQlGaWxlW10gYmFzZUV4Y2x1c2lvbnMgPSBjb21wdXRlUm9vdEZpbGVFeGNsdXNpb25zKCk7Ci0JCWlmIChiYXNlRXhjbHVzaW9ucyAhPSBudWxsKQotCQkJaW5mby5hZGRBZHZpY2UobmV3IFJvb3RGaWxlc0FkdmljZShudWxsLCBudWxsLCBiYXNlRXhjbHVzaW9ucywgbnVsbCkpOwotCQlTdHJpbmdbXSBjb25maWdzID0gaW5mby5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspCi0JCQlpbmZvLmFkZEFkdmljZShjb21wdXRlUm9vdEZpbGVBZHZpY2UoY29uZmlnc1tpXSkpOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FkdmljZSBjb21wdXRlUm9vdEZpbGVBZHZpY2UoU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJRmlsZSByb290ID0gY29tcHV0ZVJvb3RGaWxlUm9vdChjb25maWdTcGVjKTsKLQkJRmlsZVtdIGluY2x1c2lvbnMgPSBjb21wdXRlUm9vdEZpbGVJbmNsdXNpb25zKGNvbmZpZ1NwZWMpOwotCQlGaWxlW10gZXhjbHVzaW9ucyA9IGNvbXB1dGVSb290RmlsZUV4Y2x1c2lvbnMoY29uZmlnU3BlYyk7Ci0JCXJldHVybiBuZXcgUm9vdEZpbGVzQWR2aWNlKHJvb3QsIGluY2x1c2lvbnMsIGV4Y2x1c2lvbnMsIGNvbmZpZ1NwZWMpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlW10gY29tcHV0ZVJvb3RGaWxlRXhjbHVzaW9ucyhTdHJpbmcgY29uZmlnU3BlYykgewotCQlyZXR1cm4gY29tcHV0ZUV4ZWN1dGFibGVzKGNvbmZpZ1NwZWMpLmdldEZpbGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVbXSBjb21wdXRlUm9vdEZpbGVFeGNsdXNpb25zKCkgewotCQlpZiAobm9uUm9vdEZpbGVzID09IG51bGwgfHwgbm9uUm9vdEZpbGVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUm9vdEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBub25Sb290RmlsZXNbaV07Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0JCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpCi0JCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQuYWRkKG5ldyBGaWxlKHNvdXJjZSwgZmlsZW5hbWUpKTsKLQkJfQotCQlyZXR1cm4gKEZpbGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IEZpbGVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY29tcHV0ZUV4ZWN1dGFibGVzKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCVN0cmluZyBvcyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYylbMV07Ci0JCXJldHVybiBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IuY3JlYXRlRGVzY3JpcHRvcihvcywgImVjbGlwc2UiLCBjb21wdXRlRXhlY3V0YWJsZUxvY2F0aW9uKGNvbmZpZ1NwZWMpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBGaWxlIGNvbXB1dGVSb290RmlsZVJvb3QoU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVbXSBjb21wdXRlUm9vdEZpbGVJbmNsdXNpb25zKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXJldHVybiBuZXcgRmlsZVtdIHtuZXcgRmlsZShzb3VyY2UpfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjb21wdXRlRXhlY3V0YWJsZUxvY2F0aW9uKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXJldHVybiBuZXcgRmlsZShzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGNvbXB1dGVDb25maWd1cmF0aW9uTG9jYXRpb24oU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKHNvdXJjZSwgImNvbmZpZ3VyYXRpb24vY29uZmlnLmluaSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUJ1bmRsZXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQnVuZGxlc0FjdGlvbihuZXcgRmlsZVtdIHtuZXcgRmlsZShzb3VyY2UsICJwbHVnaW5zIil9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FcXVpbm94RXhlY3V0YWJsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FcXVpbm94RXhlY3V0YWJsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhMjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94RXhlY3V0YWJsZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1NwZWM7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZEJhc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uU3BlYyA9ICIxLjAuMCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGV4ZWN1dGFibGVzOwotCXByb3RlY3RlZCBTdHJpbmcgZmxhdm9yOwotCi0JcHJvdGVjdGVkIEVxdWlub3hFeGVjdXRhYmxlQWN0aW9uKCkgewotCX0KLQotCXB1YmxpYyBFcXVpbm94RXhlY3V0YWJsZUFjdGlvbihFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZXhlY3V0YWJsZXMsIFN0cmluZyBjb25maWdTcGVjLCBTdHJpbmcgaWRCYXNlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIGZsYXZvcikgewotCQl0aGlzLmV4ZWN1dGFibGVzID0gZXhlY3V0YWJsZXM7Ci0JCXRoaXMuY29uZmlnU3BlYyA9IGNvbmZpZ1NwZWM7Ci0JCXRoaXMuaWRCYXNlID0gaWRCYXNlID09IG51bGwgPyAib3JnLmVjbGlwc2UiIDogaWRCYXNlOyAvLyROT04tTkxTLTEkCi0JCS8vIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzIG5vdCB0aGUgZGVmYXVsdCAicmVwbGFjZSBtZSIgdmVyc2lvbiB0aGVuIHNhdmUgaXQKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCAmJiAhdmVyc2lvbi5lcXVhbHMoIjAuMC4wIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMudmVyc2lvblNwZWMgPSB2ZXJzaW9uOwotCQl0aGlzLmZsYXZvciA9IGZsYXZvcjsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlnZW5lcmF0ZUV4ZWN1dGFibGVJVXMoaW5mbywgcmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBJVXMgYW5kIENVcyBmb3IgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgbGF1bmNoZXIgZm9yIGEgZ2l2ZW4KLQkgKiB3cy9vcy9hcmNoIGNvbWJpbmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRXhlY3V0YWJsZUlVcyhJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQkvLyBDcmVhdGUgdGhlIElVIGZvciB0aGUgZXhlY3V0YWJsZQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0U2luZ2xldG9uKHRydWUpOwotCQlTdHJpbmcgaWRQcmVmaXggPSBpZEJhc2UgKyAiLmV4ZWN1dGFibGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleGVjdXRhYmxlSWQgPSBpZFByZWZpeCArICcuJyArIGNyZWF0ZUlkU3RyaW5nKGNvbmZpZ1NwZWMpOwotCQlpdS5zZXRJZChleGVjdXRhYmxlSWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3BlYyk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCVN0cmluZyBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXJTcGVjKGNvbmZpZ1NwZWMpOwotCQlpdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJSUFydGlmYWN0S2V5IGtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUxhdW5jaGVyQXJ0aWZhY3RLZXkoZXhlY3V0YWJsZUlkLCB2ZXJzaW9uKTsKLQkJaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5IGxhdW5jaGVyQ2FwYWJpbGl0eSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoZmxhdm9yICsgaWRCYXNlLCBpZFByZWZpeCwgdmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoZXhlY3V0YWJsZUlkLCB2ZXJzaW9uKSwgbGF1bmNoZXJDYXBhYmlsaXR5fSk7Ci0KLQkJLy8gc2V0dXAgYSByZXF1aXJlbWVudCBiZXR3ZWVuIHRoZSBleGVjdXRhYmxlIGFuZCB0aGUgbGF1bmNoZXIgZnJhZ21lbnQgdGhhdCBoYXMgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0JCVN0cmluZ1tdIGNvbmZpZyA9IHBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKLQkJU3RyaW5nIHdzID0gY29uZmlnWzBdOwotCQlTdHJpbmcgb3MgPSBjb25maWdbMV07Ci0JCVN0cmluZyBhcmNoID0gY29uZmlnWzJdOwotCQlTdHJpbmcgbGF1bmNoZXJGcmFnbWVudCA9IEVxdWlub3hMYXVuY2hlckNVQWN0aW9uLk9SR19FQ0xJUFNFX0VRVUlOT1hfTEFVTkNIRVIgKyAnLicgKyB3cyArICcuJyArIG9zOwotCQlpZiAoIUNvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSkKLQkJCWxhdW5jaGVyRnJhZ21lbnQgKz0gJy4nICsgYXJjaDsKLQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBsYXVuY2hlckZyYWdtZW50LCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgZmlsdGVyLCBmYWxzZSwgZmFsc2UpfSk7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQotCQkvLyBDcmVhdGUgdGhlIENVIHRoYXQgaW5zdGFsbHMvY29uZmlndXJlcyB0aGUgZXhlY3V0YWJsZQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGZsYXZvciArIGV4ZWN1dGFibGVJZDsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJY3Uuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJY3Uuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWN1LnNldEhvc3QobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBleGVjdXRhYmxlSWQsIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJLy9UT0RPIGJ1ZyAyMTg4OTAsIHdvdWxkIGxpa2UgdGhlIGZyYWdtZW50IHRvIHByb3ZpZGUgdGhlIGxhdW5jaGVyIGNhcGFiaWxpdHkgYXMgd2VsbCwgYnV0IGNhbid0IHJpZ2h0IG5vdy4KLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCB2ZXJzaW9uKX0pOwotCi0JCS8vIFRPRE8gdGVtcG9yYXJ5IG1lYXN1cmUgZm9yIGhhbmRsaW5nIHRoZSBFY2xpcHNlIGxhdW5jaGVyIGZlYXR1cmUgZmlsZXMuCi0JCUV4ZWN1dGFibGVzRGVzY3JpcHRvciBmaWxlcyA9IGJyYW5kRXhlY3V0YWJsZXMoZXhlY3V0YWJsZXMpOwotCi0JCWN1LnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gInVuemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCUZpbGVbXSBmaWxlTGlzdCA9IGZpbGVzLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IGZpbGVMaXN0W2ldOwotCQkJaWYgKENvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSkgewotCQkJCUZpbGUgbWFjT1NGb2xkZXIgPSBuZXcgRmlsZShmaWxlLCAiQ29udGVudHMvTWFjT1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtYWNPU0ZvbGRlci5leGlzdHMoKSkgewotCQkJCQlGaWxlW10gbGF1bmNoZXJGaWxlcyA9IG1hY09TRm9sZGVyLmxpc3RGaWxlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxhdW5jaGVyRmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICIgY2htb2QodGFyZ2V0RGlyOiR7aW5zdGFsbEZvbGRlcn0vIiArIGZpbGUuZ2V0TmFtZSgpICsgIi9Db250ZW50cy9NYWNPUy8sIHRhcmdldEZpbGU6IiArIGxhdW5jaGVyRmlsZXNbal0uZ2V0TmFtZSgpICsgIiwgcGVybWlzc2lvbnM6NzU1KTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJaWYgKG5ldyBQYXRoKGxhdW5jaGVyRmlsZXNbal0uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQkJCQlNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5nZW5lcmF0ZUxhdW5jaGVyU2V0dGVyKGxhdW5jaGVyRmlsZXNbal0uZ2V0TmFtZSgpLCBleGVjdXRhYmxlSWQsIHZlcnNpb24sIGNvbmZpZ1NwZWMsIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIUNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMob3MpICYmICFDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpIHsKLQkJCQljb25maWd1cmF0aW9uRGF0YSArPSAiIGNobW9kKHRhcmdldERpcjoke2luc3RhbGxGb2xkZXJ9LCB0YXJnZXRGaWxlOiIgKyBmaWxlLmdldE5hbWUoKSArICIsIHBlcm1pc3Npb25zOjc1NSk7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gaWYgdGhlIGZpbGUgaGFzIG5vIGV4dGVuc2lvbiB0aGVuIGl0IGlzIHRoZSBleGVjdXRhYmxlLiAgTm90IHRoZSBiZXN0IHJ1bGUgYnV0IG9rIGZvciBub3cKLQkJCQlpZiAobmV3IFBhdGgoZmlsZS5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJCQlNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5nZW5lcmF0ZUxhdW5jaGVyU2V0dGVyKGZpbGUuZ2V0TmFtZSgpLCBleGVjdXRhYmxlSWQsIHZlcnNpb24sIGNvbmZpZ1NwZWMsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bkNvbmZpZ3VyYXRpb25EYXRhID0gImNsZWFudXB6aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCB1bkNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSk7Ci0JCXJlc3VsdC5hZGRJVSh1bml0LCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCi0JCS8vQ3JlYXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yLiAgd2UgaGF2ZSBzZXZlcmFsIGZpbGVzIHNvIG5vIHBhdGggb24gZGlzawotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVBcnRpZmFjdERlc2NyaXB0b3Ioa2V5LCBudWxsKTsKLQkJcHVibGlzaEFydGlmYWN0KGRlc2NyaXB0b3IsIGZpbGVMaXN0LCBmaWxlcy5nZXRMb2NhdGlvbigpLCBpbmZvLCBJTkNMVURFX1JPT1QpOwotCQlpZiAoZmlsZXMuaXNUZW1wb3JhcnkoKSkKLQkJCUZpbGVVdGlscy5kZWxldGVBbGwoZmlsZXMuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBicmFuZEV4ZWN1dGFibGVzKEV4ZWN1dGFibGVzRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUV4ZWN1dGFibGVzRGVzY3JpcHRvciByZXN1bHQgPSBuZXcgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQlyZXN1bHQubWFrZVRlbXBvcmFyeUNvcHkoKTsKLQkJRmlsZVtdIGxpc3QgPSBkZXNjcmlwdG9yLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCW11bmdlTGF1bmNoZXJGaWxlTmFtZShsaXN0W2ldLCBkZXNjcmlwdG9yKTsKLQkJcmVzdWx0LnNldEV4ZWN1dGFibGVOYW1lKCJlY2xpcHNlIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAVE9ETyBUaGlzIG1ldGhvZCBpcyBhIHRlbXBvcmFyeSBoYWNrIHRvIHJlbmFtZSB0aGUgbGF1bmNoZXIuZXhlIGZpbGVzCi0JICogdG8gZWNsaXBzZS5leGUgKG9yICJsYXVuY2hlciIgdG8gImVjbGlwc2UiKS4gRXZlbnR1YWxseSB3ZSB3aWxsIGVpdGhlciBoYW5kLWNyYWZ0Ci0JICogbWV0YWRhdGEvYXJ0aWZhY3RzIGZvciBsYXVuY2hlcnMsIG9yIGFsdGVyIHRoZSBkZWx0YSBwYWNrIHRvIGNvbnRhaW4gZWNsaXBzZS1icmFuZGVkCi0JICogbGF1bmNoZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBtdW5nZUxhdW5jaGVyRmlsZU5hbWUoRmlsZSBmaWxlLCBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJsYXVuY2hlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50RmlsZSgpLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlLnJlbmFtZVRvKG5ld0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlkZXNjcmlwdG9yLnJlcGxhY2UoZmlsZSwgbmV3RmlsZSk7Ci0JCX0gZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJsYXVuY2hlci5leGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwgImVjbGlwc2UuZXhlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGUucmVuYW1lVG8obmV3RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlc2NyaXB0b3IucmVwbGFjZShmaWxlLCBuZXdGaWxlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FcXVpbm94TGF1bmNoZXJDVUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FcXVpbm94TGF1bmNoZXJDVUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIyNTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veExhdW5jaGVyQ1VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogQ3JlYXRlIENVcyBmb3IgYWxsIEVxdWlub3ggbGF1bmNoZXIgSVVzIChub3QgZnJhZ21lbnRzKSBmb3VuZCBpbiB0aGUgY3VycmVudCByZXN1bHRzCi0gKiBzdWNoIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgaG9zdCBJVSBpcyBjb25maWd1cmVkIGFzIHRoZSBsYXVuY2gubGlicmFyeS4gIAotICovCi1wdWJsaWMgY2xhc3MgRXF1aW5veExhdW5jaGVyQ1VBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfRVFVSU5PWF9MQVVOQ0hFUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCi0JcHVibGljIEVxdWlub3hMYXVuY2hlckNVQWN0aW9uKFN0cmluZyBmbGF2b3IpIHsKLQkJdGhpcy5mbGF2b3IgPSBmbGF2b3I7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJY3JlYXRlTGF1bmNoZXJDVXMocmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBhbGwga25vd24gSVVzIGluIHRoZSByZXN1bHQgdGhhdCBhcmUgcGFydCBvZiB0aGUgRXF1aW5veCBsYXVuY2hlci4gCi0JICogQHBhcmFtIHJlc3VsdHMgdGhlIHJlc3VsdHMgdG8gc2NhbiBhbmQgc3VwcGxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVMYXVuY2hlckNVcyhJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJQ29sbGVjdGlvbiBsYXVuY2hlcnMgPSBnZXRJVXMocmVzdWx0cy5nZXRJVXMobnVsbCwgbnVsbCksIE9SR19FQ0xJUFNFX0VRVUlOT1hfTEFVTkNIRVIpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsYXVuY2hlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGxhdW5jaGVySVUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaS5uZXh0KCk7Ci0JCQkvLyBza2lwIG92ZXIgc291cmNlIGJ1bmRsZXMgYW5kIGZyYWdtZW50cwotCQkJLy8gVE9ETyBzaG91bGQgd2UgdXNlIHRoZSBzb3VyY2UgcHJvcGVydHkgaGVyZSByYXRoZXIgdGhhbiBtYWdpYyBuYW1lIG1hdGNoaW5nPwotCQkJaWYgKGxhdW5jaGVySVUuZ2V0SWQoKS5lbmRzV2l0aCgiLnNvdXJjZSIpIHx8IGxhdW5jaGVySVUuaXNGcmFnbWVudCgpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlHZW5lcmF0b3JCdW5kbGVJbmZvIGJ1bmRsZSA9IG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKCk7Ci0JCQlidW5kbGUuc2V0U3ltYm9saWNOYW1lKGxhdW5jaGVySVUuZ2V0SWQoKSk7Ci0JCQlidW5kbGUuc2V0VmVyc2lvbihsYXVuY2hlcklVLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJCWJ1bmRsZS5zZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoImFkZFByb2dyYW1BcmcocHJvZ3JhbUFyZzotc3RhcnR1cCk7YWRkUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOkBhcnRpZmFjdCk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZS5zZXRTcGVjaWFsVW5jb25maWdDb21tYW5kcygicmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOi1zdGFydHVwKTtyZW1vdmVQcm9ncmFtQXJnKHByb2dyYW1Bcmc6QGFydGlmYWN0KTsiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGZpbHRlciA9IGxhdW5jaGVySVUuZ2V0RmlsdGVyKCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGN1ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQnVuZGxlQ29uZmlndXJhdGlvblVuaXQoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBuZXcgVmVyc2lvbihidW5kbGUuZ2V0VmVyc2lvbigpKSwgZmFsc2UsIGJ1bmRsZSwgZmxhdm9yLCBmaWx0ZXIpOwotCQkJaWYgKGN1ICE9IG51bGwpCi0JCQkJcmVzdWx0cy5hZGRJVShjdSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRJVXMoQ29sbGVjdGlvbiBpdXMsIFN0cmluZyBwcmVmaXgpIHsKLQkJU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCB0bXAgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRtcC5nZXRJZCgpLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXN1bHQuYWRkKHRtcCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0V4ZWN1dGFibGVzRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FeGVjdXRhYmxlc0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMWEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0V4ZWN1dGFibGVzRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLkFic3RyYWN0UHVibGlzaGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEV4ZWN1dGFibGVzRGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIEZpbGUgbG9jYXRpb247Ci0JcHJpdmF0ZSBTZXQgZmlsZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhlY3V0YWJsZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIHRlbXBvcmFyeSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCi0JcHVibGljIHN0YXRpYyBGaWxlIGZpbmRFeGVjdXRhYmxlKFN0cmluZyBvcywgRmlsZSByb290LCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJLy8gVE9ETyB0aGlzIG1heSBuZWVkIHRvIGdldCBtb3JlIGludGVsbGlnZW50Ci0JCS8vIGlmIE1hY09TIGl0cyBnb2luZyB0byBiZSBiYXNlTmFtZS5hcHAvQ29udGVudHMvTWFjT1MvYmFzZU5hbWUKLQkJaWYgKENvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSkgewotCQkJcmV0dXJuIG5ldyBGaWxlKHJvb3QsIGJhc2VOYW1lICsgIi5hcHAvQ29udGVudHMvTWFjT1MvIiArIGJhc2VOYW1lKTsKLQkJfQotCQkvLyBpZiBpdCBpcyBub3QgTWFjIGFuZCBub3QgV2luZG93cyBpdCBtdXN0IGJlIGEgVU5JWCBmbGF2b3IKLQkJaWYgKCFDb25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKG9zKSkgewotCQkJcmV0dXJuIG5ldyBGaWxlKHJvb3QsIGJhc2VOYW1lKTsKLQkJfQotCQkvLyBvdGhlcndpc2Ugd2UgYXJlIGxlZnQgd2l0aCB3aW5kb3dzCi0JCXJldHVybiBuZXcgRmlsZShyb290LCBiYXNlTmFtZSArICIuZXhlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgZXhlY3V0YWJsZXMgZm9sZGVyIGZvciB0aGUgZ2l2ZW4gY29uZmlnU3BlYy4gIFRoZSBmb2xkZXIKLQkgKiBpcyBleHBlY3RlZCB0byBiZSBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBFY2xpcHNlIGV4ZWN1dGFibGVzIGZlYXR1cmUgd2hvc2Ugc3RydWN0dXJlIGlzIAotCSAqIGVtYmVkZGVkIGhlcmUuCi0JICogQHBhcmFtIGV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZXMgZmVhdHVyZQotCSAqIEBwYXJhbSBjb25maWdTcGVjIHRoZSBjb25maWd1cmF0aW9uIHRvIGxvb2t1cAotCSAqIEByZXR1cm4gdGhlIHJvb3QgbG9jYXRpb24gb2YgdGhlIHJlcXVlc3RlZCBleGVjdXRhYmxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGNyZWF0ZUV4ZWN1dGFibGVzRnJvbUZlYXR1cmUoRmlsZSBleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbiwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJLy8gVE9ETyBjb25zaWRlciBoYW5kbGluZyBKQVInZCBmZWF0dXJlcyBoZXJlLi4uCi0JCWlmIChleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbiA9PSBudWxsIHx8ICFleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbi5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdbXSBjb25maWcgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24ucGFyc2VDb25maWdTcGVjKGNvbmZpZ1NwZWMpOwotCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uLCAiYmluLyIgKyBjb25maWdbMF0gKyAiLyIgKyBjb25maWdbMV0gKyAiLyIgKyBjb25maWdbMl0pOwotCQlpZiAoIXJlc3VsdC5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihjb25maWdbMV0sICJsYXVuY2hlciIsIHJlc3VsdCwgbmV3IEZpbGVbXSB7cmVzdWx0fSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGV4ZWN1dGFibGUgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYXRpb24sIG9zIGFuZCBuYW1lLgotCSAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBleGVjdXRhYmxlIHJlbGF0ZWQgZmlsZXMgaW4gZXhpc3RpbmcKLQkgKiB1bm1hbmFnZWQgY29uZmlndXJhdGlvbnMuCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIGV4ZWN1dGFibGUKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKFN0cmluZyBvcywgU3RyaW5nIGV4ZWN1dGFibGUsIEZpbGUgbG9jYXRpb24pIHsKLQkJaWYgKENvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSkKLQkJCXJldHVybiBjcmVhdGVNYWNEZXNjcmlwdG9yKG9zLCBleGVjdXRhYmxlLCBsb2NhdGlvbik7Ci0KLQkJLy8gaWYgaXQgaXMgbm90IE1hYyBhbmQgbm90IFdpbmRvd3MgaXQgbXVzdCBiZSBhIFVOSVggZmxhdm9yCi0JCWlmICghQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFscyhvcykpCi0JCQlyZXR1cm4gY3JlYXRlVW5peERlc2NyaXB0b3Iob3MsIGV4ZWN1dGFibGUsIGxvY2F0aW9uKTsKLQotCQkvLyBOb3RoaW5nIGVsc2Ugc28gaXQgbXVzdCBiZSBXaW5kb3dzCi0JCXJldHVybiBjcmVhdGVXaW5kb3dzRGVzY3JpcHRvcihvcywgZXhlY3V0YWJsZSwgbG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBjcmVhdGVXaW5kb3dzRGVzY3JpcHRvcihTdHJpbmcgb3MsIFN0cmluZyBleGVjdXRhYmxlLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCUV4ZWN1dGFibGVzRGVzY3JpcHRvciByZXN1bHQgPSBuZXcgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKG9zLCBleGVjdXRhYmxlLCBsb2NhdGlvbiwgbnVsbCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLCBleGVjdXRhYmxlICsgIi5leGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsZS5pc0ZpbGUoKSkKLQkJCXJlc3VsdC5hZGRGaWxlKGZpbGUpOwotCQlmaWxlID0gbmV3IEZpbGUobG9jYXRpb24sICJlY2xpcHNlYy5leGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsZS5pc0ZpbGUoKSkKLQkJCXJlc3VsdC5hZGRGaWxlKGZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBjcmVhdGVVbml4RGVzY3JpcHRvcihTdHJpbmcgb3MsIFN0cmluZyBleGVjdXRhYmxlLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCUV4ZWN1dGFibGVzRGVzY3JpcHRvciByZXN1bHQgPSBuZXcgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKG9zLCBleGVjdXRhYmxlLCBsb2NhdGlvbiwgbnVsbCk7Ci0JCUZpbGVbXSBmaWxlcyA9IGxvY2F0aW9uLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgZmlsZXMgIT0gbnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBuZXcgUGF0aChmaWxlc1tpXS5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSAmJiAoZXh0ZW5zaW9uID09IG51bGwgfHwgZXh0ZW5zaW9uLmVxdWFscygic28iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYWRkRmlsZShmaWxlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY3JlYXRlTWFjRGVzY3JpcHRvcihTdHJpbmcgb3MsIFN0cmluZyBleGVjdXRhYmxlLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCUZpbGUgZmlsZXNbXSA9IGxvY2F0aW9uLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoKCkgLSA0LCBuYW1lLmxlbmd0aCgpKS5lcXVhbHNJZ25vcmVDYXNlKCIuYXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBuZXcgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKG9zLCBleGVjdXRhYmxlLCBsb2NhdGlvbiwgZmlsZXMpOwotCX0KLQotCXB1YmxpYyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IoU3RyaW5nIG9zLCBTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBsb2NhdGlvbiwgRmlsZVtdIGZpbGVzKSB7Ci0JCXRoaXMub3MgPSBvczsKLQkJdGhpcy5leGVjdXRhYmxlTmFtZSA9IGV4ZWN1dGFibGU7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJaWYgKGZpbGVzID09IG51bGwpCi0JCQl0aGlzLmZpbGVzID0gbmV3IEhhc2hTZXQoMTEpOwotCQllbHNlIHsKLQkJCXRoaXMuZmlsZXMgPSBuZXcgSGFzaFNldChmaWxlcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJCQlhZGRBbGxGaWxlcyhmaWxlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKEV4ZWN1dGFibGVzRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRoaXMub3MgPSBkZXNjcmlwdG9yLm9zOwotCQl0aGlzLmxvY2F0aW9uID0gZGVzY3JpcHRvci5sb2NhdGlvbjsKLQkJdGhpcy5leGVjdXRhYmxlTmFtZSA9IGRlc2NyaXB0b3IuZXhlY3V0YWJsZU5hbWU7Ci0JCXRoaXMudGVtcG9yYXJ5ID0gZGVzY3JpcHRvci50ZW1wb3Jhcnk7Ci0JCXRoaXMuZmlsZXMgPSBuZXcgSGFzaFNldChkZXNjcmlwdG9yLmZpbGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBbGxGaWxlcyhGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpCi0JCQlmaWxlcy5hZGQocmVsYXRpdml6ZShmaWxlKSk7Ci0JCWVsc2UgewotCQkJRmlsZSBhYnNvbHV0ZSA9IGZpbGUuaXNBYnNvbHV0ZSgpID8gZmlsZSA6IG5ldyBGaWxlKGxvY2F0aW9uLCBmaWxlLmdldFBhdGgoKSk7Ci0JCQlGaWxlW10gbGlzdCA9IGFic29sdXRlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJCWFkZEFsbEZpbGVzKGxpc3RbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsZShGaWxlIGZpbGUpIHsKLQkJZmlsZXMuYWRkKHJlbGF0aXZpemUoZmlsZSkpOwotCX0KLQotCS8vIGRvIGEgc2ltcGxlIHJlbGF0aXZpemF0aW9uIGJ5IHJlbW92aW5nIGFsbCB0aGUgYml0cyBiZWZvcmUgdGhlIGxvY2F0aW9uCi0JcHJpdmF0ZSBGaWxlIHJlbGF0aXZpemUoRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gZmlsZTsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJaWYgKCFwYXRoLnN0YXJ0c1dpdGgobG9jYXRpb24uZ2V0UGF0aCgpKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZmlsZS50b1N0cmluZygpICsgIiBtdXN0IGJlIHJlbGF0ZWQgdG8gIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcobG9jYXRpb24uZ2V0UGF0aCgpLmxlbmd0aCgpKTsKLQkJLy8gdHJpbSBvZmYgYW55IHNlcGFyYXRvci4gIFRoaXMgYWNjb21vZGF0ZXMgcGVvcGxlIHdobyBzZXQgdGhlIGxvY2F0aW9uIHdpdGggYSB0cmFpbGluZyAvCi0JCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSB8fCBwYXRoLnN0YXJ0c1dpdGgoIlxcIikpIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCXJldHVybiBuZXcgRmlsZShwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGaWxlKEZpbGUgZmlsZSkgewotCQlmaWxlcy5yZW1vdmUocmVsYXRpdml6ZShmaWxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZW1vdmVGaWxlKG9sZEZpbGUpOwotCQlhZGRGaWxlKG5ld0ZpbGUpOwotCX0KLQotCXB1YmxpYyBGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCUZpbGVbXSByZXN1bHQgPSAoRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBGaWxlW2ZpbGVzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLQkJCXJlc3VsdFtpXSA9IG5ldyBGaWxlKGxvY2F0aW9uLCByZXN1bHRbaV0uZ2V0UGF0aCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGVOYW1lKCkgewotCQlyZXR1cm4gZXhlY3V0YWJsZU5hbWU7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RXhlY3V0YWJsZSgpIHsKLQkJcmV0dXJuIGZpbmRFeGVjdXRhYmxlKG9zLCBsb2NhdGlvbiwgZXhlY3V0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oRmlsZSB2YWx1ZSkgewotCQlsb2NhdGlvbiA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVtcG9yYXJ5KCkgewotCQlyZXR1cm4gdGVtcG9yYXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGVOYW1lKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiB1cGRhdGVGaWxlcykgewotCQlpZiAodXBkYXRlRmlsZXMpCi0JCQl1cGRhdGVFeGVjdXRhYmxlTmFtZSh2YWx1ZSk7Ci0JCWV4ZWN1dGFibGVOYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFrZVRlbXBvcmFyeUNvcHkoKSB7Ci0JCWlmIChpc1RlbXBvcmFyeSgpKQotCQkJcmV0dXJuOwotCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicDIuYnJhbmRpbmdJcm9uIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gZmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJCUZpbGVVdGlscy5jb3B5KGxvY2F0aW9uLCB0ZW1wRmlsZSwgKEZpbGUpIGkubmV4dCgpLCB0cnVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHB1Ymxpc2hpbmcgYXJ0aWZhY3RzIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbG9jYXRpb24gPSB0ZW1wRmlsZTsKLQkJdGVtcG9yYXJ5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgZXhlY3V0YWJsZSByZXByZXNlbnRlZCBieSB0aGlzIGRlc2NyaXB0b3IgaGFzIGJlZW4gYnJhbmRlZCB0aGVuIGEgbWVzcwotCSAqIG9mIGZpbGVzIGhhdmUgYmVlbiByZW5hbWVkLiAgSGVyZSBzY2FuIHRoZSBkZXNjcmlwdG9yJ3MgZmlsZSBsaXN0IGFuZCB1cGRhdGUgdGhlIG5hbWVzCi0JICogdGFraW5nIGludG8gYWNjb3VuIHRoZSBkaWZmZXJlbnQgbGF5b3V0IG9uIGRpZmZlcmVudCBPU2VzLgotCSAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuZXcgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRXhlY3V0YWJsZU5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUuZXF1YWxzSWdub3JlQ2FzZShleGVjdXRhYmxlTmFtZSkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0YXJnZXRJbmkgPSBleGVjdXRhYmxlTmFtZSArICIuaW5pIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGFyZ2V0RXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVOYW1lOwotCQlTdHJpbmcgZXhlY3V0YWJsZUV4dGVuc2lvbiA9IENvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMob3MpID8gIi5leGUiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0YXJnZXRFeGVjdXRhYmxlID0gZXhlY3V0YWJsZU5hbWUgKyBleGVjdXRhYmxlRXh0ZW5zaW9uOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBmaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBiYXNlID0gZmlsZS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdXNlIFN0cmluZyBjb25jYXRlbmF0aW9uIGhlcmUgYmVjYXVzZSBuZXcgRmlsZSgiIiwgImZvbyIpIGlzIGFic29sdXRlIG9uIGF0IGxlYXN0IHdpbmRvd3MuLi4KLQkJCWJhc2UgPSBiYXNlID09IG51bGwgPyAiIiA6IGJhc2UgKyAiLyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKENvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSAmJiBiYXNlLnN0YXJ0c1dpdGgoZXhlY3V0YWJsZU5hbWUgKyAiLmFwcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJYmFzZSA9IG5ld05hbWUgKyAiLmFwcCIgKyBiYXNlLnN1YnN0cmluZyhleGVjdXRhYmxlTmFtZS5sZW5ndGgoKSArIDQpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YXJnZXRFeGVjdXRhYmxlKSkKLQkJCQlyZXBsYWNlKGZpbGUsIG5ldyBGaWxlKGJhc2UgKyBuZXdOYW1lICsgZXhlY3V0YWJsZUV4dGVuc2lvbikpOwotCQkJZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YXJnZXRJbmkpKQotCQkJCXJlcGxhY2UoZmlsZSwgbmV3IEZpbGUoYmFzZSArIG5ld05hbWUgKyAiLmluaSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoQ29uc3RhbnRzLk9TX01BQ09TWC5lcXVhbHMob3MpKQotCQkJCXJlcGxhY2UoZmlsZSwgbmV3IEZpbGUoYmFzZSArIGZpbGUuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0ZlYXR1cmVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0ZlYXR1cmVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmQxZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9GZWF0dXJlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBQdWJsaXNoIElVcyBmb3IgYWxsIG9mIHRoZSBmZWF0dXJlcyBpbiB0aGUgZ2l2ZW4gc2V0IG9mIGxvY2F0aW9ucy4gIFRoZSBsb2NhdGlvbnMgY2FuIAotICogYmUgYWN0dWFsIGxvY2F0aW9ucyBvZiB0aGUgZmVhdHVyZXMgb3IgZm9sZGVycyBvZiBmZWF0dXJlcy4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiA9ICIob3JnLmVjbGlwc2UudXBkYXRlLmluc3RhbGwuZmVhdHVyZXM9dHJ1ZSkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmVhdHVyZVtdIGZlYXR1cmVMaXN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZWRJZChTdHJpbmcgb3JpZ2luYWwsIGJvb2xlYW4gaXNQbHVnaW4sIGJvb2xlYW4gaXNHcm91cCkgewotCQlyZXR1cm4gKGlzUGx1Z2luID8gb3JpZ2luYWwgOiBvcmlnaW5hbCArIChpc0dyb3VwID8gIi5mZWF0dXJlLmdyb3VwIiA6ICIuZmVhdHVyZS5qYXIiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RLZXkgY3JlYXRlRmVhdHVyZUFydGlmYWN0S2V5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5FQ0xJUFNFX0ZFQVRVUkVfQ0xBU1NJRklFUiwgaWQsIG5ldyBWZXJzaW9uKHZlcnNpb24pKTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZXNBY3Rpb24oRmlsZVtdIGxvY2F0aW9ucykgewotCQlmZWF0dXJlTGlzdCA9IGdldEZlYXR1cmVzKGV4cGFuZExvY2F0aW9ucyhsb2NhdGlvbnMpKTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZXNBY3Rpb24oRmVhdHVyZVtdIGZlYXR1cmVMaXN0KSB7Ci0JCXRoaXMuZmVhdHVyZUxpc3QgPSBmZWF0dXJlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlnZW5lcmF0ZUZlYXR1cmVJVXMoZmVhdHVyZUxpc3QsIHJlc3VsdHMsIGluZm8pOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBleHBhbmRMb2NhdGlvbnMoRmlsZVtdIGxpc3QpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZXhwYW5kTG9jYXRpb25zKGxpc3QsIHJlc3VsdCk7Ci0JCXJldHVybiAoRmlsZVtdKSByZXN1bHQudG9BcnJheShuZXcgRmlsZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZExvY2F0aW9ucyhGaWxlW10gbGlzdCwgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgbG9jYXRpb24gPSBsaXN0W2ldOwotCQkJaWYgKGxvY2F0aW9uLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkvLyBpZiB0aGUgbG9jYXRpb24gaXMgaXRzZWxmIGEgZmVhdHVyZSwganVzdCBhZGQgaXQuICBPdGhlcndpc2UgciBkb3duCi0JCQkJaWYgKCFuZXcgRmlsZShsb2NhdGlvbiwgImZlYXR1cmUueG1sIikuZXhpc3RzKCkpCi0JCQkJCWV4cGFuZExvY2F0aW9ucyhsb2NhdGlvbi5saXN0RmlsZXMoKSwgcmVzdWx0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQobG9jYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKGxvY2F0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRmVhdHVyZUlVcyhGZWF0dXJlW10gZmVhdHVyZXMsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0LCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCS8vIEJ1aWxkIEZlYXR1cmUgSVVzLCBhbmQgYWRkIHRoZW0gdG8gYW55IGNvcnJlc3BvbmRpbmcgY2F0ZWdvcmllcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCS8vIFRoZSBJVSBoaWVyYXJjaHkgbXVzdCBiZSBidWlsdCBmcm9tIHRoZSBib3R0b20gdXAgc28gZG8gdGhlIHJvb3QgZmlsZXMgZmlyc3QuCi0JCQlBcnJheUxpc3QgY2hpbGRJVXMgPSBnZW5lcmF0ZVJvb3RGaWxlSVVzKGZlYXR1cmUsIHJlc3VsdCwgaW5mbyk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSA9IGNyZWF0ZUZlYXR1cmVKYXJJVShmZWF0dXJlLCBjaGlsZElVcywgaW5mbyk7Ci0JCQlwdWJsaXNoRmVhdHVyZUFydGlmYWN0cyhmZWF0dXJlLCBmZWF0dXJlSVUsIGluZm8pOwotCQkJZ2F0aGVyQnVuZGxlU2hhcGVBZHZpY2UoZmVhdHVyZSwgaW5mbyk7Ci0JCQkvLyBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgZ3JvdXAgYW5kIHJlZ2lzdGVyIHRoZSBmZWF0dXJlIGFuZCBncm91cCBpbiB0aGUgcmVzdWx0LgotCQkJSUluc3RhbGxhYmxlVW5pdCBncm91cElVID0gY3JlYXRlR3JvdXBJVShmZWF0dXJlLCBmZWF0dXJlSVUsIG51bGwpOwotCQkJcmVzdWx0LmFkZElVKGdyb3VwSVUsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCQlyZXN1bHQuYWRkSVUoZmVhdHVyZUlVLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRmVhdHVyZUphcklVKEZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGNoaWxkSVVzLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCS8vIGNyZWF0ZSB0aGUgYmFzaWMgZmVhdHVyZSBJVSB3aXRoIGFsbCB0aGUgY2hpbGRyZW4KLQkJU3RyaW5nIGxvY2F0aW9uID0gZmVhdHVyZS5nZXRMb2NhdGlvbigpOwotCQlib29sZWFuIGlzRXhwbG9kZWQgPSAobG9jYXRpb24uZW5kc1dpdGgoIi5qYXIiKSA/IGZhbHNlIDogdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBwcm9wcyA9IGdldEZlYXR1cmVBZHZpY2UoZmVhdHVyZSwgaW5mbyk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgZmVhdHVyZUlVID0gY3JlYXRlRmVhdHVyZUphcklVKGZlYXR1cmUsIGNoaWxkSVVzLCBpc0V4cGxvZGVkLCBwcm9wcyk7Ci0JCXJldHVybiBmZWF0dXJlSVU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaEZlYXR1cmVBcnRpZmFjdHMoRmVhdHVyZSBmZWF0dXJlLCBJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQkvLyBhZGQgYWxsIHRoZSBhcnRpZmFjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlCi0JCS8vIFRPRE8gdGhpcyBpcyBhIGxpdHRsZSBzdHJhbmdlLiAgSWYgdGhlcmUgYXJlIHNldmVyYWwgYXJ0aWZhY3RzLCBob3cgZG8gd2Uga25vdyB3aGljaCBmaWxlcyBnbyB3aXRoCi0JCS8vIHdoaWNoIGFydGlmYWN0cyB3aGVuIHdlIHB1Ymxpc2ggdGhlbT8gIEZvciBub3cgaXQgd291bGQgYmUgc3VycHJpc2luZyB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLQkJLy8gYXJ0aWZhY3QgcGVyIGZlYXR1cmUgSVUuCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGZlYXR1cmVJVS5nZXRBcnRpZmFjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcnRpZmFjdHMubGVuZ3RoOyBqKyspIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZlYXR1cmUuZ2V0TG9jYXRpb24oKSk7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFkID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGFydGlmYWN0c1tqXSwgZmlsZSk7Ci0JCQkvLyBpZiB0aGUgYXJ0aWZhY3QgaXMgYSBkaXIgYW5kIHdlIGFyZSBub3QgZG9pbmcgIkFTX0lTIiwgemlwIGl0IHVwLgotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSAmJiAhKChpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpICYgSVB1Ymxpc2hlckluZm8uQV9BU19JUykgPiAwKSkKLQkJCQlwdWJsaXNoQXJ0aWZhY3QoYWQsIGZpbGUubGlzdEZpbGVzKCksIGluZm8sIElOQ0xVREVfUk9PVCk7Ci0JCQllbHNlCi0JCQkJcHVibGlzaEFydGlmYWN0KGFkLCBuZXcgRmlsZVtdIHtmaWxlfSwgaW5mbywgQVNfSVMgfCBJTkNMVURFX1JPT1QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldEZlYXR1cmVBZHZpY2UoRmVhdHVyZSBmZWF0dXJlLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJQ29sbGVjdGlvbiBhZHZpY2UgPSBpbmZvLmdldEFkdmljZShudWxsLCBmYWxzZSwgbnVsbCwgbnVsbCwgSUZlYXR1cmVBZHZpY2UuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhZHZpY2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJRmVhdHVyZUFkdmljZSBlbnRyeSA9IChJRmVhdHVyZUFkdmljZSkgaS5uZXh0KCk7Ci0JCQlQcm9wZXJ0aWVzIHByb3BzID0gZW50cnkuZ2V0UHJvcGVydGllcyhmZWF0dXJlLCBudWxsKTsKLQkJCWlmIChwcm9wcyAhPSBudWxsKQotCQkJCXJlc3VsdC5wdXRBbGwocHJvcHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBnZW5lcmF0ZVJvb3RGaWxlSVVzKEZlYXR1cmUgZmVhdHVyZSwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKGZlYXR1cmUuZ2V0TG9jYXRpb24oKSk7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBsb2FkUHJvcGVydGllcyhsb2NhdGlvbiwgImJ1aWxkLnByb3BlcnRpZXMiKTsKLQkJcmV0dXJuIGdlbmVyYXRlUm9vdEZpbGVJVXMoZmVhdHVyZS5nZXRJZCgpLCBmZWF0dXJlLmdldFZlcnNpb24oKSwgcHJvcHMsIGxvY2F0aW9uLCByZXN1bHQsIGluZm8pOwotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IGdlbmVyYXRlUm9vdEZpbGVJVXMoU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIGZlYXR1cmVWZXJzaW9uLCBQcm9wZXJ0aWVzIHByb3BzLCBGaWxlIGxvY2F0aW9uLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlBcnJheUxpc3QgaXVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlU2V0RGVzY3JpcHRvcltdIHJvb3RGaWxlRGVzY3JpcHRvcnMgPSBnZXRSb290RmlsZURlc2NyaXB0b3JzKHByb3BzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290RmlsZURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gZ2VuZXJhdGVSb290RmlsZUlVKGZlYXR1cmVJZCwgZmVhdHVyZVZlcnNpb24sIGxvY2F0aW9uLCByb290RmlsZURlc2NyaXB0b3JzW2ldLCByZXN1bHQsIGluZm8pOwotCQkJaXVzLmFkZChpdSk7Ci0JCX0KLQkJcmV0dXJuIGl1czsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoRmlsZSBsb2NhdGlvbiwgU3RyaW5nIGZpbGUpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUZpbGUgdGVtcEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gaWYgdGhlIGZlYXR1cmUgaXMgYSBkaXIgdGhlbiBqdXN0IHJldHVybiB0aGUgbG9jYXRpb24KLQkJCWlmICghbG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgewotCQkJCS8vIG90aGVyd2lzZSBleHRyYWN0IHRoZSBKQVIgaW50byBhIHRlbXAgbG9jYXRpb24gYW5kIHJldHVybiB0aGF0IGxvY2F0aW9uCi0JCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwMi5nZW5lcmF0b3IiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUZpbGVVdGlscy51bnppcEZpbGUobG9jYXRpb24sIHRlbXBGaWxlKTsKLQkJCQlsb2NhdGlvbiA9IHRlbXBGaWxlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGxvY2F0aW9uLCBmaWxlKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByb3BzLmxvYWQoaW4pOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZSBpZiBpdCBpcyBqdXN0IGEgZmlsZSBub3QgZm91bmQuCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHBhcnNpbmcgIiArIGZpbGUsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3IgcHVibGlzaGluZyBhcnRpZmFjdHMiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0ZW1wRmlsZSAhPSBudWxsKQotCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZ2VuZXJhdGVSb290RmlsZUlVKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyBmZWF0dXJlVmVyc2lvbiwgRmlsZSBsb2NhdGlvbiwgRmlsZVNldERlc2NyaXB0b3Igcm9vdEZpbGUsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0LCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCU9iamVjdFtdIGl1QW5kRmlsZXMgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVGZWF0dXJlUm9vdEZpbGVJVShmZWF0dXJlSWQsIGZlYXR1cmVWZXJzaW9uLCBsb2NhdGlvbiwgcm9vdEZpbGUpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1UmVzdWx0ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl1QW5kRmlsZXNbMF07Ci0JCUZpbGVbXSBmaWxlUmVzdWx0ID0gKEZpbGVbXSkgaXVBbmRGaWxlc1sxXTsKLQkJaWYgKGZpbGVSZXN1bHQgIT0gbnVsbCAmJiBmaWxlUmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCUlBcnRpZmFjdEtleSBhcnRpZmFjdCA9IGl1UmVzdWx0LmdldEFydGlmYWN0cygpWzBdOwotCQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGFydGlmYWN0KTsKLQkJCXB1Ymxpc2hBcnRpZmFjdChkZXNjcmlwdG9yLCBmaWxlUmVzdWx0LCBpbmZvLCAwKTsKLQkJfQotCQlyZXN1bHQuYWRkSVUoaXVSZXN1bHQsIElQdWJsaXNoZXJSZXN1bHQuTk9OX1JPT1QpOwotCQlyZXR1cm4gaXVSZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVTZXREZXNjcmlwdG9yW10gZ2V0Um9vdEZpbGVEZXNjcmlwdG9ycyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCUhhc2hNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gcHJvcHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCS8vIHdlIG9ubHkgY2FyZSBhYm91dCByb290IHByb3BlcnRpZXMKLQkJCWlmICghcHJvcGVydHkuc3RhcnRzV2l0aCgicm9vdC4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nW10gc3BlYyA9IGdldEFycmF5RnJvbVN0cmluZyhwcm9wZXJ0eSwgIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRlc2NyaXB0b3JLZXkgPSBzcGVjWzBdOwotCQkJU3RyaW5nIGNvbmZpZ1NwZWMgPSBudWxsOwotCQkJLy8gaWYgdGhlIHNwZWMgaXMgNCBvciBtb3JlIHRoZW4gdGhlcmUgbXVzdCBiZSBhIGNvbmZpZyBpbnZvbHZlZCB0byBnZXQgaXQKLQkJCWlmIChzcGVjLmxlbmd0aCA+IDMpIHsKLQkJCQljb25maWdTcGVjID0gY3JlYXRlQ29uZmlnU3BlYyhzcGVjWzJdLCBzcGVjWzFdLCBzcGVjWzNdKTsKLQkJCQlkZXNjcmlwdG9yS2V5ICs9ICIuIiArIGNyZWF0ZUlkU3RyaW5nKGNvbmZpZ1NwZWMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUZpbGVTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRmlsZVNldERlc2NyaXB0b3IpIHJlc3VsdC5nZXQoZGVzY3JpcHRvcktleSk7Ci0JCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvciA9IG5ldyBGaWxlU2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yS2V5LCBjb25maWdTcGVjKTsKLQkJCQlyZXN1bHQucHV0KGRlc2NyaXB0b3JLZXksIGRlc2NyaXB0b3IpOwotCQkJfQotCQkJLy8gaWYgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgc3BlYyBpcyAibGluayIgCi0JCQlpZiAoc3BlY1tzcGVjLmxlbmd0aCAtIDFdID09ICJsaW5rIikgLy8kTk9OLU5MUy0xJAotCQkJCWRlc2NyaXB0b3Iuc2V0TGlua3MocHJvcHMuZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKLQkJCWVsc2UgewotCQkJCS8vIGlmIHRoZSBzZWNvbmQgbGFzdCBzZWdtZW50IGlzICJwZXJtaXNzaW9ucyIgCi0JCQkJaWYgKHNwZWNbc3BlYy5sZW5ndGggLSAyXS5lcXVhbHMoInBlcm1pc3Npb25zIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVzY3JpcHRvci5hZGRQZXJtaXNzaW9ucyhuZXcgU3RyaW5nW10ge3NwZWNbc3BlYy5sZW5ndGggLSAxXSwgcHJvcHMuZ2V0UHJvcGVydHkocHJvcGVydHkpfSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNvIGl0IGlzIG5vdCBhIGxpbmsgb3IgYSBwZXJtaXNzaW9ucywgaXQgbXVzdCBiZSBhIHN0cmFpZ2h0IGZpbGUgY29weSAod2l0aCBvciB3aXRob3V0IGEgY29uZmlnKQotCQkJCQlkZXNjcmlwdG9yLnNldEZpbGVzKHByb3BzLmdldFByb3BlcnR5KHByb3BlcnR5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb24gdmFsdWVzID0gcmVzdWx0LnZhbHVlcygpOwotCQlyZXR1cm4gKEZpbGVTZXREZXNjcmlwdG9yW10pIHZhbHVlcy50b0FycmF5KG5ldyBGaWxlU2V0RGVzY3JpcHRvclt2YWx1ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogR2F0aGVyIGFueSBhZHZpY2Ugd2UgY2FuIGZyb20gdGhlIGdpdmVuIGZlYXR1cmUuICBJbiBwYXJ0aWN1bGFyLCBpdCBtYXkgaGF2ZQotCSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzaGFwZSBvZiB0aGUgYnVuZGxlcyBpdCBpbmNsdWRlcy4gIFRoZSBkaXNjb3ZlcmVkIGFkdmljZSBpcwotCSAqIGFkZGVkIHRvIHRoZSBnaXZlbiByZXN1bHQuCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgdG8gcHJvY2VzcwotCSAqIEBwYXJhbSBpbmZvIHRoZSBwdWJsaXNoaW5nIGluZm8gdG8gdXBkYXRlCi0JICovCi0JcHVibGljIHZvaWQgZ2F0aGVyQnVuZGxlU2hhcGVBZHZpY2UoRmVhdHVyZSBmZWF0dXJlLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUZlYXR1cmVFbnRyeSBlbnRyaWVzW10gPSBmZWF0dXJlLmdldEVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmlzVW5wYWNrKCkpCi0JCQkJaW5mby5hZGRBZHZpY2UobmV3IEJ1bmRsZVNoYXBlQWR2aWNlKGVudHJ5LmdldElkKCksIG5ldyBWZXJzaW9uKGVudHJ5LmdldFZlcnNpb24oKSksIElCdW5kbGVTaGFwZUFkdmljZS5ESVIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUZlYXR1cmVKYXJJVShGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBjaGlsZElVcywgYm9vbGVhbiBpc0V4cGxvZGVkLCBQcm9wZXJ0aWVzIGV4dHJhUHJvcGVydGllcykgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGlkID0gZ2V0VHJhbnNmb3JtZWRJZChmZWF0dXJlLmdldElkKCksIC8qaXNQbHVnaW4qL2ZhbHNlLCAvKmlzR3JvdXAqL2ZhbHNlKTsKLQkJaXUuc2V0SWQoaWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWlmIChmZWF0dXJlLmdldExpY2Vuc2UoKSAhPSBudWxsKQotCQkJaXUuc2V0TGljZW5zZShuZXcgTGljZW5zZShmZWF0dXJlLmdldExpY2Vuc2VVUkwoKSwgZmVhdHVyZS5nZXRMaWNlbnNlKCkpKTsKLQkJaWYgKGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkgIT0gbnVsbCkKLQkJCWl1LnNldENvcHlyaWdodChuZXcgQ29weXJpZ2h0KGZlYXR1cmUuZ2V0Q29weXJpZ2h0VVJMKCksIGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkpKTsKLQotCQkvLyBUaGUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc3BlY2lmaWVkIGF0IHRoaXMgbGV2ZWwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmZWF0dXJlIGphciB0byBiZSBhdHRyYWN0aXZlIHRvIGluc3RhbGwuCi0KLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9PU0dJKTsKLQkJaXUuc2V0RmlsdGVyKElOU1RBTExfRkVBVFVSRVNfRklMVEVSKTsKLQkJaXUuc2V0U2luZ2xldG9uKHRydWUpOwotCi0JCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyKCkgIT0gbnVsbCAmJiBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGluc3RhbGxIYW5kbGVyUHJvcGVydHkgPSAiaGFuZGxlcj0iICsgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlcigpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyTGlicmFyeSgpICE9IG51bGwpCi0JCQkJaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSArPSAiLCBsaWJyYXJ5PSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyTGlicmFyeSgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyVVJMKCkgIT0gbnVsbCkKLQkJCQlpbnN0YWxsSGFuZGxlclByb3BlcnR5ICs9ICIsIHVybD0iICsgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlclVSTCgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWl1LnNldFByb3BlcnR5KE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLkVDTElQU0VfSU5TVEFMTF9IQU5ETEVSX1BST1AsIGluc3RhbGxIYW5kbGVyUHJvcGVydHkpOwotCQl9Ci0KLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoaWQsIHZlcnNpb24pLCBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5GRUFUVVJFX0NBUEFCSUxJVFksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuQ0FQQUJJTElUWV9OU19VUERBVEVfRkVBVFVSRSwgZmVhdHVyZS5nZXRJZCgpLCB2ZXJzaW9uKX0pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtjcmVhdGVGZWF0dXJlQXJ0aWZhY3RLZXkoZmVhdHVyZS5nZXRJZCgpLCB2ZXJzaW9uLnRvU3RyaW5nKCkpfSk7Ci0KLQkJLy8gbGluayBpbiBhbGwgdGhlIGNoaWxkcmVuIChpZiBhbnkpIGFzIHJlcXVpcmVtZW50cy4KLQkJLy8gVE9ETyBjb25zaWRlciBpZiB0aGVzZSBzaG91bGQgYmUgbGlua2VkIGFzIGV4YWN0IHZlcnNpb24gbnVtYmVycy4gIFNob3VsZCBiZSBvayBidXQgbWF5IGJlIGJyaXR0bGUuCi0JCWlmIChjaGlsZElVcyAhPSBudWxsKSB7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbY2hpbGRJVXMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRJVXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJSW5zdGFsbGFibGVVbml0IGNoaWxkID0gKElJbnN0YWxsYWJsZVVuaXQpIGNoaWxkSVVzLmdldChpKTsKLQkJCQlyZXF1aXJlZFtpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuSVVfTkFNRVNQQUNFLCBjaGlsZC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGNoaWxkLmdldFZlcnNpb24oKSwgdHJ1ZSwgY2hpbGQuZ2V0VmVyc2lvbigpLCB0cnVlKSwgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCX0KLQotCQlpZiAoaXNFeHBsb2RlZCkgewotCQkJLy8gRGVmaW5lIHRoZSBpbW11dGFibGUgbWV0YWRhdGEgZm9yIHRoaXMgSVUuIEluIHRoaXMgY2FzZSBpbW11dGFibGUgbWVhbnMKLQkJCS8vIHRoYXQgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCB3aWxsIG5vdCBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJdG91Y2hwb2ludERhdGEucHV0KCJ6aXBwZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQl9Ci0KLQkJaWYgKGV4dHJhUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZXh0cmFQcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaXUuc2V0UHJvcGVydHkobmFtZSwgZXh0cmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVHcm91cElVKEZlYXR1cmUgZmVhdHVyZSwgSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBnZXRUcmFuc2Zvcm1lZElkKGZlYXR1cmUuZ2V0SWQoKSwgLyppc1BsdWdpbiovZmFsc2UsIC8qaXNHcm91cCovdHJ1ZSk7Ci0JCWl1LnNldElkKGlkKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oZmVhdHVyZS5nZXRWZXJzaW9uKCkpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgZmVhdHVyZS5nZXRMYWJlbCgpKTsKLQkJaWYgKGZlYXR1cmUuZ2V0TGljZW5zZSgpICE9IG51bGwpCi0JCQlpdS5zZXRMaWNlbnNlKG5ldyBMaWNlbnNlKGZlYXR1cmUuZ2V0TGljZW5zZVVSTCgpLCBmZWF0dXJlLmdldExpY2Vuc2UoKSkpOwotCQlpZiAoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSAhPSBudWxsKQotCQkJaXUuc2V0Q29weXJpZ2h0KG5ldyBDb3B5cmlnaHQoZmVhdHVyZS5nZXRDb3B5cmlnaHRVUkwoKSwgZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSkpOwotCQlpdS5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKGlkLCBuZXcgVmVyc2lvblJhbmdlKG5ldyBWZXJzaW9uKDAsIDAsIDApLCB0cnVlLCBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSksIGZhbHNlKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0KLQkJLy8gZ2VuZXJhdGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZmVhdHVyZSBpbmNsdXNpb25zL3JlcXVpcmVtZW50IAotCQlGZWF0dXJlRW50cnkgZW50cmllc1tdID0gZmVhdHVyZS5nZXRFbnRyaWVzKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtlbnRyaWVzLmxlbmd0aCArIDFdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IGdldFZlcnNpb25SYW5nZShlbnRyaWVzW2ldKTsKLQkJCXJlcXVpcmVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgZ2V0VHJhbnNmb3JtZWRJZChlbnRyaWVzW2ldLmdldElkKCksIGVudHJpZXNbaV0uaXNQbHVnaW4oKSwgLyppc0dyb3VwKi90cnVlKSwgcmFuZ2UsIGdldEZpbHRlcihlbnRyaWVzW2ldKSwgZW50cmllc1tpXS5pc09wdGlvbmFsKCksIGZhbHNlKTsKLQkJfQotCQlyZXF1aXJlZFtlbnRyaWVzLmxlbmd0aF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBmZWF0dXJlSVUuZ2V0SWQoKSwgbmV3IFZlcnNpb25SYW5nZShmZWF0dXJlSVUuZ2V0VmVyc2lvbigpLCB0cnVlLCBmZWF0dXJlSVUuZ2V0VmVyc2lvbigpLCB0cnVlKSwgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlcXVpcmVkKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVG91Y2hwb2ludFR5cGUuTk9ORSk7Ci0JCWl1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCS8vIFRPRE86IHNob3VsZG4ndCB0aGUgZmlsdGVyIGZvciB0aGUgZ3JvdXAgYmUgY29uc3RydWN0ZWQgZnJvbSBvcywgd3MsIGFyY2gsIG5sCi0JCS8vIAkJIG9mIHRoZSBmZWF0dXJlPwotCQkvLyBpdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoaWQsIHZlcnNpb24pfSk7Ci0KLQkJaWYgKGV4dHJhUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZXh0cmFQcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaXUuc2V0UHJvcGVydHkobmFtZSwgZXh0cmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JfQotCi0JcHVibGljIFZlcnNpb25SYW5nZSBnZXRWZXJzaW9uUmFuZ2UoRmVhdHVyZUVudHJ5IGVudHJ5KSB7Ci0JCVN0cmluZyB2ZXJzaW9uU3BlYyA9IGVudHJ5LmdldFZlcnNpb24oKTsKLQkJaWYgKHZlcnNpb25TcGVjID09IG51bGwpCi0JCQkvLyBUT0RPIHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIGhlcmUuLi4KLQkJCXJldHVybiBudWxsOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3BlYyk7Ci0JCS8vIGlmIHRoaXMgaXMgYW4gaW5jbHVkZXMgdGhlbiByZXR1cm4gZWl0aGVyIGEgY29tcGxldGVseSBvcGVuIHJhbmdlIChpZiB0aGUgdmVyaXNvbiBpcyAwLjAuMCkKLQkJLy8gb3IgYW4gZXhhY3QgcmFuZ2UKLQkJaWYgKCFlbnRyeS5pc1JlcXVpcmVzKCkpIHsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscyhWZXJzaW9uLmVtcHR5VmVyc2lvbikpCi0JCQkJcmV0dXJuIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCX0KLQkJU3RyaW5nIG1hdGNoID0gZW50cnkuZ2V0TWF0Y2goKTsKLQkJaWYgKG1hdGNoID09IG51bGwpCi0JCQkvLyBUT0RPIHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIGhlcmUuLi4KLQkJCXJldHVybiBudWxsOwotCQlpZiAobWF0Y2guZXF1YWxzKCJwZXJmZWN0IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpOwotCQlpZiAobWF0Y2guZXF1YWxzKCJlcXVpdmFsZW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB1cHBlciA9IG5ldyBWZXJzaW9uKHZlcnNpb24uZ2V0TWFqb3IoKSwgdmVyc2lvbi5nZXRNaW5vcigpICsgMSwgMCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB1cHBlciwgZmFsc2UpOwotCQl9Ci0JCWlmIChtYXRjaC5lcXVhbHMoImNvbXBhdGlibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlWZXJzaW9uIHVwcGVyID0gbmV3IFZlcnNpb24odmVyc2lvbi5nZXRNYWpvcigpICsgMSwgMCwgMCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB1cHBlciwgZmFsc2UpOwotCQl9Ci0JCWlmIChtYXRjaC5lcXVhbHMoImdyZWF0ZXJPckVxdWFsIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIG5ldyBWZXJzaW9uUmFuZ2UobnVsbCkuZ2V0TWF4aW11bSgpLCB0cnVlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoRmVhdHVyZUVudHJ5IGVudHJ5KSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJlc3VsdC5hcHBlbmQoIigmIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldEZpbHRlcigpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKGVudHJ5LmdldEZpbHRlcigpKTsKLQkJaWYgKGVudHJ5LmdldE9TKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLm9zPSIgKyBlbnRyeS5nZXRPUygpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXRXUygpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS53cz0iICsgZW50cnkuZ2V0V1MoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0QXJjaCgpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5hcmNoPSIgKyBlbnRyeS5nZXRBcmNoKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldE5MKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLm5sPSIgKyBlbnRyeS5nZXROTCgpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMikKLQkJCXJldHVybiBudWxsOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmVhdHVyZVtdIGdldEZlYXR1cmVzKEZpbGVbXSBsb2NhdGlvbnMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobG9jYXRpb25zLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBuZXcgRmVhdHVyZVBhcnNlcigpLnBhcnNlKGxvY2F0aW9uc1tpXSk7Ci0JCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJZmVhdHVyZS5zZXRMb2NhdGlvbihsb2NhdGlvbnNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChGZWF0dXJlW10pIHJlc3VsdC50b0FycmF5KG5ldyBGZWF0dXJlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lCdW5kbGVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZhYTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZUFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVBZHZpY2UgZXh0ZW5kcyBJUHVibGlzaGluZ0FkdmljZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZXh0cmEgcHJvcGVydGllcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIElVIGZvciB0aGUgYnVuZGxlCi0JICogYXQgdGhlIGdpdmVuIGxvY2F0aW9uCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmVhdHVyZSB0byBhZHZpc2UKLQkgKiBAcmV0dXJuIGV4dHJhIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBmZWF0dXJlCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhGaWxlIGxvY2F0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZVNoYXBlQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lCdW5kbGVTaGFwZUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBkOTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZVNoYXBlQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5CdW5kbGVEZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1bmRsZVNoYXBlQWR2aWNlIGV4dGVuZHMgSVB1Ymxpc2hpbmdBZHZpY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9IEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5ESVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSID0gQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5LkpBUjsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUNvbmZpZ0FkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQ29uZmlnQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDY1MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQ29uZmlnQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGluZ0FkdmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ0FkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvbmZpZ19hZHZpY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZXMoKTsKLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUZlYXR1cmVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUZlYXR1cmVBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYTgyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lGZWF0dXJlQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXMuRmVhdHVyZTsKLQotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZUFkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBleHRyYSBwcm9wZXJ0aWVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVUgZm9yIHRoZSBmZWF0dXJlCi0JICogYXQgdGhlIGdpdmVuIGxvY2F0aW9uCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmVhdHVyZSB0byBhZHZpc2UKLQkgKiBAcmV0dXJuIGV4dHJhIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBmZWF0dXJlCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhGZWF0dXJlIGZlYXR1cmUsIEZpbGUgbG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JTGF1bmNoaW5nQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lMYXVuY2hpbmdBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhYWYwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lMYXVuY2hpbmdBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hpbmdBZHZpY2UgZXh0ZW5kcyBJUHVibGlzaGluZ0FkdmljZSB7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Vk1Bcmd1bWVudHMoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lSb290RmlsZXNBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RGaWxlc0FkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg3NTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RGaWxlc0FkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSb290RmlsZXNBZHZpY2UgZXh0ZW5kcyBJUHVibGlzaGluZ0FkdmljZSB7Ci0KLQlwdWJsaWMgRmlsZSBnZXRSb290KCk7Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEluY2x1ZGVkRmlsZXMoKTsKLQotCXB1YmxpYyBGaWxlW10gZ2V0RXhjbHVkZWRGaWxlcygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lSb290SVVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RJVUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY4ZTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RJVUFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJvb3RJVUFkdmljZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSByb290IGZvciB0aGlzIHB1Ymxpc2hpbmcgb3BlcmF0aW9uLgotCSAqIFJldHVybmVkIGVsZW1lbnRzIGFyZSBlaXRoZXIgdGhlIFN0cmluZyBpZCBvZiB0aGUgSVVzIG9yIHRoZSBJVXMgdGhlbXNlbHZlcy4KLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lWZXJzaW9uQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lWZXJzaW9uQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2NlYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JVmVyc2lvbkFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVZlcnNpb25BZHZpY2UgZXh0ZW5kcyBJUHVibGlzaGluZ0FkdmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ2ZXJzaW9uX2FkdmljZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19CVU5ETEUgPSAiYnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX0ZFQVRVUkUgPSAiZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19ST09UID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIGFkdmljZSBmb3IgdGhlIGdpdmVuIGlkIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0JICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIGluIHdoaWNoIHRvIGxvb2sgZm9yIGFkdmljZQotCSAqIEBwYXJhbSBpZCB0aGUgaXRlbSBmb3Igd2hpY2ggYWR2aWNlIGlzIHNvdWdodAotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gYWR2aWNlIGZvdW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2ZXJzaW9uIGFkdmljZSBmb3IgdGhlIGdpdmVuIGlkIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0JICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIGluIHdoaWNoIHRvIGxvb2sgZm9yIGFkdmljZQotCSAqIEBwYXJhbSBpZCB0aGUgaXRlbSBmb3Igd2hpY2ggYWR2aWNlIGlzIHNvdWdodAotCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIGFkdmljZSBmb3IgdGhlIGdpdmVuIGlkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSBhZHZpY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9KUkVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSlJFQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOTNlOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9KUkVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKUkVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBGaWxlIGxvY2F0aW9uOwotCi0JcHVibGljIEpSRUFjdGlvbihJUHVibGlzaGVySW5mbyBpbmZvLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFydGlmYWN0ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlSlJFRGF0YShsb2NhdGlvbiwgcmVzdWx0cyk7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsKQotCQkJcHVibGlzaEFydGlmYWN0KGFydGlmYWN0LCBuZXcgRmlsZVtdIHtsb2NhdGlvbn0sIGluZm8sIElOQ0xVREVfUk9PVCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9MYXVuY2hpbmdBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTGF1bmNoaW5nQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDk5OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9MYXVuY2hpbmdBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTGF1bmNoZXJEYXRhOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoaW5nQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RBZHZpY2UgaW1wbGVtZW50cyBJTGF1bmNoaW5nQWR2aWNlIHsKLQotCXByaXZhdGUgTGF1bmNoZXJEYXRhIGRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYzsKLQotCXB1YmxpYyBMYXVuY2hpbmdBZHZpY2UoTGF1bmNoZXJEYXRhIGRhdGEsIFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCXRoaXMuY29uZmlnU3BlYyA9IGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdTcGVjKCkgewotCQlyZXR1cm4gY29uZmlnU3BlYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0UHJvZ3JhbUFyZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Vk1Bcmd1bWVudHMoKSB7Ci0JCXJldHVybiBkYXRhLmdldEp2bUFyZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGVOYW1lKCkgewotCQlyZXR1cm4gZGF0YS5nZXRMYXVuY2hlck5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTG9jYWxVcGRhdGVTaXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0xvY2FsVXBkYXRlU2l0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjhiZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTG9jYWxVcGRhdGVTaXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLlVwZGF0ZVNpdGU7Ci0KLS8qKgotICogQSBwdWJsaXNoaW5nIGFjdGlvbiB0aGF0IHByb2Nlc3NlcyBhIGxvY2FsIChGaWxlLWJhc2VkKSB1cGRhdGUgc2l0ZSBhbmQgZ2VuZXJhdGVzCi0gKiBtZXRhZGF0YSBhbmQgYXJ0aWZhY3RzIGZvciB0aGUgZmVhdHVyZXMsIGJ1bmRsZXMgYW5kIHNpdGUgaW5kZXggKGNhdGVnb3JpZXMgZXRjKS4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsVXBkYXRlU2l0ZUFjdGlvbiBpbXBsZW1lbnRzIElQdWJsaXNoaW5nQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZTsKLQlwcml2YXRlIFVwZGF0ZVNpdGUgdXBkYXRlU2l0ZTsKLQotCXByb3RlY3RlZCBMb2NhbFVwZGF0ZVNpdGVBY3Rpb24oKSB7Ci0JfQotCi0JcHVibGljIExvY2FsVXBkYXRlU2l0ZUFjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCX0KLQotCXB1YmxpYyBMb2NhbFVwZGF0ZVNpdGVBY3Rpb24oVXBkYXRlU2l0ZSB1cGRhdGVTaXRlKSB7Ci0JCXRoaXMudXBkYXRlU2l0ZSA9IHVwZGF0ZVNpdGU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJSVB1Ymxpc2hpbmdBY3Rpb25bXSBhY3Rpb25zID0gY3JlYXRlQWN0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlhY3Rpb25zW2ldLnBlcmZvcm0oaW5mbywgcmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbltdIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWNyZWF0ZUFkdmljZSgpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjcmVhdGUgYW4gYWN0aW9uIHRoYXQganVzdCBwdWJsaXNoZXMgdGhlIHJhdyBidW5kbGVzIGFuZCBmZWF0dXJlcwotCQlJUHVibGlzaGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgTWVyZ2VSZXN1bHRzQWN0aW9uKG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHtjcmVhdGVGZWF0dXJlc0FjdGlvbigpLCBjcmVhdGVCdW5kbGVzQWN0aW9uKCl9LCBJUHVibGlzaGVyUmVzdWx0Lk1FUkdFX0FMTF9OT05fUk9PVCk7Ci0JCXJlc3VsdC5hZGQoYWN0aW9uKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVTaXRlWE1MQWN0aW9uKCkpOwotCQlyZXR1cm4gKElQdWJsaXNoaW5nQWN0aW9uW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHVibGlzaGluZ0FjdGlvbltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVTaXRlWE1MQWN0aW9uKCkgewotCQlpZiAodXBkYXRlU2l0ZSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBTaXRlWE1MQWN0aW9uKHVwZGF0ZVNpdGUpOwotCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBTaXRlWE1MQWN0aW9uKG5ldyBGaWxlKHNvdXJjZSwgInNpdGUueG1sIikudG9VUkwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbmV2ZXIgaGFwcGVucwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBZHZpY2UoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUZlYXR1cmVzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVzQWN0aW9uKG5ldyBGaWxlW10ge25ldyBGaWxlKHNvdXJjZSwgImZlYXR1cmVzIil9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVCdW5kbGVzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEJ1bmRsZXNBY3Rpb24obmV3IEZpbGVbXSB7bmV3IEZpbGUoc291cmNlLCAicGx1Z2lucyIpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTWVyZ2VSZXN1bHRzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL01lcmdlUmVzdWx0c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThjY2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTWVyZ2VSZXN1bHRzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci0KLXB1YmxpYyBjbGFzcyBNZXJnZVJlc3VsdHNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBJUHVibGlzaGluZ0FjdGlvbltdIGFjdGlvbnM7Ci0JcHJpdmF0ZSBpbnQgbW9kZTsKLQotCXB1YmxpYyBNZXJnZVJlc3VsdHNBY3Rpb24oSVB1Ymxpc2hpbmdBY3Rpb25bXSBhY3Rpb25zLCBpbnQgbW9kZSkgewotCQl0aGlzLmFjdGlvbnMgPSBhY3Rpb25zOwotCQl0aGlzLm1vZGUgPSBtb2RlOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSVB1Ymxpc2hpbmdBY3Rpb24gYWN0aW9uID0gYWN0aW9uc1tpXTsKLQkJCUlQdWJsaXNoZXJSZXN1bHQgcmVzdWx0ID0gbmV3IFB1Ymxpc2hlclJlc3VsdCgpOwotCQkJYWN0aW9uLnBlcmZvcm0oaW5mbywgcmVzdWx0KTsKLQkJCXJlc3VsdHMubWVyZ2UocmVzdWx0LCBtb2RlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Byb2R1Y3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVlYTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGVyUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLlByb2R1Y3RGaWxlOwotCi1wdWJsaWMgY2xhc3MgUHJvZHVjdEFjdGlvbiBleHRlbmRzIEVjbGlwc2VJbnN0YWxsQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3RMb2NhdGlvbjsKLQlwcml2YXRlIEZpbGUgZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb247Ci0KLQlwdWJsaWMgUHJvZHVjdEFjdGlvbihTdHJpbmcgc291cmNlLCBTdHJpbmcgcHJvZHVjdExvY2F0aW9uLCBTdHJpbmcgZmxhdm9yLCBGaWxlIGV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLmZsYXZvciA9IGZsYXZvcjsKLQkJdGhpcy5leGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbiA9IGV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uOwotCQl0aGlzLnByb2R1Y3RMb2NhdGlvbiA9IHByb2R1Y3RMb2NhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKCkgewotCQkvLyBnZW5lcmF0ZSB0aGUgYWR2aWNlIHdlIGNhbiB1cCBmcm9udC4KLQkJY3JlYXRlQWR2aWNlKCk7Ci0KLQkJLy8gY3JlYXRlIGFsbCB0aGUgYWN0aW9ucyBuZWVkZWQgdG8gcHVibGlzaCBhIHByb2R1Y3QKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gaWYgd2UgaGF2ZSBhIHNvdXJjZSBsb2NhdGlvbiB0aGVuIGNyZWF0ZSBhY3Rpb25zIHRoYXQgcHVibGlzaGVzIHRoZSBidW5kbGVzIAotCQkvLyBhbmQgZmVhdHVyZXMgYXMgd2VsbCBhcyB0aGUgcm9vdCBmaWxlcywgbGF1bmNoZXJzLCBldGMuCi0JCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJSVB1Ymxpc2hpbmdBY3Rpb24gYWN0aW9uID0gbmV3IE1lcmdlUmVzdWx0c0FjdGlvbihuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7Y3JlYXRlRmVhdHVyZXNBY3Rpb24oKSwgY3JlYXRlQnVuZGxlc0FjdGlvbigpfSwgSVB1Ymxpc2hlclJlc3VsdC5NRVJHRV9BTExfTk9OX1JPT1QpOwotCQkJcmVzdWx0LmFkZChhY3Rpb24pOwotCQkJcmVzdWx0LmFkZChjcmVhdGVFcXVpbm94TGF1bmNoZXJGcmFnbWVudHNBY3Rpb24oKSk7Ci0JCX0KLQkJLy8gcHJvZHVjdHMgaW5jbHVkZSB0aGUgZXhlY3V0YWJsZSBzbyBhZGQgYWN0aW9ucyB0byBwdWJsaXNoIHRoZW0KLQkJcmVzdWx0LmFkZEFsbChjcmVhdGVFeGVjdXRhYmxlc0FjdGlvbnMoaW5mby5nZXRDb25maWd1cmF0aW9ucygpKSk7Ci0JCS8vIGFkZCB0aGUgYWN0aW9ucyB0aGF0IGp1c3QgY29uZmlndXJlIHRoaW5ncy4KLQkJcmVzdWx0LmFkZChjcmVhdGVKUkVBY3Rpb24oKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlQ29uZmlnQ1VzQWN0aW9uKCkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZURlZmF1bHRDVXNBY3Rpb24oKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlUm9vdElVQWN0aW9uKCkpOwotCQlyZXR1cm4gKElQdWJsaXNoaW5nQWN0aW9uW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHVibGlzaGluZ0FjdGlvbltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9kdWN0RmlsZSBsb2FkUHJvZHVjdCgpIHsKLQkJUHJvZHVjdEZpbGUgcHJvZHVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9kdWN0ID0gbmV3IFByb2R1Y3RGaWxlKHByb2R1Y3RMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8KLQkJfQotCQlpZiAocHJvZHVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5hYmxlIHRvIGxvYWQgcHJvZHVjdCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHByb2R1Y3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkdmljZSgpIHsKLQkJUHJvZHVjdEZpbGUgcHJvZHVjdCA9IGxvYWRQcm9kdWN0KCk7Ci0JCWNyZWF0ZVByb2R1Y3RBZHZpY2UocHJvZHVjdCk7Ci0JCWNyZWF0ZVJvb3RBZHZpY2UocHJvZHVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdEFkdmljZShQcm9kdWN0RmlsZSBwcm9kdWN0KSB7Ci0JCUNvbGxlY3Rpb24gbGlzdDsKLQkJaWYgKHByb2R1Y3QudXNlRmVhdHVyZXMoKSkKLQkJCWxpc3QgPSBsaXN0RWxlbWVudHMocHJvZHVjdC5nZXRGZWF0dXJlcygpLCAiLmZlYXR1cmUuZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlsaXN0ID0gbGlzdEVsZW1lbnRzKHByb2R1Y3QuZ2V0QnVuZGxlcyh0cnVlKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWluZm8uYWRkQWR2aWNlKG5ldyBSb290SVVBZHZpY2UobGlzdCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9kdWN0QWR2aWNlKFByb2R1Y3RGaWxlIHByb2R1Y3QpIHsKLQkJaWQgPSBwcm9kdWN0LmdldElkKCk7Ci0JCXZlcnNpb24gPSBwcm9kdWN0LmdldFZlcnNpb24oKTsKLQkJbmFtZSA9IHByb2R1Y3QuZ2V0SWQoKTsKLQotCQlTdHJpbmdbXSBjb25maWdTcGVjcyA9IGluZm8uZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTcGVjcy5sZW5ndGg7IGkrKykKLQkJCWluZm8uYWRkQWR2aWNlKG5ldyBQcm9kdWN0RmlsZUFkdmljZShwcm9kdWN0LCBjb25maWdTcGVjc1tpXSkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUV4ZWN1dGFibGVzQWN0aW9ucyhTdHJpbmdbXSBjb25maWdTcGVjcykgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY29uZmlnU3BlY3MubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTcGVjcy5sZW5ndGg7IGkrKykgewotCQkJRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGV4ZWN1dGFibGVzID0gY29tcHV0ZUV4ZWN1dGFibGVzKGNvbmZpZ1NwZWNzW2ldKTsKLQkJCUlQdWJsaXNoaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBCcmFuZGVkRXhlY3V0YWJsZUFjdGlvbihleGVjdXRhYmxlcywgcHJvZHVjdExvY2F0aW9uLCBmbGF2b3IsIGNvbmZpZ1NwZWNzW2ldKTsKLQkJCXJlc3VsdC5hZGQoYWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY29tcHV0ZUV4ZWN1dGFibGVzKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCS8vIGlmIHdlIGtub3cgYWJvdXQgdGhlIGV4ZWN1dGFibGVzIGZlYXR1cmUgdGhlbiB1c2UgaXQgYXMgdGhlIHNvdXJjZQotCQlGaWxlIGxvY2F0aW9uID0gZ2V0RXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUV4ZWN1dGFibGVzRGVzY3JpcHRvciByZXN1bHQgPSBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IuY3JlYXRlRXhlY3V0YWJsZXNGcm9tRmVhdHVyZShsb2NhdGlvbiwgY29uZmlnU3BlYyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkvLyBvdGhlcndpc2UsIGFzc3VtZSB0aGF0IHdlIGFyZSBydW5uaW5nIGFnYWluc3QgYW4gRWNsaXBzZSBpbnN0YWxsIGFuZCBkbyB0aGUgZGVmYXVsdCB0aGluZwotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUV4ZWN1dGFibGVzKGNvbmZpZ1NwZWMpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRFeGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbigpIHsKLQkJaWYgKGV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb247Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBUaGUgZXhlY3V0YWJsZXMgd2VyZSBub3QgZXhwbGljaXRseSBsb2NhdGVkIGJ1dCB0aGUgc291cmNlIHdhcyBzbyBwb2tlIGFyb3VuZCBhbmQgc2VlIGlmIAotCQkvLyB3ZSBjYW4gZmluZCBzb21ldGhpbmcKLQkJLy8gVE9ETyBpbXBsZW1lbnQgdGhpcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbGlzdEVsZW1lbnRzKExpc3QgZWxlbWVudHMsIFN0cmluZyBzdWZmaXgpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZCgoKFN0cmluZykgaS5uZXh0KCkpICsgc3VmZml4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEZpbGVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEZpbGVBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlN2ZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Byb2R1Y3RGaWxlQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLkFic3RyYWN0UHVibGlzaGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlcy5Qcm9kdWN0RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5Db25maWdEYXRhOwotCi0vKioKLSAqIFByb3ZpZGUgYWR2aWNlIGRlcml2ZWQgZnJvbSB0aGUgLnByb2R1Y3QgZmlsZS4gIFRoZSBwcm9kdWN0IGNhbiBnaXZlIHNvbWUgaW5mbyBvbiAKLSAqIGxhdW5jaGluZyBhcyB3ZWxsIGFzIHRoZSBjb25maWd1cmF0aW9uIChidW5kbGVzLCBwcm9wZXJ0aWVzLCAuLi4pCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9kdWN0RmlsZUFkdmljZSBleHRlbmRzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSUxhdW5jaGluZ0FkdmljZSwgSUNvbmZpZ0FkdmljZSB7Ci0KLQlwcml2YXRlIFByb2R1Y3RGaWxlIHByb2R1Y3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYzsKLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIENvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG51bGw7Ci0KLQlwdWJsaWMgUHJvZHVjdEZpbGVBZHZpY2UoUHJvZHVjdEZpbGUgcHJvZHVjdCwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJdGhpcy5wcm9kdWN0ID0gcHJvZHVjdDsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQkJb3MgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24ucGFyc2VDb25maWdTcGVjKGNvbmZpZ1NwZWMpWzFdOwotCQljb25maWdEYXRhID0gZ2V0Q29uZmlnRGF0YSgpOwotCX0KLQotCXByaXZhdGUgQ29uZmlnRGF0YSBnZXRDb25maWdEYXRhKCkgewotCQlEYXRhTG9hZGVyIGxvYWRlciA9IGNyZWF0ZURhdGFMb2FkZXIoKTsKLQkJQ29uZmlnRGF0YSByZXN1bHQ7Ci0JCWlmIChsb2FkZXIgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGxvYWRlci5nZXRDb25maWdEYXRhKCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IGdlbmVyYXRlQ29uZmlnRGF0YSgpOwotCQlyZXN1bHQuc2V0RndJbmRlcGVuZGVudFByb3AoImVjbGlwc2UucHJvZHVjdCIsIHByb2R1Y3QuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxvY2F0aW9uID0gZ2V0U3BsYXNoTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXN1bHQuc2V0RndJbmRlcGVuZGVudFByb3AoIm9zZ2kuc3BsYXNoUGF0aCIsIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29uZmlnRGF0YSBnZW5lcmF0ZUNvbmZpZ0RhdGEoKSB7Ci0JCUNvbmZpZ0RhdGEgcmVzdWx0ID0gbmV3IENvbmZpZ0RhdGEobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWlmIChwcm9kdWN0LnVzZUZlYXR1cmVzKCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIFRPRE8gbmVlZCB0byBkbyBzb21ldGhpbmcgbW9yZSBpbnRlcmVzdGluZyBoZXJlLiAgV2hhdCBpZiB1cGRhdGUuY29uZmlnIGlzIGFyb3VuZD8KLQkJLy8gd2hhdCBpZiB0aGUgcHJvZHVjdCBpcyBwMiBiYXNlZCBvciBzaW1wbGVjb25maWcgaXMgaW4gdGhlIGxpc3Q/Ci0JCUxpc3QgYnVuZGxlcyA9IHByb2R1Y3QuZ2V0QnVuZGxlcyh0cnVlKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYnVuZGxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gbmV3IEJ1bmRsZUluZm8oKTsKLQkJCWJ1bmRsZUluZm8uc2V0U3ltYm9saWNOYW1lKGlkKTsKLQkJCXJlc3VsdC5hZGRCdW5kbGUoYnVuZGxlSW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTcGxhc2hMb2NhdGlvbigpIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgdGhpcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1NwZWMoKSB7Ci0JCXJldHVybiBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9ncmFtQXJndW1lbnRzKCkgewotCQlTdHJpbmcgbGluZSA9IHByb2R1Y3QuZ2V0UHJvZ3JhbUFyZ3VtZW50cyhvcyk7Ci0JCXJldHVybiBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uZ2V0QXJyYXlGcm9tU3RyaW5nKGxpbmUsICIgIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Vk1Bcmd1bWVudHMoKSB7Ci0JCVN0cmluZyBsaW5lID0gcHJvZHVjdC5nZXRWTUFyZ3VtZW50cyhvcyk7Ci0JCXJldHVybiBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uZ2V0QXJyYXlGcm9tU3RyaW5nKGxpbmUsICIgIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaENvbmZpZyhTdHJpbmcgc3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCkgewotCQlTdHJpbmcgdGFyZ2V0T1MgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24ucGFyc2VDb25maWdTcGVjKHNwZWMpWzFdOwotCQlyZXR1cm4gb3MuZXF1YWxzKHRhcmdldE9TKTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZXMoKSB7Ci0JCXJldHVybiBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXJlc3VsdC5wdXRBbGwoY29uZmlnRGF0YS5nZXRGd0RlcGVuZGVudFByb3BzKCkpOwotCQlyZXN1bHQucHV0QWxsKGNvbmZpZ0RhdGEuZ2V0RndJbmRlcGVuZGVudFByb3BzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRGF0YUxvYWRlciBjcmVhdGVEYXRhTG9hZGVyKCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBwcm9kdWN0LmdldENvbmZpZ0luaVBhdGgob3MpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCWxvY2F0aW9uID0gcHJvZHVjdC5nZXRDb25maWdJbmlQYXRoKG51bGwpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCWlmICghY29uZmlnRmlsZS5pc0Fic29sdXRlKCkpCi0JCQljb25maWdGaWxlID0gbmV3IEZpbGUocHJvZHVjdC5nZXRMb2NhdGlvbigpLmdldFBhcmVudEZpbGUoKSwgbG9jYXRpb24pOwotCQkvLyBUT0RPIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciB0aGUgbGF1bmNoZXIgbG9jYXRpb24gaGVyZS4uLgotCQkvLyBmb3Igbm93IGp1c3QgZ2l2ZSBhbnkgb2xkIHBhdGggdGhhdCBoYXMgYSBwYXJlbnQKLQkJcmV0dXJuIG5ldyBEYXRhTG9hZGVyKGNvbmZpZ0ZpbGUsIG5ldyBGaWxlKHByb2R1Y3QuZ2V0TGF1bmNoZXJOYW1lKCkpLmdldEFic29sdXRlRmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGVOYW1lKCkgewotCQlyZXR1cm4gcHJvZHVjdC5nZXRMYXVuY2hlck5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RGaWxlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290RmlsZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2NjU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RGaWxlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFJvb3RGaWxlc0FjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWRCYXNlOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb25TcGVjID0gIjEuMC4wIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQotCXB1YmxpYyBSb290RmlsZXNBY3Rpb24oSVB1Ymxpc2hlckluZm8gaW5mbywgU3RyaW5nIGlkQmFzZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBmbGF2b3IpIHsKLQkJdGhpcy5pZEJhc2UgPSBpZEJhc2UgPT0gbnVsbCA/ICJvcmcuZWNsaXBzZSIgOiBpZEJhc2U7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMgbm90IHRoZSBkZWZhdWx0ICJyZXBsYWNlIG1lIiB2ZXJzaW9uIHRoZW4gc2F2ZSBpdAotCQlpZiAodmVyc2lvbiAhPSBudWxsICYmICF2ZXJzaW9uLmVxdWFscygiMC4wLjAiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy52ZXJzaW9uU3BlYyA9IHZlcnNpb247Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ1NwZWNzID0gaW5mby5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ1NwZWNzLmxlbmd0aDsgaSsrKQotCQkJZ2VuZXJhdGVSb290RmlsZUlVcyhjb25maWdTcGVjc1tpXSwgaW5mbywgcmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBJVXMgYW5kIENVcyBmb3IgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgcm9vdCBmaWxlcyBmb3IgYSBnaXZlbgotCSAqIHdzL29zL2FyY2ggY29tYmluYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVSb290RmlsZUlVcyhTdHJpbmcgY29uZmlnU3BlYywgSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBJVSBmb3IgdGhlIGV4ZWN1dGFibGUKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGlkUHJlZml4ID0gaWRCYXNlICsgIi5yb290ZmlsZXMiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpdUlkID0gaWRQcmVmaXggKyAnLicgKyBjcmVhdGVJZFN0cmluZyhjb25maWdTcGVjKTsKLQkJaXUuc2V0SWQoaXVJZCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb25TcGVjKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJU3RyaW5nIGZpbHRlciA9IGNyZWF0ZUZpbHRlclNwZWMoY29uZmlnU3BlYyk7Ci0JCWl1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlTGF1bmNoZXJBcnRpZmFjdEtleShpdUlkLCB2ZXJzaW9uKTsKLQkJaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5IGxhdW5jaGVyQ2FwYWJpbGl0eSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoZmxhdm9yICsgaWRCYXNlLCBpZFByZWZpeCwgdmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoaXVJZCwgdmVyc2lvbiksIGxhdW5jaGVyQ2FwYWJpbGl0eX0pOwotCQlyZXN1bHQuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDVSB0aGF0IGluc3RhbGxzL2NvbmZpZ3VyZXMgdGhlIGV4ZWN1dGFibGUKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdVbml0SWQgPSBmbGF2b3IgKyBpdUlkOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQljdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQljdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJY3Uuc2V0SG9zdChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1SWQsIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQotCQkvL1RPRE8gYnVnIDIxODg5MCwgd291bGQgbGlrZSB0aGUgZnJhZ21lbnQgdG8gcHJvdmlkZSB0aGUgbGF1bmNoZXIgY2FwYWJpbGl0eSBhcyB3ZWxsLCBidXQgY2FuJ3QgcmlnaHQgbm93LgotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIHZlcnNpb24pfSk7Ci0KLQkJY3Uuc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAidW56aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bkNvbmZpZ3VyYXRpb25EYXRhID0gImNsZWFudXB6aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCB1bkNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSk7Ci0JCXJlc3VsdC5hZGRJVSh1bml0LCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCi0JCS8vQ3JlYXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yLiAgd2UgaGF2ZSBzZXZlcmFsIGZpbGVzIHNvIG5vIHBhdGggb24gZGlzawotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVBcnRpZmFjdERlc2NyaXB0b3Ioa2V5LCBudWxsKTsKLQkJSVJvb3RGaWxlc0FkdmljZSBhZHZpY2UgPSBnZXRBZHZpY2UoY29uZmlnU3BlYywgaW5mbyk7Ci0JCXB1Ymxpc2hBcnRpZmFjdChkZXNjcmlwdG9yLCBmaWx0ZXJSb290RmlsZXMoYWR2aWNlLCBpbmZvKSwgYWR2aWNlLmdldFJvb3QoKSwgaW5mbywgSU5DTFVERV9ST09UKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBmaWx0ZXJSb290RmlsZXMoSVJvb3RGaWxlc0FkdmljZSBhZHZpY2UsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJRmlsZVtdIGluY2x1c2lvbnMgPSBhZHZpY2UuZ2V0SW5jbHVkZWRGaWxlcygpOwotCQlTZXQgZXhjbHVzaW9ucyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoYWR2aWNlLmdldEV4Y2x1ZGVkRmlsZXMoKSkpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1c2lvbnMubGVuZ3RoOyBpKyspCi0JCQlmaWx0ZXJGaWxlKGluY2x1c2lvbnNbaV0sIGV4Y2x1c2lvbnMsIHJlc3VsdCk7Ci0JCXJldHVybiAoRmlsZVtdKSByZXN1bHQudG9BcnJheShuZXcgRmlsZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbHRlckZpbGUoRmlsZSBpbmNsdXNpb24sIENvbGxlY3Rpb24gZXhjbHVzaW9ucywgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlpZiAoZXhjbHVzaW9ucyA9PSBudWxsIHx8ICFleGNsdXNpb25zLmNvbnRhaW5zKGluY2x1c2lvbikpCi0JCQlpZiAoaW5jbHVzaW9uLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlW10gbGlzdCA9IGluY2x1c2lvbi5saXN0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQkJCWZpbHRlckZpbGUobGlzdFtpXSwgZXhjbHVzaW9ucywgcmVzdWx0KTsKLQkJCX0gZWxzZQotCQkJCXJlc3VsdC5hZGQoaW5jbHVzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIElSb290RmlsZXNBZHZpY2UgZ2V0QWR2aWNlKFN0cmluZyBjb25maWdTcGVjLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUNvbGxlY3Rpb24gYWR2aWNlID0gaW5mby5nZXRBZHZpY2UoY29uZmlnU3BlYywgdHJ1ZSwgbnVsbCwgbnVsbCwgSVJvb3RGaWxlc0FkdmljZS5jbGFzcyk7Ci0JCUFycmF5TGlzdCBpbmNsdXNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgZXhjbHVzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSByb290ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gYWR2aWNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVJvb3RGaWxlc0FkdmljZSBlbnRyeSA9IChJUm9vdEZpbGVzQWR2aWNlKSBpLm5leHQoKTsKLQkJCS8vIFRPRE8gZm9yIG5vdyB3ZSBzaW1wbHkgZ2V0IHJvb3QgZnJvbSB0aGUgZmlyc3QgYWR2aWNlIHRoYXQgaGFzIG9uZQotCQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCQlyb290ID0gZW50cnkuZ2V0Um9vdCgpOwotCQkJRmlsZVtdIGxpc3QgPSBlbnRyeS5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCWluY2x1c2lvbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QobGlzdCkpOwotCQkJbGlzdCA9IGVudHJ5LmdldEV4Y2x1ZGVkRmlsZXMoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJZXhjbHVzaW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsaXN0KSk7Ci0JCX0KLQkJRmlsZVtdIGluY2x1ZGVMaXN0ID0gKEZpbGVbXSkgaW5jbHVzaW9ucy50b0FycmF5KG5ldyBGaWxlW2luY2x1c2lvbnMuc2l6ZSgpXSk7Ci0JCUZpbGVbXSBleGNsdWRlTGlzdCA9IChGaWxlW10pIGV4Y2x1c2lvbnMudG9BcnJheShuZXcgRmlsZVtleGNsdXNpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gbmV3IFJvb3RGaWxlc0FkdmljZShyb290LCBpbmNsdWRlTGlzdCwgZXhjbHVkZUxpc3QsIGNvbmZpZ1NwZWMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290RmlsZXNBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdEZpbGVzQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMjI5NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290RmlsZXNBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFJvb3RGaWxlc0FkdmljZSBleHRlbmRzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSVJvb3RGaWxlc0FkdmljZSB7Ci0JcHJpdmF0ZSBGaWxlIHJvb3Q7Ci0JcHJpdmF0ZSBGaWxlW10gZXhjbHVkZWRGaWxlczsKLQlwcml2YXRlIEZpbGVbXSBpbmNsdWRlZEZpbGVzOwotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ1NwZWM7Ci0KLQlwdWJsaWMgUm9vdEZpbGVzQWR2aWNlKEZpbGUgcm9vdCwgRmlsZVtdIGluY2x1ZGVkRmlsZXMsIEZpbGVbXSBleGNsdWRlZEZpbGVzLCBTdHJpbmcgY29uZmlnU3BlYykgewotCQl0aGlzLnJvb3QgPSByb290OwotCQl0aGlzLmV4Y2x1ZGVkRmlsZXMgPSBleGNsdWRlZEZpbGVzOwotCQl0aGlzLmluY2x1ZGVkRmlsZXMgPSBpbmNsdWRlZEZpbGVzOwotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnU3BlYygpIHsKLQkJcmV0dXJuIGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHVibGljIEZpbGVbXSBnZXRFeGNsdWRlZEZpbGVzKCkgewotCQlyZXR1cm4gZXhjbHVkZWRGaWxlczsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEluY2x1ZGVkRmlsZXMoKSB7Ci0JCXJldHVybiBpbmNsdWRlZEZpbGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290SVVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdElVQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzlhODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290SVVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuSVF1ZXJ5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIENyZWF0ZSBhIHRvcCBsZXZlbCBJVSB0aGF0IGxpc3RzIGFsbCB0aGUgY3VycmVudCByb290cyBhcyB3ZWxsIGFzIGFueSBleHBsaWNpdGx5IGlkZW50aWZpZWQKLSAqIHRvcCBsZXZlbCBJVXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290SVVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSVF1ZXJ5YWJsZSByZXBvc2l0b3JpZXM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHZlcnNpb25BZHZpY2U7Ci0JcHJpdmF0ZSBJUHVibGlzaGVySW5mbyBpbmZvOwotCi0JcHVibGljIFJvb3RJVUFjdGlvbihTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbmFtZSwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJZ2VuZXJhdGVSb290SVUocmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUm9vdElVKElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyZXN1bHQpOwotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjcmlwdG9yID0gY3JlYXRlVG9wTGV2ZWxJVURlc2NyaXB0aW9uKGNoaWxkcmVuLCBpZCwgdmVyc2lvbiwgbmFtZSwgbnVsbCwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IHJvb3RJVSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoZGVzY3JpcHRvcik7Ci0JCWlmIChyb290SVUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcmVzdWx0LmFkZElVKHJvb3RJVSwgSVB1Ymxpc2hlclJlc3VsdC5OT05fUk9PVCk7Ci0KLQkJLy8gVE9ETyB3aHkgZG8gd2UgY3JlYXRlIGEgY2F0ZWdvcnkgaGVyZT8KLQkJLy8JCXJlc3VsdC5hZGRJVShnZW5lcmF0ZURlZmF1bHRDYXRlZ29yeShyb290SVUsIHJvb3RDYXRlZ29yeSksIElQdWJsaXNoZXJSZXN1bHQuTk9OX1JPT1QpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQkvLyBnZXQgYW55IHJvb3RzIHRoYXQgd2UgaGF2ZSBhY2N1bW11bGF0ZWQgc28gZmFyIGFuZCBzZWFyY2ggZm9yCi0JCS8vIGNoaWxkcmVuIGZyb20gdGhlIGFkdmljZS4KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHJlc3VsdC5nZXRJVXMobnVsbCwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJQ29sbGVjdGlvbiByb290QWR2aWNlID0gaW5mby5nZXRBZHZpY2UobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCwgSVJvb3RJVUFkdmljZS5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHJvb3RBZHZpY2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJUm9vdElVQWR2aWNlIGFkdmljZSA9IChJUm9vdElVQWR2aWNlKSBpLm5leHQoKTsKLQkJCUNvbGxlY3Rpb24gbGlzdCA9IGFkdmljZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCQlmb3IgKEl0ZXJhdG9yIGogPSBsaXN0Lml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gai5uZXh0KCk7Ci0JCQkJCS8vIGlmIHRoZSBhZHZpY2UgaXMgYSBzdHJpbmcsIGxvb2sgaXQgdXAgaW4gdGhlIHJlc3VsdC4gIGlmIG5vdCB0aGVyZSB0aGVuIAotCQkJCQkvLyBxdWVyeSB0aGUga25vd24gbWV0YWRhdGEgcmVwb3MKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJU3RyaW5nIGNoaWxkSWQgPSAoU3RyaW5nKSBvYmplY3Q7Ci0JCQkJCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gcmVzdWx0LmdldElVKGNoaWxkSWQsIG51bGwpOwotCQkJCQkJaWYgKGl1ID09IG51bGwpCi0JCQkJCQkJaXUgPSBxdWVyeUZvcihjaGlsZElkKTsKLQkJCQkJCWlmIChpdSAhPSBudWxsKQotCQkJCQkJCWNoaWxkcmVuLmFkZChpdSk7Ci0JCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmplY3QpOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogTG9vcCBvdmVyIHRoZSBrbm93biBtZXRhZGF0YSByZXBvc2l0b3JpZXMgbG9va2luZyBmb3IgdGhlIGdpdmVuIElVLgotCSAqIFJldHVybiB0aGUgZmlyc3QgSVUgZm91bmQuCi0JICogQHBhcmFtIGl1SWQgIHRoZSBpZCBvZiB0aGUgSVUgdG8gbG9vayBmb3IKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBtYXRjaGluZyBJVSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBxdWVyeUZvcihTdHJpbmcgaXVJZCkgewotCQlJbnN0YWxsYWJsZVVuaXRRdWVyeSBxdWVyeSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpdUlkLCBnZXRWZXJzaW9uQWR2aWNlKGl1SWQpKTsKLQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbGxlY3RvciByZXN1bHQgPSByZXBvc2l0b3JpZXMucXVlcnkocXVlcnksIG5ldyBDb2xsZWN0b3IoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmICghcmVzdWx0LmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdCkgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGNyZWF0ZVRvcExldmVsSVVEZXNjcmlwdGlvbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbmFtZSwgQ29sbGVjdGlvbiByZXF1aXJlcywgYm9vbGVhbiBjb25maWd1cmVMYXVuY2hlckRhdGEpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gcm9vdCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJcm9vdC5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCXJvb3Quc2V0SWQoaWQpOwotCQlyb290LnNldFZlcnNpb24obmV3IFZlcnNpb24odmVyc2lvbikpOwotCQlyb290LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBuYW1lKTsKLQotCQlBcnJheUxpc3QgcmVxdWlyZWRDYXBhYmlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVZlcnNpb25SYW5nZSByYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UoaXUuZ2V0VmVyc2lvbigpLCB0cnVlLCBpdS5nZXRWZXJzaW9uKCksIHRydWUpOwotCQkJLy8JCQlib29sZWFuIGlzT3B0aW9uYWwgPSBjaGVja09wdGlvbmFsUm9vdERlcGVuZGVuY3koaXUpOwotCQkJcmVxdWlyZWRDYXBhYmlsaXRpZXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIHJhbmdlLCBpdS5nZXRGaWx0ZXIoKSwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQkJaWYgKHJlcXVpcmVzICE9IG51bGwpCi0JCQlyZXF1aXJlZENhcGFiaWxpdGllcy5hZGRBbGwocmVxdWlyZXMpOwotCQlyb290LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVxdWlyZWRDYXBhYmlsaXRpZXMudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXVpcmVkQ2FwYWJpbGl0aWVzLnNpemUoKV0pKTsKLQkJcm9vdC5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVswXSk7Ci0KLQkJcm9vdC5zZXRQcm9wZXJ0eSgibGluZVVwIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJvb3Quc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihpZCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCQlyb290LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCXJvb3Quc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkoaWQsIG5ldyBWZXJzaW9uKHZlcnNpb24pKX0pOwotCQlyb290LnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfT1NHSSk7Ci0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgVmVyc2lvbiBnZXRWZXJzaW9uQWR2aWNlKFN0cmluZyBpZCkgewotCQlpZiAodmVyc2lvbkFkdmljZSA9PSBudWxsKSB7Ci0JCQl2ZXJzaW9uQWR2aWNlID0gaW5mby5nZXRBZHZpY2UobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCwgSVZlcnNpb25BZHZpY2UuY2xhc3MpOwotCQkJaWYgKHZlcnNpb25BZHZpY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSB2ZXJzaW9uQWR2aWNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVZlcnNpb25BZHZpY2UgYWR2aWNlID0gKElWZXJzaW9uQWR2aWNlKSBpLm5leHQoKTsKLQkJCS8vIFRPRE8gaGF2ZSB0byBmaWd1cmUgYSB3YXkgdG8ga25vdyB0aGUgbmFtZXNwYWNlIGhlcmUuICBmb3Igbm93IGp1c3QgbG9vayBldmVyeXdoZXJlCi0JCQlWZXJzaW9uIHJlc3VsdCA9IGFkdmljZS5nZXRWZXJzaW9uKElWZXJzaW9uQWR2aWNlLk5TX0JVTkRMRSwgaWQpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBhZHZpY2UuZ2V0VmVyc2lvbihJVmVyc2lvbkFkdmljZS5OU19GRUFUVVJFLCBpZCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RJVUFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290SVVBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4YzdhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RJVUFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBSb290SVVBZHZpY2UgZXh0ZW5kcyBBYnN0cmFjdEFkdmljZSBpbXBsZW1lbnRzIElSb290SVVBZHZpY2UgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JcHVibGljIFJvb3RJVUFkdmljZShDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9TaXRlWE1MQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1NpdGVYTUxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNGRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1NpdGVYTUxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEFjdGlvbiB3aGljaCBwcm9jZXNzZXMgYSBzaXRlLnhtbCBhbmQgZ2VuZXJhdGVzIGNhdGVnb3JpZXMuICBUaGUgY2F0ZWdvcml6YXRpb24gcHJvY2VzcwotICogcmVsaWVzIG9uIElVcyBmb3IgdGhlIHZhcmlvdXMgZmVhdHVyZXMgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVhNTEFjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIFVwZGF0ZVNpdGUgdXBkYXRlU2l0ZTsKLQlwcml2YXRlIFNpdGVDYXRlZ29yeSBkZWZhdWx0Q2F0ZWdvcnk7Ci0JcHJpdmF0ZSBIYXNoU2V0IGRlZmF1bHRDYXRlZ29yeVNldDsKLQotCXB1YmxpYyBTaXRlWE1MQWN0aW9uKFVSTCBsb2NhdGlvbikgewotCQl0cnkgewotCQkJdXBkYXRlU2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChsb2NhdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgU2l0ZVhNTEFjdGlvbihVcGRhdGVTaXRlIHVwZGF0ZVNpdGUpIHsKLQkJdGhpcy51cGRhdGVTaXRlID0gdXBkYXRlU2l0ZTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlkZWZhdWx0Q2F0ZWdvcnkgPSBuZXcgU2l0ZUNhdGVnb3J5KCk7Ci0JCWRlZmF1bHRDYXRlZ29yeS5zZXREZXNjcmlwdGlvbigiRGVmYXVsdCBjYXRlZ29yeSBmb3Igb3RoZXJ3aXNlIHVuY2F0ZWdvcml6ZWQgZmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWZhdWx0Q2F0ZWdvcnkuc2V0TGFiZWwoIlVuY2F0ZWdvcml6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWZhdWx0Q2F0ZWdvcnkuc2V0TmFtZSgiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCWRlZmF1bHRDYXRlZ29yeVNldCA9IG5ldyBIYXNoU2V0KDEpOwotCQlkZWZhdWx0Q2F0ZWdvcnlTZXQuYWRkKGRlZmF1bHRDYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJZ2VuZXJhdGVDYXRlZ29yaWVzKGluZm8sIHJlc3VsdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVDYXRlZ29yaWVzKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlNYXAgY2F0ZWdvcmllc1RvRmVhdHVyZUlVcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBmZWF0dXJlc1RvQ2F0ZWdvcmllcyA9IGdldEZlYXR1cmVUb0NhdGVnb3J5TWFwcGluZ3MoaW5mbyk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGZlYXR1cmVzVG9DYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU2l0ZUZlYXR1cmUgZmVhdHVyZSA9IChTaXRlRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gZ2V0RmVhdHVyZUlVKGZlYXR1cmUsIHJlc3VsdHMpOwotCQkJU2V0IGNhdGVnb3JpZXMgPSAoU2V0KSBmZWF0dXJlc1RvQ2F0ZWdvcmllcy5nZXQoZmVhdHVyZSk7Ci0JCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0ZWdvcmllcyBmb3IgdGhpcyBmZWF0dXJlIHRoZW4gYWRkIGl0IHRvIHRoZSBkZWZhdWx0IGNhdGVnb3J5LgotCQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLmlzRW1wdHkoKSkKLQkJCQljYXRlZ29yaWVzID0gZGVmYXVsdENhdGVnb3J5U2V0OwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVNpdGVDYXRlZ29yeSBjYXRlZ29yeSA9IChTaXRlQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlTZXQgZmVhdHVyZUlVcyA9IChTZXQpIGNhdGVnb3JpZXNUb0ZlYXR1cmVJVXMuZ2V0KGNhdGVnb3J5KTsKLQkJCQlpZiAoZmVhdHVyZUlVcyA9PSBudWxsKSB7Ci0JCQkJCWZlYXR1cmVJVXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQljYXRlZ29yaWVzVG9GZWF0dXJlSVVzLnB1dChjYXRlZ29yeSwgZmVhdHVyZUlVcyk7Ci0JCQkJfQotCQkJCWZlYXR1cmVJVXMuYWRkKGl1KTsKLQkJCX0KLQkJfQotCQlnZW5lcmF0ZUNhdGVnb3J5SVVzKGNhdGVnb3JpZXNUb0ZlYXR1cmVJVXMsIHJlc3VsdHMpOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBnZXRGZWF0dXJlSVUoU2l0ZUZlYXR1cmUgZmVhdHVyZSwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCVN0cmluZyBpZCA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmdldFRyYW5zZm9ybWVkSWQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBmYWxzZSwgdHJ1ZSk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7Ci0JCS8vIFRPRE8gbG9vayBlbHNld2hlcmUgYXMgd2VsbC4gIFBlcmhhcHMgaW4gdGhlIG1ldGFkYXRhIHJlcG9zIGFuZCBzb21lIGFkdmljZS4KLQkJQ29sbGVjdGlvbiBpdXMgPSByZXN1bHRzLmdldElVcyhpZCwgbnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGl1cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaS5uZXh0KCk7Ci0JCQlpZiAoaXUuZ2V0VmVyc2lvbigpLmVxdWFscyh2ZXJzaW9uKSkKLQkJCQlyZXR1cm4gaXU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIG1hcHBpbmcgb2YgZmVhdHVyZXMgdG8gY2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluIHRoZSBzaXRlLnhtbCwKLQkgKiBpZiBhdmFpbGFibGUuIFJldHVybnMgYW4gZW1wdHkgbWFwIGlmIHRoZXJlIGlzIG5vdCBzaXRlLnhtbCwgb3Igbm8gY2F0ZWdvcmllcy4KLQkgKiBAcmV0dXJuIEEgbWFwIG9mIFNpdGVGZWF0dXJlIC0+IFNldDxTaXRlQ2F0ZWdvcnk+LgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RmVhdHVyZVRvQ2F0ZWdvcnlNYXBwaW5ncyhJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUhhc2hNYXAgbWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAodXBkYXRlU2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG1hcHBpbmdzOwotCQlTaXRlTW9kZWwgc2l0ZSA9IHVwZGF0ZVNpdGUuZ2V0U2l0ZSgpOwotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG1hcHBpbmdzOwotCi0JCS8vY29weSBtaXJyb3IgaW5mb3JtYXRpb24gZnJvbSB1cGRhdGUgc2l0ZSB0byBwMiByZXBvc2l0b3JpZXMKLQkJU3RyaW5nIG1pcnJvcnMgPSBzaXRlLmdldE1pcnJvcnNVUkwoKTsKLQkJaWYgKG1pcnJvcnMgIT0gbnVsbCkgewotCQkJLy9yZW1vdmUgc2l0ZS54bWwgZmlsZSByZWZlcmVuY2UKLQkJCWludCBpbmRleCA9IG1pcnJvcnMuaW5kZXhPZigic2l0ZS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCW1pcnJvcnMgPSBtaXJyb3JzLnN1YnN0cmluZygwLCBpbmRleCkgKyBtaXJyb3JzLnN1YnN0cmluZyhpbmRleCArIDkpOwotCQkJaW5mby5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoKS5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX01JUlJPUlNfVVJMLCBtaXJyb3JzKTsKLQkJCWluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9NSVJST1JTX1VSTCwgbWlycm9ycyk7Ci0JCX0KLQotCQlTaXRlRmVhdHVyZVtdIGZlYXR1cmVzID0gc2l0ZS5nZXRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvL2FkZCBhIG1hcHBpbmcgZm9yIGVhY2ggY2F0ZWdvcnkgdGhpcyBmZWF0dXJlIGJlbG9uZ3MgdG8KLQkJCVN0cmluZ1tdIGNhdGVnb3J5TmFtZXMgPSBmZWF0dXJlc1tpXS5nZXRDYXRlZ29yeU5hbWVzKCk7Ci0JCQlTZXQgY2F0ZWdvcmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQltYXBwaW5ncy5wdXQoZmVhdHVyZXNbaV0sIGNhdGVnb3JpZXMpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjYXRlZ29yeU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gc2l0ZS5nZXRDYXRlZ29yeShjYXRlZ29yeU5hbWVzW2pdKTsKLQkJCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkKLQkJCQkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgSVVzIGNvcnJlc3BvbmRpbmcgdG8gdXBkYXRlIHNpdGUgY2F0ZWdvcmllcy4KLQkgKiBAcGFyYW0gY2F0ZWdvcmllc1RvRmVhdHVyZXMgTWFwIG9mIFNpdGVDYXRlZ29yeSAtPlNldCAoRmVhdHVyZSBJVXMgaW4gdGhhdCBjYXRlZ29yeSkuCi0JICogQHBhcmFtIHJlc3VsdCBUaGUgZ2VuZXJhdG9yIHJlc3VsdCBiZWluZyBidWlsdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ2F0ZWdvcnlJVXMoTWFwIGNhdGVnb3JpZXNUb0ZlYXR1cmVzLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcmllc1RvRmVhdHVyZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJcmVzdWx0LmFkZElVKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUNhdGVnb3J5SVUoY2F0ZWdvcnksIChTZXQpIGNhdGVnb3JpZXNUb0ZlYXR1cmVzLmdldChjYXRlZ29yeSksIG51bGwpLCBJUHVibGlzaGVyUmVzdWx0Lk5PTl9ST09UKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvVmVyc2lvbkFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9WZXJzaW9uQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2U5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9WZXJzaW9uQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGluZ0FkdmljZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFZlcnNpb25BZHZpY2UgZXh0ZW5kcyBBYnN0cmFjdEFkdmljZSBpbXBsZW1lbnRzIElWZXJzaW9uQWR2aWNlIHsKLQotCU1hcCB2ZXJzaW9ucyA9IG5ldyBIYXNoTWFwKDExKTsKLQotCS8qKgotCSAqIExvYWQgdGhlIGdpdmVuIG5hbWVzcGFjZSB3aXRoIHZlcnNpb24gbWFwcGluZ3MgZnJvbSB0aGUgcHJvcGVydGllcyBmaWxlIGF0IAotCSAqIHRoZSBnaXZlbiBsb2NhdGlvbi4gIFRoZSBwcm9wZXJ0aWVzIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIG5vcm1hbCBmb3JtYXQKLQkgKiBwcm9kdWNlZCBhbmQgY29uc3VtZWQgYnkgUERFIEJ1aWxkLgotCSAqIEBwYXJhbSBuYW1lc3BhY2UgdGhlIG5hbWVzcGFjZSB0byBwb3B1bGF0ZQotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIG1hcHBpbmcgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBpZCkgewotCQlNYXAgdmFsdWVzID0gKE1hcCkgdmVyc2lvbnMuZ2V0KG5hbWVzcGFjZSk7Ci0JCS8vIGlmIG5vIG9uZSBzYXlzIGFueXRoaW5nIHRoZW4gZG9uJ3Qgc2F5IGFueXRoaW5nLiAgc29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUgYW4gb3BpbmlvbgotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChWZXJzaW9uKSB2YWx1ZXMuZ2V0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCU1hcCB2YWx1ZXMgPSAoTWFwKSB2ZXJzaW9ucy5nZXQobmFtZXNwYWNlKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkvLyBpZiB3ZSBhcmUgY2xlYXJpbmcgdmFsdWVzIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbwotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl2YWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJdmVyc2lvbnMucHV0KG5hbWVzcGFjZSwgdmFsdWVzKTsKLQkJfQotCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJdmFsdWVzLnJlbW92ZShpZCk7Ci0JCWVsc2UKLQkJCXZhbHVlcy5wdXQoaWQsIHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBJUHVibGlzaGluZ0FkdmljZSBtZXJnZShJUHVibGlzaGluZ0FkdmljZSBhZHZpY2UpIHsKLQkJaWYgKCEoYWR2aWNlIGluc3RhbmNlb2YgVmVyc2lvbkFkdmljZSkpCi0JCQlyZXR1cm4gdGhpczsKLQkJVmVyc2lvbkFkdmljZSBzb3VyY2UgPSAoVmVyc2lvbkFkdmljZSkgYWR2aWNlOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2UudmVyc2lvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlNYXAgbXlWYWx1ZXMgPSAoTWFwKSB2ZXJzaW9ucy5nZXQobmFtZXNwYWNlKTsKLQkJCU1hcCBzb3VyY2VWYWx1ZXMgPSAoTWFwKSBzb3VyY2UudmVyc2lvbnMuZ2V0KG5hbWVzcGFjZSk7Ci0JCQlpZiAobXlWYWx1ZXMgPT0gbnVsbCkKLQkJCQl2ZXJzaW9ucy5wdXQobmFtZXNwYWNlLCBzb3VyY2VWYWx1ZXMpOwotCQkJZWxzZSBpZiAoc291cmNlVmFsdWVzICE9IG51bGwpCi0JCQkJdmVyc2lvbnMucHV0KG5hbWVzcGFjZSwgbWVyZ2UobXlWYWx1ZXMsIHNvdXJjZVZhbHVlcykpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXByaXZhdGUgTWFwIG1lcmdlKE1hcCBteVZhbHVlcywgTWFwIHNvdXJjZVZhbHVlcykgewotCQlNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAobXlWYWx1ZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VWYWx1ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAocmVzdWx0LmdldChrZXkpID09IG51bGwpCi0JCQkJcmVzdWx0LnB1dChrZXksIHNvdXJjZVZhbHVlcy5nZXQoa2V5KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9EZWZhdWx0U2l0ZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRGVmYXVsdFNpdGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5OWQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9EZWZhdWx0U2l0ZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBQYXJzZXMgYSBzaXRlLnhtbCBmaWxlLgotICogVGhpcyBjbGFzcyB3YXMgaW5pdGlhbGx5IGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkRlZmF1bHRTaXRlUGFyc2VyLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNpdGVQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfREVGID0gImNhdGVnb3J5LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFURV9TSVRFUyA9ICJhc3NvY2lhdGVTaXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRFX1NJVEUgPSAiYXNzb2NpYXRlU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTkZPX1VSTCA9ICJpbmRleC5odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JUlJPUiA9ICJtaXJyb3IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBBY3RpdmF0b3IuSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEUgPSAic2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9BUkNISVZFID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0FURUdPUlkgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQVRFR09SWV9ERUYgPSA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgPSA3OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTl9TSVRFID0gNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRkVBVFVSRSA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lHTk9SRURfRUxFTUVOVCA9IC0xOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTklUSUFMID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0lURSA9IDE7Ci0KLQlwcml2YXRlIGludCBjdXJyZW50U3RhdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSBmYWxzZTsKLQkvLyBDdXJyZW50IG9iamVjdCBzdGFjayAodXNlZCB0byBob2xkIHRoZSBjdXJyZW50IG9iamVjdCB3ZSBhcmUKLQkvLyBwb3B1bGF0aW5nIGluIHRoaXMgcGx1Z2luIGRlc2NyaXB0b3IKLQlTdGFjayBvYmplY3RTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCi0JLy8gQ3VycmVudCBTdGF0ZSBJbmZvcm1hdGlvbgotCVN0YWNrIHN0YXRlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgTXVsdGlTdGF0dXMgc3RhdHVzOwotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBzKSB7Ci0JCVRyYWNpbmcuZGVidWcoIkRlZmF1bHRTaXRlUGFyc2VyOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBVUkxFbnRyeVtdIGdldEFzc29jaWF0ZVNpdGVzKFN0cmluZyBhc3NvY2lhdGVTaXRlc1VSTCkgewotCS8vCi0JLy8JCXRyeSB7Ci0JLy8JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvbUZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JLy8JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGRvbUZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JLy8JCQlEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoYXNzb2NpYXRlU2l0ZXNVUkwpOwotCS8vCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JLy8JCQkJcmV0dXJuIG51bGw7Ci0JLy8JCQlOb2RlTGlzdCBtaXJyb3JOb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEFTU09DSUFURV9TSVRFKTsKLQkvLwkJCVVSTEVudHJ5W10gbWlycm9ycyA9IG5ldyBVUkxFbnRyeVttaXJyb3JOb2Rlcy5nZXRMZW5ndGgoKV07Ci0JLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pcnJvck5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkvLwkJCQlFbGVtZW50IG1pcnJvck5vZGUgPSAoRWxlbWVudCkgbWlycm9yTm9kZXMuaXRlbShpKTsKLQkvLwkJCQltaXJyb3JzW2ldID0gbmV3IFVSTEVudHJ5KCk7Ci0JLy8JCQkJU3RyaW5nIGluZm9VUkwgPSBtaXJyb3JOb2RlLmdldEF0dHJpYnV0ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkvLwkJCQlTdHJpbmcgbGFiZWwgPSBtaXJyb3JOb2RlLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotCS8vCQkJCW1pcnJvcnNbaV0uc2V0VVJMKGluZm9VUkwpOwotCS8vCQkJCW1pcnJvcnNbaV0uc2V0QW5ub3RhdGlvbihsYWJlbCk7Ci0JLy8KLQkvLwkJCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkvLwkJCQkJZGVidWcoIlByb2Nlc3NlZCBtaXJyb3I6IHVybDoiICsgaW5mb1VSTCArICIgbGFiZWw6IiArIGxhYmVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8JCQl9Ci0JLy8JCQlyZXR1cm4gbWlycm9yczsKLQkvLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkvLwkJCS8vIGxvZyBpZiBhYnNvbHV0ZSB1cmwKLQkvLwkJCWlmIChhc3NvY2lhdGVTaXRlc1VSTCAhPSBudWxsICYmIChhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJodHRwOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJodHRwczovLyIpIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQkJfHwgYXNzb2NpYXRlU2l0ZXNVUkwuc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQkJfHwgYXNzb2NpYXRlU2l0ZXNVUkwuc3RhcnRzV2l0aCgiZnRwOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJfHwgYXNzb2NpYXRlU2l0ZXNVUkwuc3RhcnRzV2l0aCgiamFyOi8vIikpKSAvLyROT04tTkxTLTEkCi0JLy8JCQkJbG9nKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnMsIGUpOwotCS8vCQkJcmV0dXJuIG51bGw7Ci0JLy8JCX0KLQkvLwl9Ci0KLQlzdGF0aWMgVVJMRW50cnlbXSBnZXRNaXJyb3JzKFN0cmluZyBtaXJyb3JzVVJMKSB7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBjb3VudHJ5Q29kZSA9IExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQlpbnQgdGltZVpvbmUgPSAobmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkpLmdldChDYWxlbmRhci5aT05FX09GRlNFVCkgLyAoNjAgKiA2MCAqIDEwMDApOwotCi0JCQlpZiAobWlycm9yc1VSTC5pbmRleE9mKCI/IikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgIiYiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgIj8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQltaXJyb3JzVVJMID0gbWlycm9yc1VSTCArICJjb3VudHJ5Q29kZT0iICsgY291bnRyeUNvZGUgKyAiJnRpbWVab25lPSIgKyB0aW1lWm9uZSArICImcmVzcG9uc2VUeXBlPXhtbCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9tRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZG9tRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShtaXJyb3JzVVJMKTsKLQkJCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJTm9kZUxpc3QgbWlycm9yTm9kZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShNSVJST1IpOwotCQkJVVJMRW50cnlbXSBtaXJyb3JzID0gbmV3IFVSTEVudHJ5W21pcnJvck5vZGVzLmdldExlbmd0aCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbWlycm9yTm9kZSA9IChFbGVtZW50KSBtaXJyb3JOb2Rlcy5pdGVtKGkpOwotCQkJCW1pcnJvcnNbaV0gPSBuZXcgVVJMRW50cnkoKTsKLQkJCQlTdHJpbmcgaW5mb1VSTCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsYWJlbCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJbWlycm9yc1tpXS5zZXRVUkwoaW5mb1VSTCk7Ci0JCQkJbWlycm9yc1tpXS5zZXRBbm5vdGF0aW9uKGxhYmVsKTsKLQotCQkJCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIG1pcnJvcjogdXJsOiIgKyBpbmZvVVJMICsgIiBsYWJlbDoiICsgbGFiZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBtaXJyb3JzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGlmIGFic29sdXRlIHVybAotCQkJaWYgKG1pcnJvcnNVUkwgIT0gbnVsbCAmJiAobWlycm9yc1VSTC5zdGFydHNXaXRoKCJodHRwOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiZnRwOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJqYXI6Ly8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9taXJyb3JzLCBlKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIGxvZyhFeGNlcHRpb24gZSkgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiSW50ZXJuYWwgRXJyb3IiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBlcnJvcikgewotCQlMb2dIZWxwZXIubG9nKGVycm9yKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgc2l0ZSBwYXJzZXIuCi0JICovCi0JcHVibGljIERlZmF1bHRTaXRlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQlzdGF0ZVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCW9iamVjdFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXN0YXR1cyA9IG51bGw7Ci0JCURFU0NSSVBUSU9OX1NJVEVfQUxSRUFEWV9TRUVOID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWxvZyhlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCWxvZyhlKTsKLQkJfQotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkNyZWF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBjaGFyYWN0ZXIgdGV4dAotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JCS8vb25seSBwdXNoIGlmIGRlc2NyaXB0aW9uCi0JCWludCBzdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7Ci0JCWlmIChzdGF0ZSA9PSBTVEFURV9ERVNDUklQVElPTl9TSVRFIHx8IHN0YXRlID09IFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRikKLQkJCW9iamVjdFN0YWNrLnB1c2godGV4dCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZW5kIG9mIGVsZW1lbnQgdGFncwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZW5kRWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgewotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJVVJMRW50cnkgaW5mbyA9IG51bGw7Ci0KLQkJaW50IHN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOgotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoKLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOgotCQkJCXN0YXRlU3RhY2sucG9wKCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6Ci0JCQkJaW50ZXJuYWxFcnJvcihNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGUpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX1NJVEUgOgotCQkJCXN0YXRlU3RhY2sucG9wKCk7Ci0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl0ZXh0ID0gKFN0cmluZykgb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJCVNpdGVNb2RlbCBzaXRlID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOwotCQkJCQlzaXRlLmdldERlc2NyaXB0aW9uKCkuc2V0QW5ub3RhdGlvbih0ZXh0KTsKLQkJCQl9Ci0JCQkJLy9kbyBub3QgcG9wIHRoZSBvYmplY3QKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCW9iamVjdFN0YWNrLnBvcCgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgb2JqZWN0U3RhY2sucGVlaygpOwotCQkJCQljYXRlZ29yeS5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJCQl9Ci0JCQkJb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCS8vIGFkZCB0ZXh0LCBwcmVzZXJ2aW5nIGF0IG1vc3Qgb25lIHNwYWNlIGJldHdlZW4gdGV4dCBmcmFnbWVudHMKLQkJCQkJU3RyaW5nIG5ld1RleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQkJaWYgKHRyYWlsaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0ZXh0ID0gbmV3VGV4dC50cmltKCkgKyB0ZXh0OwotCQkJCQlpZiAobGVhZGluZ1NwYWNlKG5ld1RleHQpICYmICFsZWFkaW5nU3BhY2UodGV4dCkpIHsKLQkJCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dCA9IHRleHQudHJpbSgpOwotCi0JCQkJaW5mbyA9IChVUkxFbnRyeSkgb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJaW5mby5zZXRBbm5vdGF0aW9uKHRleHQpOwotCi0JCQkJU2l0ZU1vZGVsIHNpdGVNb2RlbCA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJCQkvLyBvdmVycmlkZSBkZXNjcmlwdGlvbi4KLQkJCQkvLyBkbyBub3QgcmFpc2UgZXJyb3IgYXMgcHJldmlvdXMgZGVzY3JpcHRpb24gbWF5IGJlIGRlZmF1bHQgb25lCi0JCQkJLy8gd2hlbiBwYXJzaW5nIHNpdGUgdGFnCi0JCQkJaWYgKERFU0NSSVBUSU9OX1NJVEVfQUxSRUFEWV9TRUVOKQotCQkJCQlkZWJ1ZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldCwgKG5ldyBTdHJpbmdbXSB7Z2V0U3RhdGUoc3RhdGUpfSkpKTsKLQkJCQlzaXRlTW9kZWwuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCQkJREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSB0cnVlOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCS8vIGFkZCB0ZXh0LCBwcmVzZXJ2aW5nIGF0IG1vc3Qgb25lIHNwYWNlIGJldHdlZW4gdGV4dCBmcmFnbWVudHMKLQkJCQkJU3RyaW5nIG5ld1RleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQkJaWYgKHRyYWlsaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0ZXh0ID0gbmV3VGV4dC50cmltKCkgKyB0ZXh0OwotCQkJCQlpZiAobGVhZGluZ1NwYWNlKG5ld1RleHQpICYmICFsZWFkaW5nU3BhY2UodGV4dCkpIHsKLQkJCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dCA9IHRleHQudHJpbSgpOwotCi0JCQkJaW5mbyA9IChVUkxFbnRyeSkgb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJaW5mby5zZXRBbm5vdGF0aW9uKHRleHQpOwotCi0JCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgb2JqZWN0U3RhY2sucGVlaygpOwotCQkJCWlmIChjYXRlZ29yeS5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0JCQkJCWludGVybmFsRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQsIChuZXcgU3RyaW5nW10ge2dldFN0YXRlKHN0YXRlKSwgY2F0ZWdvcnkuZ2V0TGFiZWwoKX0pKSk7Ci0JCQkJZWxzZQotCQkJCQljYXRlZ29yeS5zZXREZXNjcmlwdGlvbihpbmZvLmdldEFubm90YXRpb24oKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCWludGVybmFsRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVuZFN0YXRlLCAobmV3IFN0cmluZ1tdIHtnZXRTdGF0ZShzdGF0ZSl9KSkpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIEVsZW1lbnQ6IiArIHVyaSArICI6IiArIGxvY2FsTmFtZSArICI6IiArIHFOYW1lKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qCi0JICogSGFuZGxlcyBhbiBlcnJvciBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN0YXR1cy4gIFRoZSBjb2xsZWN0aW9uIG9mIGFsbCBsb2dnZWQgc3RhdHVzCi0JICogb2JqZWN0cyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgPGNvZGU+Z2V0U3RhdHVzKCk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGVycm9yIGEgc3RhdHVzIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVycm9yKElTdGF0dXMgZXJyb3IpIHsKLQotCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZ1NpdGUsIG51bGwpOwotCQl9Ci0KLQkJc3RhdHVzLmFkZChlcnJvcik7Ci0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJTG9nSGVscGVyLmxvZyhlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGVycm9ycwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCWxvZ1N0YXR1cyhleCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGZhdGFsIGVycm9ycwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJbG9nU3RhdHVzKGV4KTsKLQkJdGhyb3cgZXg7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm4gdGhlIHN0YXRlIGFzIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKGludCBzdGF0ZSkgewotCi0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfSUdOT1JFRF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gIklnbm9yZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6Ci0JCQkJcmV0dXJuICJJbml0aWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX1NJVEUgOgotCQkJCXJldHVybiAiU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoKLQkJCQlyZXR1cm4gIkZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfQVJDSElWRSA6Ci0JCQkJcmV0dXJuICJBcmNoaXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZIDoKLQkJCQlyZXR1cm4gIkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6Ci0JCQkJcmV0dXJuICJDYXRlZ29yeSBEZWYiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGIDoKLQkJCQlyZXR1cm4gIkRlc2NyaXB0aW9uIC8gQ2F0ZWdvcnkgRGVmIjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgOgotCQkJCXJldHVybiAiRGVzY3JpcHRpb24gLyBTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXRlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgc3RhdHVzIG9iamVjdHMgYWNjdW11bGF0ZWQgYnkgdGhlIHBhcnNlci4KLQkgKgotCSAqIEByZXR1cm4gbXVsdGktc3RhdHVzIGNvbnRhaW5pbmcgYWNjdW11bGF0ZWQgc3RhdHVzLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIE11bHRpU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2F0ZWdvcnlEZWZTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOwotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOwotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGKSk7Ci0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudCwgKG5ldyBTdHJpbmdbXSB7ZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fU0lURSkpOwotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOwotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOwotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUlkpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUlkpKTsKLQkJCXByb2Nlc3NDYXRlZ29yeShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudCwgKG5ldyBTdHJpbmdbXSB7ZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVGZWF0dXJlU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7Ci0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7Ci0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7Ci0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOwotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWSkpOwotCQkJcHJvY2Vzc0NhdGVnb3J5KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUluaXRpYWxTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoU0lURSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9TSVRFKSk7Ci0JCQlwcm9jZXNzU2l0ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIHsKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JCQkvLyB3aGF0IHdlIHJlY2VpdmVkIHdhcyBub3QgYSBzaXRlLnhtbCwgbm8gbmVlZCB0byBjb250aW51ZQotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpdGVTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUpKTsKLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsKLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0FSQ0hJVkUpKTsKLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUllfREVGKSk7Ci0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQsIChuZXcgU3RyaW5nW10ge2VsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWVycm9yKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxFcnJvclVua25vd25UYWcoU3RyaW5nIG1zZykgewotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSUdOT1JFRF9FTEVNRU5UKSk7Ci0JCWludGVybmFsRXJyb3IobXNnKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGVhZGluZ1NwYWNlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ci5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyLmNoYXJBdCgwKSk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nU3RhdHVzKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBuYW1lID0gZXguZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMSArIG5hbWUubGFzdEluZGV4T2YoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgbXNnOwotCQlpZiAobmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmcsIChuZXcgU3RyaW5nW10ge2V4LmdldE1lc3NhZ2UoKX0pKTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10ge25hbWUsIEludGVnZXIudG9TdHJpbmcoZXguZ2V0TGluZU51bWJlcigpKSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRDb2x1bW5OdW1iZXIoKSksIGV4LmdldE1lc3NhZ2UoKX07Ci0JCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvcmxpbmVDb2x1bW5NZXNzYWdlLCB2YWx1ZXMpOwotCQl9Ci0JCWVycm9yKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtc2csIGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RlYW0gYW5kIGNvbnN0cnVjdHMgYSBzaXRlIG1vZGVsLgotCSAqIFRoZSBpbnB1dCBzdHJlYW0gaXMgbm90IGNsb3NlZCBhcyBwYXJ0IG9mIHRoaXMgb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbiBpbnB1dCBzdHJlYW0KLQkgKiBAcmV0dXJuIHNpdGUgbW9kZWwKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBwYXJzZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5JVElBTCkpOwotCQljdXJyZW50U3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOwotCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCWlmIChvYmplY3RTdGFjay5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX05vU2l0ZVRhZyk7Ci0JCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTaXRlTW9kZWwpIHsKLQkJCXJldHVybiAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJfQotCQlTdHJpbmcgc3RhY2sgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gb2JqZWN0U3RhY2suaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlzdGFjayA9IHN0YWNrICsgaXRlci5uZXh0KCkudG9TdHJpbmcoKSArICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfV3JvbmdQYXJzaW5nU3RhY2ssIChuZXcgU3RyaW5nW10ge3N0YWNrfSkpKTsKLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIGFyY2hpdmUgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQXJjaGl2ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJVVJMRW50cnkgYXJjaGl2ZSA9IG5ldyBVUkxFbnRyeSgpOwotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9NaXNzaW5nLCAobmV3IFN0cmluZ1tdIHsicGF0aCIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhcmNoaXZlLnNldEFubm90YXRpb24oaWQpOwotCi0JCVN0cmluZyB1cmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWludGVybmFsRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZywgKG5ldyBTdHJpbmdbXSB7ImFyY2hpdmUiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJYXJjaGl2ZS5zZXRVUkwodXJsKTsKLQotCQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQlzaXRlLmFkZEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCX0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3NpbmcgQXJjaGl2ZTogcGF0aDoiICsgaWQgKyAiIHVybDoiICsgdXJsKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgdGhlIENhdGVnb3J5ICBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYXRlZ29yeShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGNhdGVnb3J5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCVNpdGVGZWF0dXJlIGZlYXR1cmUgPSAoU2l0ZUZlYXR1cmUpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJZmVhdHVyZS5hZGRDYXRlZ29yeU5hbWUoY2F0ZWdvcnkpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkVuZCBwcm9jZXNzaW5nIENhdGVnb3J5OiBuYW1lOiIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIGNhdGVnb3J5IGRlZiBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYXRlZ29yeURlZihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IFNpdGVDYXRlZ29yeSgpOwotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCWNhdGVnb3J5LnNldE5hbWUobmFtZSk7Ci0JCWNhdGVnb3J5LnNldExhYmVsKGxhYmVsKTsKLQotCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJc2l0ZS5hZGRDYXRlZ29yeShjYXRlZ29yeSk7Ci0JCW9iamVjdFN0YWNrLnB1c2goY2F0ZWdvcnkpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkVuZCBwcm9jZXNzaW5nIENhdGVnb3J5RGVmOiBuYW1lOiIgKyBuYW1lICsgIiBsYWJlbDoiICsgbGFiZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIGZlYXR1cmUgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU2l0ZUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTaXRlRmVhdHVyZSgpOwotCi0JCS8vIGZlYXR1cmUgbG9jYXRpb24gb24gdGhlIHNpdGUKLQkJU3RyaW5nIHVybEluZm8gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWJvb2xlYW4gbm9VUkwgPSAodXJsSW5mbyA9PSBudWxsIHx8IHVybEluZm8udHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gbm9JZCA9IChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIG5vVmVyc2lvbiA9ICh2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gV2UgbmVlZCB0byBoYXZlIGlkIGFuZCB2ZXJzaW9uLCBvciB0aGUgdXJsLCBvciBib3RoLgotCQlpZiAobm9VUkwpIHsKLQkJCWlmIChub0lkIHx8IG5vVmVyc2lvbikKLQkJCQlpbnRlcm5hbEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX01pc3NpbmcsIChuZXcgU3RyaW5nW10geyJ1cmwiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCS8vIGRlZmF1bHQgdXJsCi0JCQkJdXJsSW5mbyA9IEZFQVRVUkVTICsgaWQgKyAnXycgKyB2ZXI7IC8vIAotCQl9Ci0KLQkJZmVhdHVyZS5zZXRVUkxTdHJpbmcodXJsSW5mbyk7Ci0KLQkJU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRUeXBlKHR5cGUpOwotCi0JCS8vIGlmIG9uZSBpcyBudWxsLCBhbmQgbm90IHRoZSBvdGhlcgotCQlpZiAobm9JZCBeIG5vVmVyc2lvbikgewotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHtpZCwgdmVyLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfTsKLQkJCWxvZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0RmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQsIHZhbHVlcykpOwotCQl9IGVsc2UgewotCQkJZmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihpZCk7Ci0JCQlmZWF0dXJlLnNldEZlYXR1cmVWZXJzaW9uKHZlcik7Ci0JCX0KLQotCQkvLyBnZXQgbGFiZWwgaWYgaXQgZXhpc3RzCi0JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCWlmICgiIi5lcXVhbHMobGFiZWwudHJpbSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWxhYmVsID0gbnVsbDsKLQkJfQotCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsKLQotCQkvLyBPUwotCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCWZlYXR1cmUuc2V0T1Mob3MpOwotCi0JCS8vIFdTCi0JCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRXUyh3cyk7Ci0KLQkJLy8gTkwKLQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldE5MKG5sKTsKLQotCQkvLyBhcmNoCi0JCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWZlYXR1cmUuc2V0QXJjaChhcmNoKTsKLQotCQkvL3BhdGNoCi0JCVN0cmluZyBwYXRjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGNoIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRQYXRjaChwYXRjaCk7Ci0KLQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCXNpdGUuYWRkRmVhdHVyZShmZWF0dXJlKTsKLQkJZmVhdHVyZS5zZXRTaXRlTW9kZWwoc2l0ZSk7Ci0KLQkJb2JqZWN0U3RhY2sucHVzaChmZWF0dXJlKTsKLQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJFbmQgUHJvY2Vzc2luZyBEZWZhdWx0RmVhdHVyZSBUYWc6IHVybDoiICsgdXJsSW5mbyArICIgdHlwZToiICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyogCi0JICogcHJvY2VzcyBVUkwgaW5mbyB3aXRoIGVsZW1lbnQgdGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5mbyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJVVJMRW50cnkgaW5mID0gbmV3IFVSTEVudHJ5KCk7Ci0JCVN0cmluZyBpbmZvVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5mLnNldFVSTChpbmZvVVJMKTsKLQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJQcm9jZXNzZWQgSW5mbzogdXJsOiIgKyBpbmZvVVJMKTsgLy8kTk9OLU5MUy0xJAotCi0JCW9iamVjdFN0YWNrLnB1c2goaW5mKTsKLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIHNpdGUgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2l0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJLy8gY3JlYXRlIHNpdGUgbWFwCi0JCVNpdGVNb2RlbCBzaXRlID0gbmV3IFNpdGVNb2RlbCgpOwotCi0JCS8vIGlmIFVSTCBpcyBzcGVjaWZpZWQsIGl0IHJlcGxhY2VzIHRoZSBVUkwgb2YgdGhlIHNpdGUKLQkJLy8gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGxvY2F0aW9uIG9mIGZlYXR1cmVzIGFuZCBhcmNoaXZlcwotCQlTdHJpbmcgc2l0ZVVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzaXRlVVJMICE9IG51bGwgJiYgISgiIi5lcXVhbHMoc2l0ZVVSTC50cmltKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIXNpdGVVUkwuZW5kc1dpdGgoIi8iKSAmJiAhc2l0ZVVSTC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXNpdGVVUkwgKz0gIi8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzaXRlLnNldExvY2F0aW9uVVJMU3RyaW5nKHNpdGVVUkwpOwotCQl9Ci0KLQkJLy8gcHJvdmlkZSBkZWZhdWx0IGRlc2NyaXB0aW9uIFVSTAotCQkvLyBJZiA8ZGVzY3JpcHRpb24+IGlzIHNwZWNpZmllZCwgZm9yIHRoZSBzaXRlLCAgaXQgdGFrZXMgcHJlY2VkZW5jZQkJCi0JCVVSTEVudHJ5IGRlc2NyaXB0aW9uID0gbmV3IFVSTEVudHJ5KCk7Ci0JCWRlc2NyaXB0aW9uLnNldFVSTChERUZBVUxUX0lORk9fVVJMKTsKLQkJc2l0ZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0KLQkJLy8gdmVyaWZ5IHdlIGNhbiBwYXJzZSB0aGUgc2l0ZSAuLi5pZiB0aGUgc2l0ZSBoYXMKLQkJLy8gYSBkaWZmZXJlbnQgdHlwZSB0aHJvdyBhbiBleGNlcHRpb24gdG8gZm9yY2UgcmVwYXJzaW5nCi0JCS8vIHdpdGggdGhlIG1hdGNoaW5nIHBhcnNlcgotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlzaXRlLnNldFR5cGUodHlwZSk7Ci0KLQkJLy8gZ2V0IG1pcnJvcnMsIGlmIGFueQotCQlTdHJpbmcgbWlycm9yc1VSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm1pcnJvcnNVUkwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWlycm9yc1VSTCAhPSBudWxsICYmIG1pcnJvcnNVUkwudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJLy8JCQlVUkxFbnRyeVtdIG1pcnJvcnMgPSBnZXRNaXJyb3JzKG1pcnJvcnNVUkwpOwotCQkJLy8JCQlpZiAobWlycm9ycyAhPSBudWxsKQotCQkJLy8JCQkJc2l0ZS5zZXRNaXJyb3JzKG1pcnJvcnMpOwotCQkJLy8JCQllbHNlCi0KLQkJCS8vU2luY2Ugd2UgYXJlIHBhcnNpbmcgdGhlIHNpdGUgYXQgcDIgZ2VuZXJhdGlvbiB0aW1lIGFuZCB0aGUgCi0JCQkvL21pcnJvcnMgbWF5IGNoYW5nZSwgdGhlcmUgaXMgbm8gcG9pbnQgZG9pbmcgdGhlIG1pcnJvciBleHBhbnNpb24gbm93Ci0JCQlzaXRlLnNldE1pcnJvcnNVUkxTdHJpbmcobWlycm9yc1VSTCk7Ci0JCX0KLQotCQlTdHJpbmcgcGFjazIwMCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhY2syMDAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGFjazIwMCAhPSBudWxsICYmIG5ldyBCb29sZWFuKHBhY2syMDApLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlzaXRlLnNldFN1cHBvcnRzUGFjazIwMCh0cnVlKTsKLQkJfQotCi0JCS8vCQlpZiAoYXR0cmlidXRlcy5nZXRWYWx1ZSgiZGlnZXN0VVJMIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJc2l0ZS5zZXREaWdlc3RFeGlzdCh0cnVlKTsKLQkJLy8JCQlzaXRlLnNldERpZ2VzdFVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJkaWdlc3RVUkwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8KLQkJLy8JCQlpZiAoKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImF2YWlsYWJsZUxvY2FsZXMiKSAhPSBudWxsKSAmJiAoIWF0dHJpYnV0ZXMuZ2V0VmFsdWUoImF2YWlsYWJsZUxvY2FsZXMiKS50cmltKCkuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLwkJCQlTdHJpbmdUb2tlbml6ZXIgbG9jYWxzID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyaWJ1dGVzLmdldFZhbHVlKCJhdmFpbGFibGVMb2NhbGVzIiksICIsIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCS8vCQkJCVN0cmluZ1tdIGF2YWlsYWJsZUxvY2FscyA9IG5ldyBTdHJpbmdbbG9jYWxzLmNvdW50VG9rZW5zKCldOwotCQkvLwkJCQlpbnQgaSA9IDA7Ci0JCS8vCQkJCXdoaWxlIChsb2NhbHMuaGFzTW9yZVRva2VucygpKSB7Ci0JCS8vCQkJCQlhdmFpbGFibGVMb2NhbHNbaSsrXSA9IGxvY2Fscy5uZXh0VG9rZW4oKTsKLQkJLy8JCQkJfQotCQkvLwkJCQkJCQkJZXh0ZW5kZWRTaXRlLnNldEF2YWlsYWJsZUxvY2FscyhhdmFpbGFibGVMb2NhbHMpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8KLQkJLy8JCWlmICgoc2l0ZSBpbnN0YW5jZW9mIEV4dGVuZGVkU2l0ZSkgJiYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFzc29jaWF0ZVNpdGVzVVJMIikgIT0gbnVsbCkpIHsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCUlVUkxFbnRyeVtdIGFzc29jaWF0ZVNpdGVzID0gZ2V0QXNzb2NpYXRlU2l0ZXMoYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXNzb2NpYXRlU2l0ZXNVUkwiKSwgZmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQlpZiAoYXNzb2NpYXRlU2l0ZXMgIT0gbnVsbCkKLQkJLy8JCQkJKChFeHRlbmRlZFNpdGUpIHNpdGUpLnNldEFzc29jaWF0ZVNpdGVzKGFzc29jaWF0ZVNpdGVzKTsKLQkJLy8JCQllbHNlCi0JCS8vCQkJCXNpdGUuc2V0TWlycm9yc1VSTFN0cmluZyhtaXJyb3JzVVJMKTsKLQkJLy8JCX0KLQotCQlvYmplY3RTdGFjay5wdXNoKHNpdGUpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkVuZCBwcm9jZXNzIFNpdGUgdGFnOiBzaXRlVVJMOiIgKyBzaXRlVVJMICsgIiB0eXBlOiIgKyB0eXBlKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBzdGFydCBvZiBlbGVtZW50IHRhZ3MKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKSB7Ci0JCQlkZWJ1ZygiU3RhdGU6ICIgKyBjdXJyZW50U3RhdGUpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZygiU3RhcnQgRWxlbWVudDogdXJpOiIgKyB1cmkgKyAiIGxvY2FsIE5hbWU6IiArIGxvY2FsTmFtZSArICIgcU5hbWU6IiArIHFOYW1lKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfSUdOT1JFRF9FTEVNRU5UIDoKLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudCwgKG5ldyBTdHJpbmdbXSB7bG9jYWxOYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6Ci0JCQkJaGFuZGxlSW5pdGlhbFN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfU0lURSA6Ci0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6Ci0JCQkJaGFuZGxlRmVhdHVyZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfQVJDSElWRSA6Ci0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOgotCQkJCWhhbmRsZUNhdGVnb3J5U3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9DQVRFR09SWV9ERUYgOgotCQkJCWhhbmRsZUNhdGVnb3J5RGVmU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoKLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgOgotCQkJCWhhbmRsZVNpdGVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhcnRTdGF0ZSwgKG5ldyBTdHJpbmdbXSB7Z2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaW50IG5ld1N0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJaWYgKG5ld1N0YXRlICE9IFNUQVRFX0lHTk9SRURfRUxFTUVOVCkKLQkJCWN1cnJlbnRTdGF0ZSA9IG5ld1N0YXRlOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYWlsaW5nU3BhY2UoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyLmxlbmd0aCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0RpZ2VzdFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRGlnZXN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzA2MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRGlnZXN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBEZWZhdWx0IGZlYXR1cmUgcGFyc2VyLgotICogUGFyc2VzIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGZpbGUgYXMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERpZ2VzdFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgZmluYWwgRmVhdHVyZVBhcnNlciBmZWF0dXJlSGFuZGxlciA9IG5ldyBGZWF0dXJlUGFyc2VyKGZhbHNlKTsKLQotCXB1YmxpYyBEaWdlc3RQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlmZWF0dXJlSGFuZGxlci5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmICgiZGlnZXN0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCJmZWF0dXJlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlSGFuZGxlci5nZXRSZXN1bHQoKTsKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJfSBlbHNlCi0JCQlmZWF0dXJlSGFuZGxlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0JfQotCi0JcHVibGljIEZlYXR1cmVbXSBwYXJzZShGaWxlIGxvY2F0aW9uKSB7Ci0JCWlmICghbG9jYXRpb24uZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGxvY2F0aW9uKTsKLQkJCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KCJkaWdlc3QueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaXMpLCB0aGlzKTsKLQkJCXJldHVybiAoRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoImRpZ2VzdCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWZlYXR1cmVIYW5kbGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJpYnV0ZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdjNWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIAotICogRmVhdHVyZSBpbmZvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZSB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGltYWdlOwotCi0JcHJpdmF0ZSBVUkxFbnRyeSBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFVSTEVudHJ5IGxpY2Vuc2U7Ci0JcHJpdmF0ZSBVUkxFbnRyeSBjb3B5cmlnaHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsSGFuZGxlcjsKLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsSGFuZGxlclVSTDsKLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsSGFuZGxlckxpYnJhcnk7Ci0KLQlwcml2YXRlIFVSTEVudHJ5IHVwZGF0ZVNpdGU7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZGlzY292ZXJ5U2l0ZXM7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBlbnRyaWVzOwotCXByaXZhdGUgU3RyaW5nIHByb3ZpZGVyTmFtZTsKLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyB3czsKLQlwcml2YXRlIFN0cmluZyBhcmNoOwotCXByaXZhdGUgU3RyaW5nIG5sOwotCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0KLQlwdWJsaWMgRmVhdHVyZShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGlzY292ZXJ5U2l0ZShTdHJpbmcgbGFiZWwsIFN0cmluZyB1cmwpIHsKLQkJaWYgKGxhYmVsID09IG51bGwgJiYgdXJsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZGlzY292ZXJ5U2l0ZXMgPT0gbnVsbCkKLQkJCXRoaXMuZGlzY292ZXJ5U2l0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVVJMRW50cnkgZW50cnkgPSBuZXcgVVJMRW50cnkodXJsLCBsYWJlbCk7Ci0JCXRoaXMuZGlzY292ZXJ5U2l0ZXMuYWRkKGVudHJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShGZWF0dXJlRW50cnkgcGx1Z2luKSB7Ci0JCWlmIChlbnRyaWVzID09IG51bGwpCi0JCQllbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaCgpIHsKLQkJcmV0dXJuIGFyY2g7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCWlmIChjb3B5cmlnaHQgIT0gbnVsbCkKLQkJCXJldHVybiBjb3B5cmlnaHQuZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodFVSTCgpIHsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsKQotCQkJcmV0dXJuIGNvcHlyaWdodC5nZXRVUkwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZGVzY3JpcHRpb24uZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uVVJMKCkgewotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRVUkwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSTEVudHJ5W10gZ2V0RGlzY292ZXJ5U2l0ZXMoKSB7Ci0JCWlmIChkaXNjb3ZlcnlTaXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeVswXTsKLQkJcmV0dXJuIChVUkxFbnRyeVtdKSBkaXNjb3ZlcnlTaXRlcy50b0FycmF5KG5ldyBVUkxFbnRyeVtkaXNjb3ZlcnlTaXRlcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZUVudHJ5W10gZ2V0RW50cmllcygpIHsKLQkJaWYgKGVudHJpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgRmVhdHVyZUVudHJ5WzBdOwotCQlyZXR1cm4gKEZlYXR1cmVFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IEZlYXR1cmVFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGFuZGxlcigpIHsKLQkJcmV0dXJuIGluc3RhbGxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KCkgewotCQlyZXR1cm4gaW5zdGFsbEhhbmRsZXJMaWJyYXJ5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbEhhbmRsZXJVUkwoKSB7Ci0JCXJldHVybiBpbnN0YWxsSGFuZGxlclVSTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKCkgewotCQlpZiAobGljZW5zZSAhPSBudWxsKQotCQkJcmV0dXJuIGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2VVUkwoKSB7Ci0JCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQlyZXR1cm4gbGljZW5zZS5nZXRVUkwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsKLQkJcmV0dXJuIG5sOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7Ci0JCXJldHVybiBvczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyTmFtZSgpIHsKLQkJcmV0dXJuIHByb3ZpZGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZVNpdGVMYWJlbCgpIHsKLQkJaWYgKHVwZGF0ZVNpdGUgIT0gbnVsbCkKLQkJCXJldHVybiB1cGRhdGVTaXRlLmdldEFubm90YXRpb24oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcGRhdGVTaXRlVVJMKCkgewotCQlpZiAodXBkYXRlU2l0ZSAhPSBudWxsKQotCQkJcmV0dXJuIHVwZGF0ZVNpdGUuZ2V0VVJMKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsKLQkJcmV0dXJuIHdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChTdHJpbmcgY29weXJpZ2h0KSB7Ci0JCWlmICh0aGlzLmNvcHlyaWdodCA9PSBudWxsKQotCQkJdGhpcy5jb3B5cmlnaHQgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5jb3B5cmlnaHQuc2V0QW5ub3RhdGlvbihjb3B5cmlnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodFVSTChTdHJpbmcgY29weXJpZ2h0VVJMKSB7Ci0JCWlmICh0aGlzLmNvcHlyaWdodCA9PSBudWxsKQotCQkJdGhpcy5jb3B5cmlnaHQgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5jb3B5cmlnaHQuc2V0VVJMKGNvcHlyaWdodFVSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWlmICh0aGlzLmRlc2NyaXB0aW9uID09IG51bGwpCi0JCQl0aGlzLmRlc2NyaXB0aW9uID0gbmV3IFVSTEVudHJ5KCk7Ci0JCXRoaXMuZGVzY3JpcHRpb24uc2V0QW5ub3RhdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25VUkwoU3RyaW5nIGRlc2NyaXB0aW9uVVJMKSB7Ci0JCWlmICh0aGlzLmRlc2NyaXB0aW9uID09IG51bGwpCi0JCQl0aGlzLmRlc2NyaXB0aW9uID0gbmV3IFVSTEVudHJ5KCk7Ci0JCXRoaXMuZGVzY3JpcHRpb24uc2V0VVJMKGRlc2NyaXB0aW9uVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChTdHJpbmcgb3MsIFN0cmluZyB3cywgU3RyaW5nIGFyY2gsIFN0cmluZyBubCkgewotCQl0aGlzLm9zID0gb3M7Ci0JCXRoaXMud3MgPSB3czsKLQkJdGhpcy5hcmNoID0gYXJjaDsKLQkJdGhpcy5ubCA9IG5sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltYWdlKFN0cmluZyBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbEhhbmRsZXIoU3RyaW5nIGluc3RhbGxIYW5kbGVyKSB7Ci0JCXRoaXMuaW5zdGFsbEhhbmRsZXIgPSBpbnN0YWxsSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoU3RyaW5nIGluc3RhbGxIYW5kbGVyTGlicmFyeSkgewotCQl0aGlzLmluc3RhbGxIYW5kbGVyTGlicmFyeSA9IGluc3RhbGxIYW5kbGVyTGlicmFyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSGFuZGxlclVSTChTdHJpbmcgaW5zdGFsbEhhbmRsZXJVUkwpIHsKLQkJdGhpcy5pbnN0YWxsSGFuZGxlclVSTCA9IGluc3RhbGxIYW5kbGVyVVJMOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGljZW5zZShTdHJpbmcgbGljZW5zZSkgewotCQlpZiAodGhpcy5saWNlbnNlID09IG51bGwpCi0JCQl0aGlzLmxpY2Vuc2UgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5saWNlbnNlLnNldEFubm90YXRpb24obGljZW5zZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGljZW5zZVVSTChTdHJpbmcgbGljZW5zZVVSTCkgewotCQlpZiAodGhpcy5saWNlbnNlID09IG51bGwpCi0JCQl0aGlzLmxpY2Vuc2UgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5saWNlbnNlLnNldFVSTChsaWNlbnNlVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHJvdmlkZXJOYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZUxhYmVsKFN0cmluZyB1cGRhdGVTaXRlTGFiZWwpIHsKLQkJaWYgKHRoaXMudXBkYXRlU2l0ZSA9PSBudWxsKQotCQkJdGhpcy51cGRhdGVTaXRlID0gbmV3IFVSTEVudHJ5KCk7Ci0JCXRoaXMudXBkYXRlU2l0ZS5zZXRBbm5vdGF0aW9uKHVwZGF0ZVNpdGVMYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZVVSTChTdHJpbmcgdXBkYXRlU2l0ZVVSTCkgewotCQlpZiAodGhpcy51cGRhdGVTaXRlID09IG51bGwpCi0JCQl0aGlzLnVwZGF0ZVNpdGUgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy51cGRhdGVTaXRlLnNldFVSTCh1cGRhdGVTaXRlVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHZhbHVlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkZlYXR1cmUgIiArIGlkICsgIiB2ZXJzaW9uOiAiICsgdmVyc2lvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NzRjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUVudHJ5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyB3czsKLQlwcml2YXRlIFN0cmluZyBhcmNoOwotCXByaXZhdGUgU3RyaW5nIG5sOwotCXByaXZhdGUgU3RyaW5nIG1hdGNoOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1BsdWdpbjsKLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc1JlcXVpcmVzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVucGFjayA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnkgZmllbGQgdG8gYWRkIHByb3Zpc2lvbmluZyBmaWx0ZXJzIHRvIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZmlsdGVyOwotCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlRW50cnkgY3JlYXRlUmVxdWlyZXMoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIG1hdGNoLCBTdHJpbmcgZmlsdGVyLCBib29sZWFuIGlzUGx1Z2luKSB7Ci0JCUZlYXR1cmVFbnRyeSByZXN1bHQgPSBuZXcgRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBpc1BsdWdpbik7Ci0JCXJlc3VsdC5tYXRjaCA9IG1hdGNoOwotCQlyZXN1bHQuaXNSZXF1aXJlcyA9IHRydWU7Ci0JCS8vIGZvciByZXF1aXJlcyB3ZSBkb24ndCBjYXJlIHdoYXQgdGhlIGZvcm0gaXMgc28gbGVhdmUgaXQgYXMgZmFsc2UgKEpBUidkKQotCQlyZXN1bHQudW5wYWNrID0gZmFsc2U7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZUVudHJ5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gaXNQbHVnaW4pIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLmlzUGx1Z2luID0gaXNQbHVnaW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZpbmFsIEZlYXR1cmVFbnRyeSBvdGhlciA9IChGZWF0dXJlRW50cnkpIG9iajsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5pZCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghaWQuZXF1YWxzKG90aGVyLmlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnZlcnNpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIXZlcnNpb24uZXF1YWxzKG90aGVyLnZlcnNpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2goKSB7Ci0JCXJldHVybiBhcmNoOwotCX0KLQotCS8qKgotCSAqIFRlbXBvcmFyeSBtZXRob2QgdG8gYWRkIHByb3Zpc2lvbmluZyBmaWx0ZXJzIHRvIGZlYXR1cmVzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2goKSB7Ci0JCXJldHVybiBtYXRjaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgewotCQlyZXR1cm4gbmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsKLQkJcmV0dXJuIHdzOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGlkID09IG51bGwpID8gMCA6IGlkLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodmVyc2lvbiA9PSBudWxsKSA/IDAgOiB2ZXJzaW9uLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBvcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BsdWdpbigpIHsKLQkJcmV0dXJuIGlzUGx1Z2luOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZXMoKSB7Ci0JCXJldHVybiBpc1JlcXVpcmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5wYWNrKCkgewotCQlyZXR1cm4gdW5wYWNrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZyBvcywgU3RyaW5nIHdzLCBTdHJpbmcgYXJjaCwgU3RyaW5nIG5sKSB7Ci0JCXRoaXMub3MgPSBvczsKLQkJdGhpcy53cyA9IHdzOwotCQl0aGlzLmFyY2ggPSBhcmNoOwotCQl0aGlzLm5sID0gbmw7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBhZGQgcHJvdmlzaW9uaW5nIGZpbHRlcnMgdG8gZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZyYWdtZW50KGJvb2xlYW4gdmFsdWUpIHsKLQkJaXNGcmFnbWVudCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKGJvb2xlYW4gdmFsdWUpIHsKLQkJb3B0aW9uYWwgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbnBhY2soYm9vbGVhbiB2YWx1ZSkgewotCQl1bnBhY2sgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHZhbHVlKSB7Ci0JCXVybCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcmVzdWx0LmFwcGVuZChpc1BsdWdpbiA/ICJQbHVnaW46ICIgOiAiRmVhdHVyZTogIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXN1bHQuYXBwZW5kKGlkICE9IG51bGwgPyBpZC50b1N0cmluZygpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbiAhPSBudWxsID8gIiAiICsgdmVyc2lvbi50b1N0cmluZygpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NDE0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIERlZmF1bHQgZmVhdHVyZSBwYXJzZXIuCi0gKiBQYXJzZXMgdGhlIGZlYXR1cmUgbWFuaWZlc3QgZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBGZWF0dXJlIHJlc3VsdDsKLQlwcml2YXRlIFVSTCB1cmw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY2hhcmFjdGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgbWVzc2FnZXMgPSBudWxsOwotCi0JcHVibGljIEZlYXR1cmVQYXJzZXIoKSB7Ci0JCXRoaXModHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZlYXR1cmVQYXJzZXIoYm9vbGVhbiBjcmVhdGVQYXJzZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCFjcmVhdGVQYXJzZXIpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoY2hhcmFjdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljaGFyYWN0ZXJzLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBuZXcgRmVhdHVyZShpZCwgdmVyc2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoY2hhcmFjdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0RGVzY3JpcHRpb24obG9jYWxpemUoY2hhcmFjdGVycy50b1N0cmluZygpLnRyaW0oKSkpOwotCQl9IGVsc2UgaWYgKCJsaWNlbnNlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0TGljZW5zZShsb2NhbGl6ZShjaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpKSk7Ci0JCX0gZWxzZSBpZiAoImNvcHlyaWdodCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0LnNldENvcHlyaWdodChsb2NhbGl6ZShjaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpKSk7Ci0JCX0KLQkJY2hhcmFjdGVycyA9IG51bGw7Ci0JfQotCi0JcHVibGljIEZlYXR1cmUgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhGaWxlIGRpcmVjdG9yeSkgewotCQkvL3NraXAgZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBjb250YWluIGEgZmVhdHVyZS5wcm9wZXJ0aWVzIGZpbGUKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAiZmVhdHVyZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJdHJ5IHsKLQkJCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJcmVzdWx0LmxvYWQoaW5wdXQpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbnB1dCAhPSBudWxsKQotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhKYXJGaWxlIGphcikgewotCQlKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeSgiZmVhdHVyZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oamFyLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQl0cnkgewotCQkJCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlyZXN1bHQubG9hZChpbnB1dCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxpemUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChtZXNzYWdlcyA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiJSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBtZXNzYWdlcy5nZXRQcm9wZXJ0eSh2YWx1ZS5zdWJzdHJpbmcoMSksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBhbmQgY29uc3RydWN0cyBhIGZlYXR1cmUuIFRoZSBnaXZlbiBsb2NhdGlvbiAKLQkgKiBzaG91bGQgYmUgZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmVhdHVyZSBKQVIgb3IgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCi0JICogdGhlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmVhdHVyZSB0byBwYXJzZS4gIAotCSAqLwotCXB1YmxpYyBGZWF0dXJlIHBhcnNlKEZpbGUgbG9jYXRpb24pIHsKLQkJaWYgKCFsb2NhdGlvbi5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgewotCQkJLy9za2lwIGRpcmVjdG9yaWVzIHRoYXQgZG9uJ3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGUKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLCAiZmVhdHVyZS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbG9hZFByb3BlcnRpZXMobG9jYXRpb24pOwotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJCXJldHVybiBwYXJzZShpbnB1dCwgcHJvcGVydGllcyk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobG9jYXRpb24uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGxvY2F0aW9uKTsKLQkJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhqYXIpOwotCQkJCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KCJmZWF0dXJlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oamFyLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQkJcmV0dXJuIHBhcnNlKGlucHV0LCBwcm9wZXJ0aWVzKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiBhIGZlYXR1cmUgb2JqZWN0Ci0JICogb3IgbnVsbC4gVGhpcyBtZXRob2QgY2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIEZlYXR1cmUgcGFyc2UoSW5wdXRTdHJlYW0gaW4sIFByb3BlcnRpZXMgbWVzc2FnZXMpIHsKLQkJdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOwotCQlyZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8JCQkJCVV0aWxzLmxvZyhlMS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb3B5cmlnaHQoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCXJlc3VsdC5zZXRDb3B5cmlnaHRVUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCWNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZXNjcmlwdGlvbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LnNldERlc2NyaXB0aW9uVVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpKTsgLy8kTk9OLU5MUy0xJAotCQljaGFyYWN0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlzY292ZXJ5U2l0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LmFkZERpc2NvdmVyeVNpdGUoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIiksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmVhdHVyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZCwgKG5ldyBTdHJpbmdbXSB7IGlkLCB2ZXJ9KSkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlRmVhdHVyZShpZCwgdmVyKTsKLQotCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRFbnZpcm9ubWVudChvcywgd3MsIGFyY2gsIG5sKTsKLQotCQkJLy9UT0RPIHJvb3RVUkxzCi0JCQlpZiAodXJsICE9IG51bGwgJiYgImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCXJlc3VsdC5zZXRVUkwoImZlYXR1cmVzIiArICIvIiArIGYuZ2V0UGFyZW50RmlsZSgpLmdldE5hbWUoKSArICIvIik7Ly8gKyBmLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9IGVsc2UgewotCQkJCS8vIGV4dGVybmFsaXplZCBVUkxzIG1pZ2h0IGJlIGluIHJlbGF0aXZlIGZvcm0sIGVuc3VyZSB0aGV5IGFyZSBhYnNvbHV0ZQkJCQkKLQkJCQkvLwkJCQlmZWF0dXJlLnNldFVSTChVdGlscy5tYWtlQWJzb2x1dGUoVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLCB1cmwpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJfQotCi0JCQlyZXN1bHQuc2V0UHJvdmlkZXJOYW1lKGxvY2FsaXplKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3ZpZGVyLW5hbWUiKSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0TGFiZWwobG9jYWxpemUoYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0SW1hZ2UoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8JCQlVdGlscy5kZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpZDoiICtpZCArICIgdmVyOiIgK3ZlciArICIgdXJsOiIgKyBmZWF0dXJlLmdldFVSTCgpKTsgCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbXBvcnQoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlGZWF0dXJlRW50cnkgZW50cnkgPSBudWxsOwotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJZW50cnkgPSBGZWF0dXJlRW50cnkuY3JlYXRlUmVxdWlyZXMoaWQsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibWF0Y2giKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmlsdGVyIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfSBlbHNlIHsKLQkJCWlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5ID0gRmVhdHVyZUVudHJ5LmNyZWF0ZVJlcXVpcmVzKGlkLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIiksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm1hdGNoIiksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZpbHRlciIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXN1bHQuYWRkRW50cnkoZW50cnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5jbHVkZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCUZlYXR1cmVFbnRyeSBlbnRyeSA9IG5ldyBGZWF0dXJlRW50cnkoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgZmxhZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9wdGlvbmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZsYWcgIT0gbnVsbCkKLQkJCWVudHJ5LnNldE9wdGlvbmFsKEJvb2xlYW4udmFsdWVPZihmbGFnKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXNldEVudmlyb25tZW50KGF0dHJpYnV0ZXMsIGVudHJ5KTsKLQkJcmVzdWx0LmFkZEVudHJ5KGVudHJ5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luc3RhbGxIYW5kbGVyKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0SW5zdGFsbEhhbmRsZXIoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaGFuZGxlciIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxpYnJhcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldEluc3RhbGxIYW5kbGVyVVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTGljZW5zZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LnNldExpY2Vuc2VVUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCWNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSB8fCB2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZCgiRmVhdHVyZVBhcnNlciNwcm9jZXNzUGx1Z2luLCBJRCB7MH0gb3IgdmVyc2lvbiB7MX0gaW52YWxpZCIsIChuZXcgU3RyaW5nW10ge2lkLCB2ZXJzaW9ufSkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJRmVhdHVyZUVudHJ5IHBsdWdpbiA9IG5ldyBGZWF0dXJlRW50cnkoaWQsIHZlcnNpb24sIHRydWUpOwotCQkJc2V0RW52aXJvbm1lbnQoYXR0cmlidXRlcywgcGx1Z2luKTsKLQkJCVN0cmluZyB1bnBhY2sgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1bnBhY2siKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHVucGFjayAhPSBudWxsKQotCQkJCXBsdWdpbi5zZXRVbnBhY2soQm9vbGVhbi52YWx1ZU9mKHVucGFjaykuYm9vbGVhblZhbHVlKCkpOwotCQkJU3RyaW5nIGZyYWdtZW50ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQkJcGx1Z2luLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZihmcmFnbWVudCkuYm9vbGVhblZhbHVlKCkpOwotCQkJU3RyaW5nIGZpbHRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsdGVyICE9IG51bGwpCi0JCQkJcGx1Z2luLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJcmVzdWx0LmFkZEVudHJ5KHBsdWdpbik7Ci0KLQkJCS8vCQkJVXRpbHMuZGVidWcoIkVuZCBwcm9jZXNzIERlZmF1bHRGZWF0dXJlIHRhZzogaWQ6IiArIGlkICsgIiB2ZXI6IiArIHZlciArICIgdXJsOiIgKyBmZWF0dXJlLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVXBkYXRlU2l0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LnNldFVwZGF0ZVNpdGVMYWJlbChhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0VXBkYXRlU2l0ZVVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW52aXJvbm1lbnQoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBGZWF0dXJlRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBubCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5sIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0RW52aXJvbm1lbnQob3MsIHdzLCBhcmNoLCBubCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLy8JCVV0aWxzLmRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpZiAoInBsdWdpbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgibGljZW5zZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0xpY2Vuc2UoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoImNvcHlyaWdodCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0NvcHlyaWdodChhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiZmVhdHVyZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoImltcG9ydCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0ltcG9ydChhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiaW5jbHVkZXMiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NJbmNsdWRlcyhhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiaW5zdGFsbC1oYW5kbGVyIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzSW5zdGFsbEhhbmRsZXIoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoInVwZGF0ZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc1VwZGF0ZVNpdGUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoImRpc2NvdmVyeSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0Rpc2NvdmVyeVNpdGUoYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFhY2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfTm9TaXRlVGFnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1dyb25nUGFyc2luZ1N0YWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX01pc3Npbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX0NhdGVnb3J5QWxyZWFkeVNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfSW52YWxpZFhNTFN0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9taXJyb3JzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JSZWFkaW5nRGlnZXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yUmVhZGluZ0ZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JSZWFkaW5nU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9Qcm9kdWN0RmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvUHJvZHVjdEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0ZjBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9Qcm9kdWN0RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ29kZSA5IC0gQWRkaXRpb25hbCBmdW5jdGlvbiBhbmQgZml4ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9kdWN0RmlsZSBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgSVByb2R1Y3REZXNjcmlwdG9yIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9BUkdTID0gInByb2dyYW1BcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0FSR1NfTElOVVggPSAicHJvZ3JhbUFyZ3NMaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19NQUMgPSAicHJvZ3JhbUFyZ3NNYWMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19TT0xBUklTID0gInByb2dyYW1BcmdzU29sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0FSR1NfV0lOID0gInByb2dyYW1BcmdzV2luIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTID0gInZtQXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fQVJHU19MSU5VWCA9ICJ2bUFyZ3NMaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNX0FSR1NfTUFDID0gInZtQXJnc01hYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fQVJHU19TT0xBUklTID0gInZtQXJnc1NvbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fQVJHU19XSU4gPSAidm1BcmdzV2luIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTEFSSVNfTEFSR0UgPSAic29sYXJpc0xhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xBUklTX01FRElVTSA9ICJzb2xhcmlzTWVkaXVtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xBUklTX1NNQUxMID0gInNvbGFyaXNTbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MQVJJU19USU5ZID0gInNvbGFyaXNUaW55IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU4zMl8xNl9MT1cgPSAid2luU21hbGxMb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzE2X0hJR0ggPSAid2luU21hbGxIaWdoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU4zMl8yNF9MT1cgPSAid2luMjRMb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzMyX0xPVyA9ICJ3aW5NZWRpdW1Mb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzMyX0hJR0ggPSAid2luTWVkaXVtSGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfNDhfTE9XID0gIndpbkxhcmdlTG93IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU4zMl80OF9ISUdIID0gIndpbkxhcmdlSGlnaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19XSU4zMiA9ICJ3aW4zMiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19MSU5VWCA9ICJsaW51eCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19TT0xBUklTID0gInNvbGFyaXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfTUFDT1NYID0gIm1hY29zeCI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1QgPSAicHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lOSSA9ICJjb25maWdJbmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSID0gImxhdW5jaGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUl9BUkdTID0gImxhdW5jaGVyQXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOUyA9ICJwbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMQVNIID0gInNwbGFzaCI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9VU0VfSUNPID0gInVzZUljbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vVGhlc2UgY29uc3RhbnRzIGZvcm0gYSBzbWFsbCBzdGF0ZSBtYWNoaW5lIHRvIHBhcnNlIHRoZSAucHJvZHVjdCBmaWxlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJUID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPRFVDVCA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0xBVU5DSEVSID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTEFVTkNIRVJfQVJHUyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMVUdJTlMgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GRUFUVVJFUyA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHUyA9IDY7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHU19MSU5VWCA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHU19NQUMgPSA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUk9HUkFNX0FSR1NfU09MQVJJUyA9IDk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHU19XSU4gPSAxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVk1fQVJHUyA9IDExOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9WTV9BUkdTX0xJTlVYID0gMTI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfTUFDID0gMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfU09MQVJJUyA9IDE0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9WTV9BUkdTX1dJTiA9IDE1OwotCi0JcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKLQotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIFN0cmluZyBsYXVuY2hlck5hbWUgPSBudWxsOwotCXByaXZhdGUgTWFwIGljb25zID0gbmV3IEhhc2hNYXAoNik7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiB1c2VGZWF0dXJlcyA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBwbHVnaW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZnJhZ21lbnRzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZmVhdHVyZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNwbGFzaExvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgUHJvcGVydGllcyBsYXVuY2hlckFyZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCXByaXZhdGUgZmluYWwgTWFwIHBsYXRmb3JtU3BlY2lmaWNDb25maWdQYXRocyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEZpbGUgbG9jYXRpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCXRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoIlxccnxcXG58XFxmfFxcdCIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gdGV4dC5yZXBsYWNlQWxsKCJcXHMrIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGZlYXR1cmUgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBQcm9kdWN0RmlsZShTdHJpbmcgbG9jYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQl0aGlzLmxvY2F0aW9uID0gbmV3IEZpbGUobG9jYXRpb24pOwotCQkvLwkJdHJ5IHsKLQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJcGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2F0aW9uKSk7Ci0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJcGFyc2VyID0gbnVsbDsKLQkJLy8JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZPUk1BVCwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3Byb2R1Y3RQYXJzZSwgbG9jYXRpb24pLCBlKSk7Ci0JCS8vCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZPUk1BVCwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3Byb2R1Y3RQYXJzZSwgbG9jYXRpb24pLCBlKSk7Ci0JCS8vCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfUERFQlVJTEQsIEVYQ0VQVElPTl9QUk9EVUNUX0ZJTEUsIE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9taXNzaW5nRWxlbWVudCwgbG9jYXRpb24pLCBudWxsKSk7Ci0JCS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9QREVCVUlMRCwgRVhDRVBUSU9OX1BST0RVQ1RfRk9STUFULCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fcHJvZHVjdFBhcnNlLCBsb2NhdGlvbiksIGUpKTsKLQkJLy8JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyTmFtZSgpIHsKLQkJcmV0dXJuIGxhdW5jaGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEJ1bmRsZXMoYm9vbGVhbiBpbmNsdWRlRnJhZ21lbnRzKSB7Ci0JCUxpc3QgcCA9IHBsdWdpbnMgIT0gbnVsbCA/IHBsdWdpbnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZiAoIWluY2x1ZGVGcmFnbWVudHMpCi0JCQlyZXR1cm4gcDsKLQotCQlMaXN0IGYgPSBmcmFnbWVudHMgIT0gbnVsbCA/IGZyYWdtZW50cyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWludCBzaXplID0gcC5zaXplKCkgKyBmLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUxpc3QgYm90aCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWJvdGguYWRkQWxsKHApOwotCQlib3RoLmFkZEFsbChmKTsKLQkJcmV0dXJuIGJvdGg7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RnJhZ21lbnRzKCkgewotCQlpZiAoZnJhZ21lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGZyYWdtZW50czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGZWF0dXJlcygpIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luKFN0cmluZyBwbHVnaW4pIHsKLQkJcmV0dXJuIChwbHVnaW5zICE9IG51bGwgJiYgcGx1Z2lucy5jb250YWlucyhwbHVnaW4pKSB8fCAoZnJhZ21lbnRzICE9IG51bGwgJiYgZnJhZ21lbnRzLmNvbnRhaW5zKHBsdWdpbikpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIHVybCBhbmQgY29uc3RydWN0cyBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SWNvbnMoU3RyaW5nIG9zKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gKENvbGxlY3Rpb24pIGljb25zLmdldChvcyk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0luaVBhdGgoU3RyaW5nIG9zKSB7Ci0JCVN0cmluZyBzcGVjaWZpYyA9IChTdHJpbmcpIHBsYXRmb3JtU3BlY2lmaWNDb25maWdQYXRocy5nZXQob3MpOwotCQlyZXR1cm4gc3BlY2lmaWMgPT0gbnVsbCA/IGNvbmZpZ1BhdGggOiBzcGVjaWZpYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0luaVBhdGgoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwbGFzaExvY2F0aW9uKCkgewotCQlyZXR1cm4gc3BsYXNoTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2R1Y3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VGZWF0dXJlcygpIHsKLQkJcmV0dXJuIHVzZUZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuICh2ZXJzaW9uID09IG51bGwpID8gIjAuMC4wIiA6IHZlcnNpb247IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZNQXJndW1lbnRzKFN0cmluZyBvcykgewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaWYgKG9zLmVxdWFscyhPU19XSU4zMikpIHsKLQkJCWtleSA9IFZNX0FSR1NfV0lOOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19MSU5VWCkpIHsKLQkJCWtleSA9IFZNX0FSR1NfTElOVVg7Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX01BQ09TWCkpIHsKLQkJCWtleSA9IFZNX0FSR1NfTUFDOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19TT0xBUklTKSkgewotCQkJa2V5ID0gVk1fQVJHU19TT0xBUklTOwotCQl9Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGxhdW5jaGVyQXJncy5nZXRQcm9wZXJ0eShWTV9BUkdTKTsKLQkJU3RyaW5nIHBsYXRmb3JtID0gbnVsbCwgYXJncyA9IG51bGw7Ci0JCWlmIChrZXkgIT0gbnVsbCkKLQkJCXBsYXRmb3JtID0gbGF1bmNoZXJBcmdzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCkKLQkJCWFyZ3MgPSBwbGF0Zm9ybSAhPSBudWxsID8gcHJlZml4ICsgIiAiICsgcGxhdGZvcm0gOiBwcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYXJncyA9IHBsYXRmb3JtICE9IG51bGwgPyBwbGF0Zm9ybSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBub3JtYWxpemUoYXJncyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzKFN0cmluZyBvcykgewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaWYgKG9zLmVxdWFscyhPU19XSU4zMikpIHsKLQkJCWtleSA9IFBST0dSQU1fQVJHU19XSU47Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX0xJTlVYKSkgewotCQkJa2V5ID0gUFJPR1JBTV9BUkdTX0xJTlVYOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19NQUNPU1gpKSB7Ci0JCQlrZXkgPSBQUk9HUkFNX0FSR1NfTUFDOwotCQl9IGVsc2UgaWYgKG9zLmVxdWFscyhPU19TT0xBUklTKSkgewotCQkJa2V5ID0gUFJPR1JBTV9BUkdTX1NPTEFSSVM7Ci0JCX0KLQotCQlTdHJpbmcgcHJlZml4ID0gbGF1bmNoZXJBcmdzLmdldFByb3BlcnR5KFBST0dSQU1fQVJHUyk7Ci0JCVN0cmluZyBwbGF0Zm9ybSA9IG51bGwsIGFyZ3MgPSBudWxsOwotCQlpZiAoa2V5ICE9IG51bGwpCi0JCQlwbGF0Zm9ybSA9IGxhdW5jaGVyQXJncy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAocHJlZml4ICE9IG51bGwpCi0JCQlhcmdzID0gcGxhdGZvcm0gIT0gbnVsbCA/IHByZWZpeCArICIgIiArIHBsYXRmb3JtIDogcHJlZml4OyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWFyZ3MgPSBwbGF0Zm9ybSAhPSBudWxsID8gcGxhdGZvcm0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbm9ybWFsaXplKGFyZ3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNUQVRFX1NUQVJUIDoKLQkJCQlpZiAoUFJPRFVDVC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzUHJvZHVjdChhdHRyaWJ1dGVzKTsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9EVUNUOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9QUk9EVUNUIDoKLQkJCQlpZiAoQ09ORklHX0lOSS5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzQ29uZmlnSW5pKGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSBpZiAoTEFVTkNIRVIuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc0xhdW5jaGVyKGF0dHJpYnV0ZXMpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX0xBVU5DSEVSOwotCQkJCX0gZWxzZSBpZiAoUExVR0lOUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BMVUdJTlM7Ci0JCQkJfSBlbHNlIGlmIChGRUFUVVJFUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX0ZFQVRVUkVTOwotCQkJCX0gZWxzZSBpZiAoTEFVTkNIRVJfQVJHUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX0xBVU5DSEVSX0FSR1M7Ci0JCQkJfSBlbHNlIGlmIChTUExBU0guZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3BsYXNoTG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0xBVU5DSEVSIDoKLQkJCQlpZiAoT1NfU09MQVJJUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzU29sYXJpcyhhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgaWYgKCJ3aW4iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc1dpbihhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgaWYgKE9TX0xJTlVYLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NMaW51eChhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgaWYgKE9TX01BQ09TWC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzTWFjKGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCQlpZiAoImljbyIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzSWNvKGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSBpZiAoImJtcCIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzQm1wKGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9MQVVOQ0hFUl9BUkdTIDoKLQkJCQlpZiAoUFJPR1JBTV9BUkdTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPR1JBTV9BUkdTOwotCQkJCX0gZWxzZSBpZiAoUFJPR1JBTV9BUkdTX0xJTlVYLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPR1JBTV9BUkdTX0xJTlVYOwotCQkJCX0gZWxzZSBpZiAoUFJPR1JBTV9BUkdTX01BQy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0dSQU1fQVJHU19NQUM7Ci0JCQkJfSBlbHNlIGlmIChQUk9HUkFNX0FSR1NfU09MQVJJUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0dSQU1fQVJHU19TT0xBUklTOwotCQkJCX0gZWxzZSBpZiAoUFJPR1JBTV9BUkdTX1dJTi5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0dSQU1fQVJHU19XSU47Ci0JCQkJfSBlbHNlIGlmIChWTV9BUkdTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfVk1fQVJHUzsKLQkJCQl9IGVsc2UgaWYgKFZNX0FSR1NfTElOVVguZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9WTV9BUkdTX0xJTlVYOwotCQkJCX0gZWxzZSBpZiAoVk1fQVJHU19NQUMuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9WTV9BUkdTX01BQzsKLQkJCQl9IGVsc2UgaWYgKFZNX0FSR1NfU09MQVJJUy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1ZNX0FSR1NfU09MQVJJUzsKLQkJCQl9IGVsc2UgaWYgKFZNX0FSR1NfV0lOLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfVk1fQVJHU19XSU47Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX1BMVUdJTlMgOgotCQkJCWlmICgicGx1Z2luIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkVTIDoKLQkJCQlpZiAoImZlYXR1cmUiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9QTFVHSU5TIDoKLQkJCQlpZiAoUExVR0lOUy5lcXVhbHMobG9jYWxOYW1lKSkKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9EVUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9GRUFUVVJFUyA6Ci0JCQkJaWYgKEZFQVRVUkVTLmVxdWFscyhsb2NhbE5hbWUpKQotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0RVQ1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX0xBVU5DSEVSX0FSR1MgOgotCQkJCWlmIChMQVVOQ0hFUl9BUkdTLmVxdWFscyhsb2NhbE5hbWUpKQotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0RVQ1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX0xBVU5DSEVSIDoKLQkJCQlpZiAoTEFVTkNIRVIuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQkJCXN0YXRlID0gU1RBVEVfUFJPRFVDVDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1MgOgotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfTElOVVggOgotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfTUFDIDoKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX1NPTEFSSVMgOgotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfV0lOIDoKLQkJCWNhc2UgU1RBVEVfVk1fQVJHUyA6Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfTElOVVggOgotCQkJY2FzZSBTVEFURV9WTV9BUkdTX01BQyA6Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfU09MQVJJUyA6Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfV0lOIDoKLQkJCQlzdGF0ZSA9IFNUQVRFX0xBVU5DSEVSX0FSR1M7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFBST0dSQU1fQVJHUywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX0xJTlVYIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFBST0dSQU1fQVJHU19MSU5VWCwgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX01BQyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChQUk9HUkFNX0FSR1NfTUFDLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfU09MQVJJUyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChQUk9HUkFNX0FSR1NfU09MQVJJUywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfUFJPR1JBTV9BUkdTX1dJTiA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChQUk9HUkFNX0FSR1NfV0lOLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9WTV9BUkdTIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFZNX0FSR1MsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfTElOVVggOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoVk1fQVJHU19MSU5VWCwgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19NQUMgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoVk1fQVJHU19NQUMsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfU09MQVJJUyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChWTV9BUkdTX1NPTEFSSVMsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfV0lOIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFZNX0FSR1NfV0lOLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExhdW5jaEFyZ3VtZW50VG9NYXAoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChsYXVuY2hlckFyZ3MgPT0gbnVsbCkKLQkJCWxhdW5jaGVyQXJncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQkJU3RyaW5nIG9sZFZhbHVlID0gbGF1bmNoZXJBcmdzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBudWxsKQotCQkJbGF1bmNoZXJBcmdzLnNldFByb3BlcnR5KGtleSwgb2xkVmFsdWUgKyB2YWx1ZSk7Ci0JCWVsc2UKLQkJCWxhdW5jaGVyQXJncy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGZyYWdtZW50ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCAmJiBuZXcgQm9vbGVhbihmcmFnbWVudCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCWlmIChmcmFnbWVudHMgPT0gbnVsbCkKLQkJCQlmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmcmFnbWVudHMuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlpZiAocGx1Z2lucyA9PSBudWxsKQotCQkJCXBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlwbHVnaW5zLmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmZWF0dXJlcy5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2R1Y3QoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9kdWN0TmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlhcHBsaWNhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVzZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVzZUZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVzZSAhPSBudWxsKQotCQkJdXNlRmVhdHVyZXMgPSBCb29sZWFuLnZhbHVlT2YodXNlKS5ib29sZWFuVmFsdWUoKTsKLQkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlnSW5pKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCWlmICgiY3VzdG9tIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXNlIikpKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlwYXRoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAob3MgIT0gbnVsbCAmJiBvcy5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IGEgcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdCB0byBvdmVyLXJpZGUgYSBjdXN0b20gZ2VuZXJpYyBwYXRoPwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlwbGF0Zm9ybVNwZWNpZmljQ29uZmlnUGF0aHMucHV0KG9zLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ1BhdGggPSBwYXRoOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYXVuY2hlcihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJbGF1bmNoZXJOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEljb24oU3RyaW5nIG9zLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IChDb2xsZWN0aW9uKSBpY29ucy5nZXQob3MpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCg2KTsKLQkJCWljb25zLnB1dChvcywgbGlzdCk7Ci0JCX0KLQkJaWYgKCFuZXcgRmlsZSh2YWx1ZSkuaXNBYnNvbHV0ZSgpKQotCQkJdmFsdWUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCksIHZhbHVlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJbGlzdC5hZGQodmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzU29sYXJpcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJYWRkSWNvbihPU19TT0xBUklTLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFNPTEFSSVNfTEFSR0UpKTsKLQkJYWRkSWNvbihPU19TT0xBUklTLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFNPTEFSSVNfTUVESVVNKSk7Ci0JCWFkZEljb24oT1NfU09MQVJJUywgYXR0cmlidXRlcy5nZXRWYWx1ZShTT0xBUklTX1NNQUxMKSk7Ci0JCWFkZEljb24oT1NfU09MQVJJUywgYXR0cmlidXRlcy5nZXRWYWx1ZShTT0xBUklTX1RJTlkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1dpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJLy8JCXVzZUljbyA9IEJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGVzLmdldFZhbHVlKFBfVVNFX0lDTykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSWNvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXRoIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NCbXAoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfMTZfSElHSCkpOwotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzE2X0xPVykpOwotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzI0X0xPVykpOwotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzMyX0hJR0gpKTsKLQkJYWRkSWNvbihPU19XSU4zMiwgYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl8zMl9MT1cpKTsKLQkJYWRkSWNvbihPU19XSU4zMiwgYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl80OF9ISUdIKSk7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfNDhfTE9XKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaW51eChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJYWRkSWNvbihPU19MSU5VWCwgYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWNvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTWFjKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlhZGRJY29uKE9TX01BQ09TWCwgYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWNvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1NpdGVDYXRlZ29yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTc1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBBIGNhdGVnb3J5IGluIGFuIHVwZGF0ZSBzaXRlLgotICogCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5DYXRlZ29yeU1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUNhdGVnb3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgY29tcDsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbXBhcmF0b3IgZm9yIGNhdGVnb3J5IG1vZGVscy4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbXBhcmF0b3IKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCWlmIChjb21wID09IG51bGwpIHsKLQkJCWNvbXAgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkvKgotCQkJCSAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCxPYmplY3QpCi0JCQkJICogUmV0dXJucyAwIGlmIHZlcnNpb25zIGFyZSBlcXVhbC4KLQkJCQkgKiBSZXR1cm5zIC0xIGlmIG9iamVjdDEgaXMgYWZ0ZXIgdGhhbiBvYmplY3QyLgotCQkJCSAqIFJldHVybnMgKzEgaWYgb2JqZWN0MSBpcyBiZWZvcmUgdGhhbiBvYmplY3QyLgotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCi0JCQkJCVNpdGVDYXRlZ29yeSBjYXQxID0gKFNpdGVDYXRlZ29yeSkgbzE7Ci0JCQkJCVNpdGVDYXRlZ29yeSBjYXQyID0gKFNpdGVDYXRlZ29yeSkgbzI7Ci0KLQkJCQkJaWYgKGNhdDEuZXF1YWxzKGNhdDIpKQotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCXJldHVybiBjYXQxLmdldE5hbWUoKS5jb21wYXJlVG8oY2F0Mi5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVDYXRlZ29yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlIHR3byBjYXRlZ29yeSBtb2RlbHMgZm9yIGVxdWFsaXR5LgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCVNpdGVDYXRlZ29yeSBvdGhlckNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgb2JqOwotCQkJcmVzdWx0ID0gZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJDYXRlZ29yeS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGRlc2NyaXB0aW9uCi0JICogCi0JICogQHJldHVybiBjYXRlZ29yeSBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiBjYXRlZ29yeSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIGhhc2ggY29kZSBmb3IgY2F0ZWdvcnkgbW9kZWwuCi0JICogCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZSBVUkwKLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwKLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cwotCQkvLwkJbG9jYWxpemVkTGFiZWwgPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCBsYWJlbCk7Ci0KLQkJLy8gZGVsZWdhdGUgdG8gcmVmZXJlbmNlcwotCQkvLwkJcmVzb2x2ZVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbk1vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gY2F0ZWdvcnkgZGVzY3JpcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBkaXNwbGF5YWJsZSBsYWJlbC4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgcmVzb3VyY2Uga2V5Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2F0ZWdvcnkgbmFtZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIGNhdGVnb3J5IG5hbWUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUZlYXR1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1NpdGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjQzYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTE3ODMsIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZlYXR1cmVEb3dubG9hZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIHJlZmVyZW5jZSB0byBhIGZlYXR1cmUgaW4gYW4gdXBkYXRlIHNpdGUueG1sIGZpbGUuCi0gKiAKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVSZWZlcmVuY2VNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNpdGVGZWF0dXJlIHsKLQotCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0JLy8gcGVyZm9ybWFuY2UKLQlwcml2YXRlIFVSTCBiYXNlOwotCXByaXZhdGUgTGlzdCAvKiBvZiBTdHJpbmcqL2NhdGVnb3J5TmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOwotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVWZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIG5sOwotCi0JcHJpdmF0ZSBTdHJpbmcgb3M7Ci0JcHJpdmF0ZSBTdHJpbmcgcGF0Y2g7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTaXRlTW9kZWwgc2l0ZTsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgVVJMIHVybDsKLQlwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgd3M7Ci0KLQkvKgotCSAqIENvbXBhcmVzIHR3byBVUkwgZm9yIGVxdWFsaXR5Ci0JICogUmV0dXJuIGZhbHNlIGlmIG9uZSBvZiB0aGVtIGlzIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FtZVVSTChVUkwgdXJsMSwgVVJMIHVybDIpIHsKLQotCQlpZiAodXJsMSA9PSBudWxsIHx8IHVybDIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHVybDEgPT0gdXJsMikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodXJsMS5lcXVhbHModXJsMikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBjaGVjayBpZiBVUkwgYXJlIGZpbGU6IFVSTCBhcyB3ZSBtYXkKLQkJLy8gaGF2ZSAyIFVSTCBwb2ludGluZyB0byB0aGUgc2FtZSBmZWF0dXJlUmVmZXJlbmNlCi0JCS8vIGJ1dCB3aXRoIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbgotCQkvLyAoaS5lLiBmaWxlOi9DOy8gYW5kIGZpbGU6QzovKQotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDEuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwyLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKHVybDEuZ2V0RmlsZSgpKTsKLQkJRmlsZSBmaWxlMiA9IG5ldyBGaWxlKHVybDIuZ2V0RmlsZSgpKTsKLQotCQlpZiAoZmlsZTEgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGZpbGUxLmVxdWFscyhmaWxlMikpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCBvYmplY3QuCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5hbWUgb2YgYSBjYXRlZ29yeSB0aGlzIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5TmFtZShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0JCWlmICh0aGlzLmNhdGVnb3J5TmFtZXMgPT0gbnVsbCkKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCF0aGlzLmNhdGVnb3J5TmFtZXMuY29udGFpbnMoY2F0ZWdvcnlOYW1lKSkKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcy5hZGQoY2F0ZWdvcnlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7Ci0KLQkJLy8gUEVSRjogZGVsYXkgcmVzb2x1dGlvbgotCQlpZiAocmVzb2x2ZWQpCi0JCQlyZXR1cm47Ci0KLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChiYXNlLCB1cmxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlcyAyIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscyBmb3IgZXF1YWxpdHkKLQkgKiAgCi0JICogQHBhcmFtIG9iamVjdCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCB0byBjb21wYXJlIHdpdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gbW9kZWxzIGFyZSBlcXVhbCwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0VVJMKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBTaXRlRmVhdHVyZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU2l0ZUZlYXR1cmUgZiA9IChTaXRlRmVhdHVyZSkgb2JqZWN0OwotCi0JCXJldHVybiBzYW1lVVJMKGdldFVSTCgpLCBmLmdldFVSTCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBjYXRlZ29yaWVzIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlOYW1lcygpIHsKLQkJaWYgKGNhdGVnb3J5TmFtZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCi0JCXJldHVybiAoU3RyaW5nW10pIGNhdGVnb3J5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBmZWF0dXJlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB2ZXJzaW9uIGFzIGEgc3RyaW5nCi0JICogCi0JICogQHJldHVybiBmZWF0dXJlIHZlcnNpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlVmVyc2lvbigpIHsKLQkJcmV0dXJuIGZlYXR1cmVWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLiBJZiB0aGUgbW9kZWwKLQkgKiBvYmplY3QgaGFzIGJlZW4gcmVzb2x2ZWQsIHRoZSBsYWJlbCBpcyBsb2NhbGl6ZWQuCi0JICoKLQkgKiBAcmV0dXJuIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4KLQkgKgotCSAqIEByZXR1cm4gbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbE5vbkxvY2FsaXplZCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7Ci0JCXJldHVybiBubDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7Ci0JCXJldHVybiBvczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uYWwgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgewotCQlyZXR1cm4gYXJjaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0Y2goKSB7Ci0JCXJldHVybiBwYXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXRlIG1vZGVsIGZvciB0aGUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsIGdldFNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIHR5cGUuCi0JICogCi0JICogQHJldHVybiBmZWF0dXJlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdAotCSAqIGZlYXR1cmUgdHlwZSBmb3IgdGhlIHNpdGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSTCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdXJsIHN0cmluZwotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlkZWxheWVkUmVzb2x2ZSgpOwotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIHJlZmVyZW5jZS4KLQkgKgotCSAqIEByZXR1cm4gdXJsIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMU3RyaW5nKCkgewotCQlyZXR1cm4gdXJsU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsKLQkJcmV0dXJuIHdzOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIG1vZGVsIG9iamVjdC4KLQkgKiBBbnkgVVJMIHN0cmluZ3MgaW4gdGhlIG1vZGVsIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUKLQkgKiBzcGVjaWZpZWQgYXMgdHJhbnNsYXRpb24ga2V5cyBhcmUgbG9jYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCAKLQkgKiByZXNvdXJjZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVCYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgcmVzb2x2ZUJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQl0aGlzLmJhc2UgPSByZXNvbHZlQmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBhcmNoIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaChTdHJpbmcgYXJjaCkgewotCQl0aGlzLmFyY2ggPSBhcmNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVzIG9mIGNhdGVnb3JpZXMgdGhpcyBmZWF0dXJlIGJlbG9uZ3MgdG8uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lcyBhbiBhcnJheSBvZiBjYXRlZ29yeSBuYW1lcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5TmFtZXMoU3RyaW5nW10gY2F0ZWdvcnlOYW1lcykgewotCQlpZiAoY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGNhdGVnb3J5TmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZUlkIGZlYXR1cmUgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVJZGVudGlmaWVyKFN0cmluZyBmZWF0dXJlSWQpIHsKLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVhdHVyZSB2ZXJzaW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVWZXJzaW9uIGZlYXR1cmUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVWZXJzaW9uKFN0cmluZyBmZWF0dXJlVmVyc2lvbikgewotCQl0aGlzLmZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gbmwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgewotCQl0aGlzLm5sID0gbmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gb3Mgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsKLQkJdGhpcy5vcyA9IG9zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGNoIG1vZGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0Y2goU3RyaW5nIHBhdGNoKSB7Ci0JCXRoaXMucGF0Y2ggPSBwYXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlIGZvciB0aGUgcmVmZXJlbmNlZC4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBzaXRlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlTW9kZWwoU2l0ZU1vZGVsIHNpdGUpIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgdHlwZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHJlZmVyZW5jZWQgZmVhdHVyZSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHVucmVzb2x2ZWQgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTFN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCXRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOwotCQl0aGlzLnVybCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gd3Mgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsKLQkJdGhpcy53cyA9IHdzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldENsYXNzKCkudG9TdHJpbmcoKSArICIgOiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIiBhdCAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1ZGExMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgbW9kZWwgb2YgYW4gdXBkYXRlIHNpdGUuCi0gKiAKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNpdGVNb2RlbCB7Ci0KLQlwcml2YXRlIExpc3QgLypvZiBBcmNoaXZlUmVmZXJlbmNlTW9kZWwqL2FyY2hpdmVSZWZlcmVuY2VzOwotCS8qKgotCSAqIE1hcCBvZiBTdHJpbmcgKGNhdGVnb3J5IGlkKSAtPiBTaXRlQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIE1hcCBjYXRlZ29yaWVzOwotCXByaXZhdGUgVVJMRW50cnkgZGVzY3JpcHRpb247Ci0JLyoqCi0JICogTWFwIG9mIFN0cmluZyAoZmVhdHVyZSBpZCkgLT4gU2l0ZUZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIExpc3QgZmVhdHVyZXM7Ci0JcHJpdmF0ZSBVUkwgbG9jYXRpb25VUkw7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25VUkxTdHJpbmc7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIFVSTEVudHJ5ICovbWlycm9yczsKLQlwcml2YXRlIFN0cmluZyBtaXJyb3JzVVJMU3RyaW5nOwotCXByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c1BhY2syMDA7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBzaXRlIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsIHRvIHNpdGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlZmVyZW5jZSBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmNoaXZlKFVSTEVudHJ5IGFyY2hpdmVSZWZlcmVuY2UpIHsKLQkJaWYgKHRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghdGhpcy5hcmNoaXZlUmVmZXJlbmNlcy5jb250YWlucyhhcmNoaXZlUmVmZXJlbmNlKSkKLQkJCXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMuYWRkKGFyY2hpdmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBjYXRlZ29yeSB0byB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkKLQkJCWNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIWNhdGVnb3JpZXMuY29udGFpbnNLZXkoY2F0ZWdvcnkuZ2V0TmFtZSgpKSkKLQkJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCB0byBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZShTaXRlRmVhdHVyZSBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCWlmICh0aGlzLmZlYXR1cmVzID09IG51bGwpCi0JCQl0aGlzLmZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZlYXR1cmVzLmFkZChmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWlycm9yIHNpdGUuCi0JICogCi0JICogQHBhcmFtIG1pcnJvciBtaXJyb3IgbW9kZWwgCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pcnJvcihVUkxFbnRyeSBtaXJyb3IpIHsKLQkJaWYgKHRoaXMubWlycm9ycyA9PSBudWxsKQotCQkJdGhpcy5taXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIXRoaXMubWlycm9ycy5jb250YWlucyhtaXJyb3IpKQotCQkJdGhpcy5taXJyb3JzLmFkZChtaXJyb3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1NldE1pcnJvclNpdGVFbnRyeU1vZGVscyhVUkxFbnRyeVtdIG5ld01pcnJvcnMpIHsKLQkJaWYgKG5ld01pcnJvcnMgPT0gbnVsbCB8fCBuZXdNaXJyb3JzLmxlbmd0aCA9PSAwKQotCQkJdGhpcy5taXJyb3JzID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5taXJyb3JzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KG5ld01pcnJvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBsdWctaW4gYW5kIG5vbi1wbHVnLWluIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVscwotCSAqIG9uIHRoaXMgc2l0ZQotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWxzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUKLQkgKiBubyBhcmNoaXZlcyBrbm93biB0byB0aGlzIHNpdGUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBVUkxFbnRyeVtdIGdldEFyY2hpdmVzKCkgewotCQlpZiAoYXJjaGl2ZVJlZmVyZW5jZXMgPT0gbnVsbCB8fCBhcmNoaXZlUmVmZXJlbmNlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgVVJMRW50cnlbMF07Ci0KLQkJcmV0dXJuIChVUkxFbnRyeVtdKSBhcmNoaXZlUmVmZXJlbmNlcy50b0FycmF5KG5ldyBVUkxFbnRyeVswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRlZ29yeSBtb2RlbHMgZm9yIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHNpdGUgY2F0ZWdvcnkgbW9kZWxzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVDYXRlZ29yeVtdIGdldENhdGVnb3JpZXMoKSB7Ci0JCWlmIChjYXRlZ29yaWVzID09IG51bGwgfHwgY2F0ZWdvcmllcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgU2l0ZUNhdGVnb3J5WzBdOwotCQlyZXR1cm4gKFNpdGVDYXRlZ29yeVtdKSBjYXRlZ29yaWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNpdGVDYXRlZ29yeVswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0ZWdvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTaXRlQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChTaXRlQ2F0ZWdvcnkpIChjYXRlZ29yaWVzID09IG51bGwgPyBudWxsIDogY2F0ZWdvcmllcy5nZXQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpdGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBzaXRlIGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscyBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqLwotCXB1YmxpYyBTaXRlRmVhdHVyZVtdIGdldEZlYXR1cmVzKCkgewotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgU2l0ZUZlYXR1cmVbMF07Ci0JCXJldHVybiAoU2l0ZUZlYXR1cmVbXSkgZmVhdHVyZXMudG9BcnJheShuZXcgU2l0ZUZlYXR1cmVbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSTCBmb3IgdGhlIHNpdGUuCi0JICogCi0JICogQHJldHVybiB1cmwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvblVSTCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIHNpdGUuCi0JICoKLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTFN0cmluZygpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB1cGRhdGUgc2l0ZSBtaXJyb3JzCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtaXJyb3IgZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBVUkxFbnRyeVtdIGdldE1pcnJvcnMoKSB7Ci0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXk7Ci0JCWlmIChtaXJyb3JzID09IG51bGwgfHwgbWlycm9ycy5zaXplKCkgPT0gMCkKLQkJCS8vIHNlZSBpZiB3ZSBjYW4gZ2V0IG1pcnJvcnMgZnJvbSB0aGUgcHJvdmlkZWQgdXJsCi0JCQlpZiAobWlycm9yc1VSTFN0cmluZyAhPSBudWxsKQotCQkJCWRvU2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKERlZmF1bHRTaXRlUGFyc2VyLmdldE1pcnJvcnMobWlycm9yc1VSTFN0cmluZykpOwotCi0JCWlmIChtaXJyb3JzID09IG51bGwgfHwgbWlycm9ycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgVVJMRW50cnlbMF07Ci0JCXJldHVybiAoVVJMRW50cnlbXSkgbWlycm9ycy50b0FycmF5KG5ldyBVUkxFbnRyeVswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZyb20gd2hpY2ggdGhlIGxpc3Qgb2YgbWlycm9ycyBvZiB0aGlzIHNpdGUgY2FuIGJlIHJldHJpZXZlZC4KLQkgKiAKLQkgKiBAc2luY2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IgMS4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaXJyb3JzVVJMKCkgewotCQlyZXR1cm4gbWlycm9yc1VSTFN0cmluZzsKLQl9Ci0KLQkvKiogCi0JICogUmV0dXJucyB0aGUgc2l0ZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gc2l0ZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhY2syMDBTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiBzdXBwb3J0c1BhY2syMDA7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZSBVUkwKLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwKLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQotCQkvLyBBcmNoaXZlcyBhbmQgZmVhdHVyZSBhcmUgcmVsYXRpdmUgdG8gbG9jYXRpb24gVVJMCi0JCS8vIGlmIHRoZSBTaXRlIGVsZW1lbnQgaGFzIGEgVVJMIHRhZzogc2VlIHNwZWMJCi0JCS8vCQlsb2NhdGlvblVSTCA9IHJlc29sdmVVUkwoYmFzZSwgYnVuZGxlVVJMLCBnZXRMb2NhdGlvblVSTFN0cmluZygpKTsKLQkJLy8JCWlmIChsb2NhdGlvblVSTCA9PSBudWxsKQotCQkvLwkJCWxvY2F0aW9uVVJMID0gYmFzZTsKLQkJLy8JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSwgbG9jYXRpb25VUkwsIGJ1bmRsZVVSTCk7Ci0JCS8vCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCksIGxvY2F0aW9uVVJMLCBidW5kbGVVUkwpOwotCQkvLwotCQkvLwkJcmVzb2x2ZVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbk1vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCS8vCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRDYXRlZ29yeU1vZGVscygpLCBiYXNlLCBidW5kbGVVUkwpOwotCQkvLwotCQkvLwkJVVJMIHVybCA9IHJlc29sdmVVUkwoYmFzZSwgYnVuZGxlVVJMLCBtaXJyb3JzVVJMU3RyaW5nKTsKLQkJLy8JCWlmICh1cmwgIT0gbnVsbCkKLQkJLy8JCQltaXJyb3JzVVJMU3RyaW5nID0gdXJsLnRvU3RyaW5nKCk7Ci0JCS8vCi0JCS8vCQlpZiAoKHRoaXMgaW5zdGFuY2VvZiBFeHRlbmRlZFNpdGUpICYmICgoRXh0ZW5kZWRTaXRlKSB0aGlzKS5pc0RpZ2VzdEV4aXN0KCkpIHsKLQkJLy8JCQlFeHRlbmRlZFNpdGUgZXh0ZW5kZWRTaXRlID0gKEV4dGVuZGVkU2l0ZSkgdGhpczsKLQkJLy8JCQlleHRlbmRlZFNpdGUuc2V0TGl0ZUZlYXR1cmVzKFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRMaWdodEZlYXR1cmVzKGV4dGVuZGVkU2l0ZSkpOwotCQkvLwkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHNpdGUgZGVzY3JpcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oVVJMRW50cnkgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIGZvciB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb25VUkxTdHJpbmcgdXJsIGZvciB0aGUgc2l0ZSAoYXMgYSBzdHJpbmcpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJMU3RyaW5nKFN0cmluZyBsb2NhdGlvblVSTFN0cmluZykgewotCQl0aGlzLmxvY2F0aW9uVVJMU3RyaW5nID0gbG9jYXRpb25VUkxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhZGRpdGlvbmFsIG1pcnJvciBzaXRlcwotCSAqIAotCSAqIEBwYXJhbSBtaXJyb3JzIGFkZGl0aW9uYWwgdXBkYXRlIHNpdGUgbWlycm9ycwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaXJyb3JzKFVSTEVudHJ5W10gbWlycm9ycykgewotCQlkb1NldE1pcnJvclNpdGVFbnRyeU1vZGVscyhtaXJyb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtaXJyb3JzIHVybC4gTWlycm9yIHNpdGVzIHdpbGwgdGhlbiBiZSBvYnRhaW5lZCBmcm9tIHRoaXMgbWlycm9yIHVybCBsYXRlci4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjb21wbGVtZW50YXJ5IHRvIHNldE1pcnJvcnNpdGVFbnRyeU1vZGVscygpLCBhbmQgb25seSBvbmUgb2YgdGhlc2UgCi0JICogbWV0aG9kcyBzaG91bGQgYmUgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBtaXJyb3JzVVJMIGFkZGl0aW9uYWwgdXBkYXRlIHNpdGUgbWlycm9ycwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaXJyb3JzVVJMU3RyaW5nKFN0cmluZyBtaXJyb3JzVVJMKSB7Ci0JCXRoaXMubWlycm9yc1VSTFN0cmluZyA9IG1pcnJvcnNVUkw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwcG9ydHNQYWNrMjAwKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5zdXBwb3J0c1BhY2syMDAgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlIHR5cGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBzaXRlIHR5cGUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1VSTEVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9VUkxFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMyMjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1VSTEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotcHVibGljIGNsYXNzIFVSTEVudHJ5IHsKLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCXB1YmxpYyBVUkxFbnRyeSgpIHsKLQl9Ci0KLQlwdWJsaWMgVVJMRW50cnkoU3RyaW5nIHVybCwgU3RyaW5nIGFubm90YXRpb24pIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbikgewotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvVXBkYXRlU2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvVXBkYXRlU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJhYTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1VwZGF0ZVNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TRVBBUkFUT1IgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0RJUiA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9ESVIgPSAicGx1Z2lucy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfVEVNUF9GSUxFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfRklMRSA9ICJzaXRlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1NFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGNoZWNrc3VtOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uOwotCXByaXZhdGUgU2l0ZU1vZGVsIHNpdGU7Ci0KLQkvKgotCSAqIFNvbWUgdmFyaWFibGVzIGZvciBjYWNoaW5nLgotCSAqLwotCS8vIG1hcCBvZiBTdHJpbmcgKFVSTC50b0V4dGVybmFsRm9ybSgpKSB0byBVcGRhdGVTaXRlCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHNpdGVDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwIG9mIFN0cmluZyAoZmVhdHVyZUlEX2ZlYXR1cmVWZXJzaW9uKSB0byBGZWF0dXJlCi0JcHJpdmF0ZSBNYXAgZmVhdHVyZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qCi0JICogUmV0dXJuIGEgbmV3IFVSTCBmb3IgdGhlIGdpdmVuIGZpbGUgd2hpY2ggaXMgYmFzZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJvb3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0RmlsZVVSTChVUkwgcm9vdCwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJaWYgKHJvb3QuZ2V0UGF0aCgpLmVuZHNXaXRoKGZpbGVOYW1lKSkKLQkJCXJldHVybiByb290OwotCQlpZiAocm9vdC5nZXRQYXRoKCkuZW5kc1dpdGgoU0lURV9GSUxFKSkKLQkJCXJldHVybiBuZXcgVVJMKHJvb3QsIGZpbGVOYW1lKTsKLQkJaWYgKHJvb3QuZ2V0UGF0aCgpLmVuZHNXaXRoKERJUl9TRVBBUkFUT1IpKQotCQkJcmV0dXJuIG5ldyBVUkwocm9vdC50b0V4dGVybmFsRm9ybSgpICsgZmlsZU5hbWUpOwotCQlyZXR1cm4gbmV3IFVSTChyb290LnRvRXh0ZXJuYWxGb3JtKCkgKyBESVJfU0VQQVJBVE9SICsgZmlsZU5hbWUpOwotCX0KLQotCS8qCi0JICogT3BlbiBhbmQgcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBVUkwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U2l0ZUlucHV0U3RyZWFtKFVSTCB1cmwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldFNpdGVVUkwodXJsKS5vcGVuU3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuSW52YWxpZFJlcG9zaXRvcnlMb2NhdGlvbiwgdXJsKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0lOVkFMSURfTE9DQVRJT04sIG1zZywgZSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9zZWUgYnVnIDIyMTYwMCAtIFVSTC5vcGVuU3RyZWFtIGNhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5JbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uLCB1cmwpOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCB1cmwpOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBtc2csIGUpKTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgVVJMIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkwsIHdoaWNoIHBvaW50cyB0byBhIHNpdGUueG1sIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGdldFNpdGVVUkwoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCWlmICh1cmwuZ2V0UGF0aCgpLmVuZHNXaXRoKFNJVEVfRklMRSkpCi0JCQlyZXR1cm4gdXJsOwotCQlpZiAodXJsLmdldFBhdGgoKS5lbmRzV2l0aChESVJfU0VQQVJBVE9SKSkKLQkJCXJldHVybiBuZXcgVVJMKHVybC50b0V4dGVybmFsRm9ybSgpICsgU0lURV9GSUxFKTsKLQkJcmV0dXJuIG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyBESVJfU0VQQVJBVE9SICsgU0lURV9GSUxFKTsKLQl9Ci0KLQkvKgotCSAqIExvYWQgYW5kIHJldHVybiBhbiB1cGRhdGUgc2l0ZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGRhdGVTaXRlIGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlVcGRhdGVTaXRlIHJlc3VsdCA9IChVcGRhdGVTaXRlKSBzaXRlQ2FjaGUuZ2V0KGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGdldFNpdGVJbnB1dFN0cmVhbShsb2NhdGlvbik7Ci0JCXRyeSB7Ci0JCQlEZWZhdWx0U2l0ZVBhcnNlciBzaXRlUGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCQlDaGVja3N1bSBjaGVja3N1bSA9IG5ldyBDUkMzMigpOwotCQkJaW5wdXQgPSBuZXcgQ2hlY2tlZElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0KSwgY2hlY2tzdW0pOwotCQkJU2l0ZU1vZGVsIHNpdGVNb2RlbCA9IHNpdGVQYXJzZXIucGFyc2UoaW5wdXQpOwotCQkJU3RyaW5nIGNoZWNrc3VtU3RyaW5nID0gTG9uZy50b1N0cmluZyhjaGVja3N1bS5nZXRWYWx1ZSgpKTsKLQkJCXJlc3VsdCA9IG5ldyBVcGRhdGVTaXRlKHNpdGVNb2RlbCwgbG9jYXRpb24sIGNoZWNrc3VtU3RyaW5nKTsKLQkJCXNpdGVDYWNoZS5wdXQobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSwgcmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nU2l0ZSwgbG9jYXRpb24pOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQsIG1zZywgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nU2l0ZSwgbG9jYXRpb24pOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQsIG1zZywgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBQYXJzZSB0aGUgZmVhdHVyZS54bWwgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiB0aGUgZmVhdHVyZSBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZSBwYXJzZUZlYXR1cmUoRmVhdHVyZVBhcnNlciBmZWF0dXJlUGFyc2VyLCBVUkwgZmVhdHVyZVVSTCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgZmVhdHVyZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKEZFQVRVUkVfVEVNUF9GSUxFLCBKQVJfRVhURU5TSU9OKTsKLQkJdHJ5IHsKLQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKGZlYXR1cmVVUkwub3BlblN0cmVhbSgpLCB0cnVlLCBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmVhdHVyZUZpbGUpKSwgdHJ1ZSk7Ci0JCQlyZXR1cm4gZmVhdHVyZVBhcnNlci5wYXJzZShmZWF0dXJlRmlsZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3NlZSBidWcgMjIxNjAwIC0gVVJMLm9wZW5TdHJlYW0gY2FuIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkludmFsaWRSZXBvc2l0b3J5TG9jYXRpb24sIGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9JTlZBTElEX0xPQ0FUSU9OLCBtc2csIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZlYXR1cmVGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNpdGUgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gVVJMIGlzIG5vdCB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBnZXRTaXRlSW5wdXRTdHJlYW0odXJsKTsKLQkJdHJ5IHsKLQkJCWlucHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXByaXZhdGUgVXBkYXRlU2l0ZShTaXRlTW9kZWwgc2l0ZSwgVVJMIGxvY2F0aW9uLCBTdHJpbmcgY2hlY2tzdW0pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLmNoZWNrc3VtID0gY2hlY2tzdW07Ci0JfQotCi0JLyoKLQkgKiBJdGVyYXRlIG92ZXIgdGhlIGFyY2hpdmUgZW50cmllcyBpbiB0aGlzIHNpdGUgYW5kIHJldHVybiB0aGUgbWF0Y2hpbmcgVVJMIHN0cmluZyBmb3IKLQkgKiB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgaWYgdGhlcmUgaXMgb25lLgotCSAqLwotCXByaXZhdGUgVVJMIGdldEFyY2hpdmVVUkwoVVJMIGJhc2UsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCVVSTEVudHJ5W10gYXJjaGl2ZXMgPSBzaXRlLmdldEFyY2hpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBhcmNoaXZlcyAhPSBudWxsICYmIGkgPCBhcmNoaXZlcy5sZW5ndGg7IGkrKykgewotCQkJVVJMRW50cnkgZW50cnkgPSBhcmNoaXZlc1tpXTsKLQkJCWlmIChpZGVudGlmaWVyLmVxdWFscyhlbnRyeS5nZXRBbm5vdGF0aW9uKCkpKQotCQkJCXJldHVybiBpbnRlcm5hbEdldFVSTChiYXNlLCBlbnRyeS5nZXRVUkwoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGNoZWNrc3VtIGZvciB0aGlzIHNpdGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGVja3N1bSgpIHsKLQkJcmV0dXJuIGNoZWNrc3VtOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgVVJMIHdoaWNoIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZVVSTChTaXRlRmVhdHVyZSBzaXRlRmVhdHVyZSwgU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQlVUkwgYmFzZSA9IHNpdGUuZ2V0TG9jYXRpb25VUkwoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCWJhc2UgPSBsb2NhdGlvbjsKLQkJaWYgKHNpdGVGZWF0dXJlID09IG51bGwpIHsKLQkJCVNpdGVGZWF0dXJlW10gZW50cmllcyA9IHNpdGUuZ2V0RmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpZC5lcXVhbHMoZW50cmllc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKSAmJiB2ZXJzaW9uLmVxdWFscyhlbnRyaWVzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkpKSB7Ci0JCQkJCXNpdGVGZWF0dXJlID0gZW50cmllc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzaXRlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gc2l0ZUZlYXR1cmUuZ2V0VVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpCi0JCQkJcmV0dXJuIHVybDsKLQkJCXVybCA9IGdldEFyY2hpdmVVUkwoYmFzZSwgaWQpOwotCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJLy8gZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgVVJMCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmlsZVVSTChiYXNlLCBGRUFUVVJFX0RJUiArIGlkICsgVkVSU0lPTl9TRVBBUkFUT1IgKyB2ZXJzaW9uICsgSkFSX0VYVEVOU0lPTik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBVUkwgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRQbHVnaW5VUkwoRmVhdHVyZUVudHJ5IHBsdWdpbikgewotCQlVUkwgYmFzZSA9IHNpdGUuZ2V0TG9jYXRpb25VUkwoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCWJhc2UgPSBsb2NhdGlvbjsKLQkJU3RyaW5nIHBhdGggPSBQTFVHSU5fRElSICsgcGx1Z2luLmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHBsdWdpbi5nZXRWZXJzaW9uKCkgKyBKQVJfRVhURU5TSU9OOwotCQlVUkwgdXJsID0gZ2V0QXJjaGl2ZVVSTChiYXNlLCBwYXRoKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJcmV0dXJuIHVybDsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWxlVVJMKGJhc2UsIHBhdGgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBzaXRlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTaXRlTW9kZWwgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoKLQkgKiBUaGUgdHJhaWxpbmcgcGFyYW1ldGVyIGNhbiBiZSBlaXRoZXIgbnVsbCwgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIGl0IGlzIG51bGwsCi0JICogdGhlbiByZXR1cm4gbnVsbC4gSWYgaXQgaXMgYWJzb2x1dGUsIHRoZW4gY3JlYXRlIGEgbmV3IHVybCBhbmQgcmV0dXJuIGl0LiBJZiBpdCBpcwotCSAqIHJlbGF0aXZlLCB0aGVuIG1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGJhc2UgdXJsLgotCSAqLwotCXByaXZhdGUgVVJMIGludGVybmFsR2V0VVJMKFVSTCBiYXNlLCBTdHJpbmcgdHJhaWxpbmcpIHsKLQkJaWYgKHRyYWlsaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKHRyYWlsaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoYmFzZSwgdHJhaWxpbmcpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUyKSB7Ci0JCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTG9hZCBhbmQgcmV0dXJuIHRoZSBmZWF0dXJlcyByZWZlcmVuY2VzIGluIHRoaXMgdXBkYXRlIHNpdGUuCi0JICovCi0JcHVibGljIEZlYXR1cmVbXSBsb2FkRmVhdHVyZXMoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJRmVhdHVyZVtdIHJlc3VsdCA9IGxvYWRGZWF0dXJlc0Zyb21EaWdlc3QoKTsKLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gbG9hZEZlYXR1cmVzRnJvbVNpdGUoKSA6IHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFRyeSBhbmQgbG9hZCB0aGUgZmVhdHVyZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1cGRhdGUgc2l0ZSdzCi0JICogZGlnZXN0IGZpbGUsIGlmIGl0IGV4aXN0cy4KLQkgKi8KLQlwcml2YXRlIEZlYXR1cmVbXSBsb2FkRmVhdHVyZXNGcm9tRGlnZXN0KCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmICghZmVhdHVyZUNhY2hlLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoRmVhdHVyZVtdKSBmZWF0dXJlQ2FjaGUudmFsdWVzKCkudG9BcnJheShuZXcgRmVhdHVyZVtmZWF0dXJlQ2FjaGUuc2l6ZSgpXSk7Ci0JCXRyeSB7Ci0JCQlVUkwgZGlnZXN0VVJMID0gZ2V0RmlsZVVSTChsb2NhdGlvbiwgImRpZ2VzdC56aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBkaWdlc3RGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlnZXN0IiwgIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0cnkgewotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKGRpZ2VzdFVSTC5vcGVuU3RyZWFtKCksIHRydWUsIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkaWdlc3RGaWxlKSksIHRydWUpOwotCQkJCUZlYXR1cmVbXSByZXN1bHQgPSBuZXcgRGlnZXN0UGFyc2VyKCkucGFyc2UoZGlnZXN0RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcga2V5ID0gcmVzdWx0W2ldLmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHJlc3VsdFtpXS5nZXRWZXJzaW9uKCk7Ci0JCQkJCWZlYXR1cmVDYWNoZS5wdXQoa2V5LCByZXN1bHRbaV0pOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NlZSBidWcgMjIxNjAwIC0gVVJMLm9wZW5TdHJlYW0gY2FuIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5JbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uLCBkaWdlc3RVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiwgbXNnLCBlKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRpZ2VzdEZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdEaWdlc3QsIGxvY2F0aW9uKSwgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdEaWdlc3QsIGxvY2F0aW9uKSwgZSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTG9hZCBhbmQgcmV0dXJuIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgdXBkYXRlIHNpdGUuIE5vdGUgdGhpcwotCSAqIHJlcXVpcmVzIGRvd25sb2FkaW5nIGFuZCBwYXJzaW5nIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGxvY2FsbHkuCi0JICovCi0JcHJpdmF0ZSBGZWF0dXJlW10gbG9hZEZlYXR1cmVzRnJvbVNpdGUoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJU2l0ZUZlYXR1cmVbXSBzaXRlRmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVzKCk7Ci0JCUZlYXR1cmVQYXJzZXIgZmVhdHVyZVBhcnNlciA9IG5ldyBGZWF0dXJlUGFyc2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTaXRlRmVhdHVyZSBzaXRlRmVhdHVyZSA9IHNpdGVGZWF0dXJlc1tpXTsKLQkJCVN0cmluZyBrZXkgPSBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpICsgVkVSU0lPTl9TRVBBUkFUT1IgKyBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOwotCQkJaWYgKGZlYXR1cmVDYWNoZS5jb250YWluc0tleShrZXkpKQotCQkJCWNvbnRpbnVlOwotCQkJVVJMIGZlYXR1cmVVUkwgPSBnZXRGZWF0dXJlVVJMKHNpdGVGZWF0dXJlLCBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKTsKLQkJCXRyeSB7Ci0JCQkJRmVhdHVyZSBmZWF0dXJlID0gcGFyc2VGZWF0dXJlKGZlYXR1cmVQYXJzZXIsIGZlYXR1cmVVUkwpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nRmVhdHVyZSwgZmVhdHVyZVVSTCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmZWF0dXJlQ2FjaGUucHV0KGtleSwgZmVhdHVyZSk7Ci0JCQkJCWxvYWRJbmNsdWRlZEZlYXR1cmVzKGZlYXR1cmUsIGZlYXR1cmVQYXJzZXIpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBmZWF0dXJlVVJMKSwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoRmVhdHVyZVtdKSBmZWF0dXJlQ2FjaGUudmFsdWVzKCkudG9BcnJheShuZXcgRmVhdHVyZVtmZWF0dXJlQ2FjaGUuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSB0aGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZEluY2x1ZGVkRmVhdHVyZXMoRmVhdHVyZSBmZWF0dXJlLCBGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXIpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlGZWF0dXJlRW50cnlbXSBmZWF0dXJlRW50cmllcyA9IGZlYXR1cmUuZ2V0RW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlRW50cnkgZW50cnkgPSBmZWF0dXJlRW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5pc1JlcXVpcmVzKCkgfHwgZW50cnkuaXNQbHVnaW4oKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRJZCgpICsgVkVSU0lPTl9TRVBBUkFUT1IgKyBlbnRyeS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAoZmVhdHVyZUNhY2hlLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlVUkwgZmVhdHVyZVVSTCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZlYXR1cmVVUkwgPSBnZXRGaWxlVVJMKGxvY2F0aW9uLCBGRUFUVVJFX0RJUiArIGVudHJ5LmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIGVudHJ5LmdldFZlcnNpb24oKSArIEpBUl9FWFRFTlNJT04pOwotCQkJCUZlYXR1cmUgaW5jbHVkZWRGZWF0dXJlID0gcGFyc2VGZWF0dXJlKGZlYXR1cmVQYXJzZXIsIGZlYXR1cmVVUkwpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nRmVhdHVyZSwgZmVhdHVyZVVSTCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmZWF0dXJlQ2FjaGUucHV0KGtleSwgaW5jbHVkZWRGZWF0dXJlKTsKLQkJCQkJbG9hZEluY2x1ZGVkRmVhdHVyZXMoaW5jbHVkZWRGZWF0dXJlLCBmZWF0dXJlUGFyc2VyKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0ZlYXR1cmUsIGVudHJ5LmdldElkKCkpLCBlKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nRmVhdHVyZSwgZmVhdHVyZVVSTCksIGUpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRlZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEluc3RhbGwgVXBkYXRlIENvcmUgUHJvcGVydGllcyBGaWxlCi0jCi0KLURlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHRoZSB2ZXJzaW9uIGlzIG51bGwgb3IgZW1wdHkgZm9yIHRoZSBTdGF0ZTogXCJ7Mn1cIjogdW5pcXVlIGlkZW50aWZpZXI9XCJ7MH1cIiB2ZXJzaW9uPVwiezF9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9Ob1NpdGVUYWc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVuYWJsZSB0byBmaW5kIHJvb3QgZWxlbWVudCBcInNpdGVcIiBpbiB0aGUgc3RyZWFtLgotRGVmYXVsdFNpdGVQYXJzZXJfV3JvbmdQYXJzaW5nU3RhY2s9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVuZXhwZWN0ZWQgUGFyc2luZyBTdGFjazogXCJ7MH1cIgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQ9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gZWxlbWVudCBcInswfVwiIGluIHBhcnNpbmcgc3RhdGUgXCJ7MX1cIi4gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBYTUwgZmlsZS4KLURlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIHN0YXJ0IHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9NaXNzaW5nPSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBUaGUgXCJ7MH1cIiB0YWcgb2YgdGhlIGVsZW1lbnQgXCJ7MX1cIiBpcyBudWxsIG9yIGVtcHR5LiBWYWx1ZSBpcyByZXF1aXJlZC4KLURlZmF1bHRTaXRlUGFyc2VyX1BhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZT0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gUGFyc2luZyBzdGFjayBiYWNrIHRvIEluaXRpYWwgU3RhdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudDogXCJ7MH1cIiBhbHJlYWR5IHNldCBmb3IgdGhlIFNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9DYXRlZ29yeUFscmVhZHlTZXQ9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVsZW1lbnQ6IFwiezB9XCI6IFwiezF9XCIgYWxyZWFkeSBzZXQgZm9yIHRoZSBTaXRlLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVuZFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIGVuZCBzdGF0ZSBcInswfVwiLgotRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFcnJvcjogXCJ7MH1cIgotRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudCBcInswfVwiIGxpbmU6IFwiezF9XCIgY29sdW1uOlwiezJ9XCIuIEVycm9yOiBcInszfVwiLgotRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4KLURlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGF0ZT0gVW5rbm93biBTdGF0ZSBcInswfVwiLgotRGVmYXVsdFNpdGVQYXJzZXJfSW52YWxpZFhNTFN0cmVhbT0gVGhlIFhNTCBzdHJlYW0gaXMgbm90IGEgdmFsaWQgZGVmYXVsdCBcInNpdGUueG1sXCIgZmlsZS4gVGhlIHJvb3QgdGFnIGlzIG5vdCBzaXRlLgotRGVmYXVsdFNpdGVQYXJzZXJfbWlycm9ycyA9IEVycm9yIHByb2Nlc3NpbmcgdXBkYXRlIHNpdGUgbWlycm9yLgotCi1FcnJvclJlYWRpbmdEaWdlc3Q9RXJyb3IgcmVhZGluZyBzaXRlIGRpZ2VzdCB7MH0uCi1FcnJvclJlYWRpbmdGZWF0dXJlPUVycm9yIHJlYWRpbmcgZmVhdHVyZSB7MH0uCi1FcnJvclJlYWRpbmdTaXRlPUVycm9yIHJlYWRpbmcgdXBkYXRlIHNpdGUgezB9LgotSW52YWxpZFJlcG9zaXRvcnlMb2NhdGlvbj1JbnZhbGlkIHJlcG9zaXRvcnkgbG9jYXRpb24gezB9LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YWZmY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1leGNlcHRpb25fZXJyb3JDb252ZXJ0aW5nID0gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyBtYW5pZmVzdCBmb3IgezB9LgotZXhjZXB0aW9uX291dHB1dFN0cmVhbSA9IFVuYWJsZSB0byBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIHswfS4KLWV4Y2VwdGlvbl9lcnJvclBhcnNpbmdVcGRhdGVTaXRlID0gRXJyb3IgcGFyc2luZyB1cGRhdGUgc2l0ZTogezB9LgotZXhjZXB0aW9uX3N0YXRlQWRkaXRpb24gPSBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgYWRkaW5nIHRoZSBidW5kbGUgezB9LgotZXhjZXB0aW9uX3NvdXJjZURpcmVjdG9yeUludmFsaWQgPSBTb3VyY2UgZGlyZWN0b3J5IGlzIGludmFsaWQ6IHswfS4KLWV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Mb2NhdGlvblVSTCA9IEFydGlmYWN0IHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgbm90IGEgdmFsaWQgVVJMOiB7MH0uCi1leGNlcHRpb25fYXJ0aWZhY3RSZXBvTm90V3JpdGFibGUgPSBBcnRpZmFjdCByZXBvc2l0b3J5IGlzIG5vdCB3cml0YWJsZTogezB9LgotZXhjZXB0aW9uX21ldGFkYXRhUmVwb0xvY2F0aW9uVVJMID0gTWV0YWRhdGEgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3QgYSB2YWxpZCBVUkw6IHswfS4KLWV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Ob3RXcml0YWJsZSA9IE1ldGFkYXRhIHJlcG9zaXRvcnkgbm90IHdyaXRhYmxlOiB7MH0uCi1leGNlcHRpb25fYmFzZUxvY2F0aW9uTm90U3BlY2lmaWVkID0gRWNsaXBzZSBiYXNlIGxvY2F0aW9uIG5vdCBzcGVjaWZpZWQuCi0KLW1lc3NhZ2VfZ2VuZXJhdGluZ01ldGFkYXRhID0gR2VuZXJhdGluZyBtZXRhZGF0YSBmb3IgezB9LgotbWVzc2FnZV9nZW5lcmF0aW9uQ29tcGxldGVkID0gR2VuZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBzdWNjZXNzIFt7MH0gc2Vjb25kc10uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9wdWJsaXNoZXIvcHJvZHVjdC9CcmFuZGluZ0lyb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvcHVibGlzaGVyL3Byb2R1Y3QvQnJhbmRpbmdJcm9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDg3NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9wdWJsaXNoZXIvcHJvZHVjdC9CcmFuZGluZ0lyb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUNvZGUgOSAtIEFkZGl0aW9uYWwgZnVuY3Rpb24gYW5kIGZpeGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci5wcm9kdWN0OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5zd3QudG9vbHMuSWNvbkV4ZTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQnJhbmRpbmdJcm9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX05BTUUgPSAiJUVYRUNVVEFCTEVfTkFNRSUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIiVCVU5ETEVfTkFNRSUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTkFNRSA9ICIlSUNPTl9OQU1FJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0tFWSA9ICI8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0tFWSA9ICI8a2V5PkNGQnVuZGxlTmFtZTwva2V5PiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9LRVkgPSAiPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfU1RBUlQgPSAiPHN0cmluZz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19FTkQgPSAiPC9zdHJpbmc+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYRE9DX0lDT04gPSAiLVhkb2NrOmljb249Li4vUmVzb3VyY2VzL0VjbGlwc2UuaWNucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nW10gaWNvbnMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHJvb3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBvcyA9ICJ3aW4zMiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gYnJhbmRJY29ucyA9IHRydWU7Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQluYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWNvbnMoU3RyaW5nW10gdmFsdWUpIHsKLQkJaWNvbnMgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJY29ucyhTdHJpbmcgdmFsdWUpIHsKLQkJaWNvbnMgPSB2YWx1ZS5zcGxpdCgiLFxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWNvbnNbMF0uc3RhcnRzV2l0aCgiJHsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaWNvbnMubGVuZ3RoID4gMSkgewotCQkJCVN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbnMsIDEsIHRlbXAsIDAsIHRlbXAubGVuZ3RoKTsKLQkJCQlpY29ucyA9IHRlbXA7Ci0JCQl9IGVsc2UgewotCQkJCWljb25zID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3QoU3RyaW5nIHZhbHVlKSB7Ci0JCXJvb3QgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBicmFuZCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBpZiB0aGUgbmFtZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IGl0IHdpbGwgYmUgJHtsYXVuY2hlci5uYW1lfSBzbyBqdXN0IGJhaWwuCi0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiR7IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQlpZiAoaWNvbnMgPT0gbnVsbCB8fCBpY29uc1swXS5zdGFydHNXaXRoKCIkeyIpKSAvLyROT04tTkxTLTEkCi0JCQlicmFuZEljb25zID0gZmFsc2U7Ci0KLQkJLy8gaWYgdGhlIHJvb3QgZG9lcyBub3QgZXhpc3RzIChoYXBwZW5zIGluIHNvbWUgcGFja2FnaW5nIGNhc2VzKSBvciAKLQkJLy8gdGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgd2l0aCB0YXJnZXQgbmFtZSBhbmQgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgaXRzIGljb25zLCBkb24ndCBkbyBhbnl0aGluZwotCQlTdHJpbmcgdGVzdE5hbWUgPSBvcy5lcXVhbHMoIndpbjMyIikgPyBuYW1lICsgIi5leGUiIDogbmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmICghbmV3IEZpbGUocm9vdCkuZXhpc3RzKCkgfHwgKCFicmFuZEljb25zICYmIG5ldyBGaWxlKHJvb3QsIHRlc3ROYW1lKS5leGlzdHMoKSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCJ3aW4zMiIuZXF1YWxzKG9zKSkgLy8kTk9OLU5MUy0xJAotCQkJYnJhbmRXaW5kb3dzKCk7Ci0JCWlmICgibGludXgiLmVxdWFscyhvcykpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kTGludXgoKTsKLQkJaWYgKCJzb2xhcmlzIi5lcXVhbHMob3MpKSAvLyROT04tTkxTLTEkCi0JCQlicmFuZFNvbGFyaXMoKTsKLQkJaWYgKCJtYWNvc3giLmVxdWFscyhvcykpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kTWFjKCk7Ci0JCWlmICgiYWl4Ii5lcXVhbHMob3MpKSAvLyROT04tTkxTLTEkCi0JCQlicmFuZEFJWCgpOwotCQlpZiAoImhwdXgiLmVxdWFscyhvcykpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kSFBVWCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBicmFuZEFJWCgpIHsKLQkJcmVuYW1lTGF1bmNoZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnJhbmRIUFVYKCkgewotCQlyZW5hbWVMYXVuY2hlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBicmFuZExpbnV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlbmFtZUxhdW5jaGVyKCk7Ci0JCWlmIChicmFuZEljb25zKQotCQkJY29weShuZXcgRmlsZShpY29uc1swXSksIG5ldyBGaWxlKHJvb3QsICJpY29uLnhwbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBicmFuZFNvbGFyaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVuYW1lTGF1bmNoZXIoKTsKLQkJaWYgKGJyYW5kSWNvbnMgPT0gZmFsc2UpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGljb24gPSBpY29uc1tpXTsKLQkJCWlmIChpY29uLmVuZHNXaXRoKCIubC5wbSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29weShuZXcgRmlsZShpY29uKSwgbmV3IEZpbGUocm9vdCwgbmFtZSArICIubC5wbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGljb24uZW5kc1dpdGgoIi5tLnBtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb3B5KG5ldyBGaWxlKGljb24pLCBuZXcgRmlsZShyb290LCBuYW1lICsgIi5tLnBtIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaWNvbi5lbmRzV2l0aCgiLnMucG0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvcHkobmV3IEZpbGUoaWNvbiksIG5ldyBGaWxlKHJvb3QsIG5hbWUgKyAiLnMucG0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpY29uLmVuZHNXaXRoKCIudC5wbSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29weShuZXcgRmlsZShpY29uKSwgbmV3IEZpbGUocm9vdCwgbmFtZSArICIudC5wbSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJyYW5kTWFjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vSW5pdGlhbGx5IHRoZSBmaWxlcyBhcmUgaW46IDxyb290Pi9FY2xpcHNlLmFwcC8gCi0JCS8vYW5kIHRoZXkgbXVzdCBhcHBlYXIgaW4gPHJvb3Q+L015QXBwTmFtZS5hcHAvCi0JCS8vQmVjYXVzZSBqYXZhIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlbmFtZSBvZiBhIGZvbGRlciwgZmlsZXMgYXJlIGNvcGllZC4KLQotCQkvL0luaXRpYWxpemUgdGhlIHRhcmdldCBmb2xkZXJzCi0JCVN0cmluZyB0YXJnZXQgPSByb290ICsgJy8nICsgbmFtZSArICIuYXBwL0NvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCQluZXcgRmlsZSh0YXJnZXQpLm1rZGlycygpOwotCQluZXcgRmlsZSh0YXJnZXQgKyAiL01hY09TIikubWtkaXJzKCk7IC8vJE5PTi1OTFMtMSQKLQkJbmV3IEZpbGUodGFyZ2V0ICsgIi9SZXNvdXJjZXMiKS5ta2RpcnMoKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBpbml0aWFsUm9vdCA9IHJvb3QgKyAiL0xhdW5jaGVyLmFwcC9Db250ZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFuZXcgRmlsZShpbml0aWFsUm9vdCkuZXhpc3RzKCkpCi0JCQlpbml0aWFsUm9vdCA9IHJvb3QgKyAiL0VjbGlwc2UuYXBwL0NvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCQljb3B5TWFjTGF1bmNoZXIoaW5pdGlhbFJvb3QsIHRhcmdldCk7Ci0JCVN0cmluZyBpY29uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgc3BsYXNoQXBwID0gbmV3IEZpbGUoaW5pdGlhbFJvb3QsICJSZXNvdXJjZXMvU3BsYXNoLmFwcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChicmFuZEljb25zKSB7Ci0JCQlGaWxlIGljb24gPSBuZXcgRmlsZShpY29uc1swXSk7Ci0JCQlpY29uTmFtZSA9IGljb24uZ2V0TmFtZSgpOwotCQkJY29weShpY29uLCBuZXcgRmlsZSh0YXJnZXQgKyAiL1Jlc291cmNlcy8iICsgaWNvbi5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJbmV3IEZpbGUoaW5pdGlhbFJvb3QgKyAiL1Jlc291cmNlcy9FY2xpcHNlLmljbnMiKS5kZWxldGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFzcGxhc2hBcHAuZXhpc3RzKCkpCi0JCQkJbmV3IEZpbGUoaW5pdGlhbFJvb3QgKyAiL1Jlc291cmNlcy8iKS5kZWxldGUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNvcHlNYWNJbmkoaW5pdGlhbFJvb3QsIHRhcmdldCwgaWNvbk5hbWUpOwotCQltb2RpZnlJbmZvUExpc3RGaWxlKGluaXRpYWxSb290LCB0YXJnZXQsIGljb25OYW1lKTsKLQkJaWYgKHNwbGFzaEFwcC5leGlzdHMoKSkgewotCQkJYnJhbmRNYWNTcGxhc2goaW5pdGlhbFJvb3QsIHRhcmdldCwgaWNvbk5hbWUpOwotCQl9Ci0KLQkJRmlsZSByb290Rm9sZGVyID0gbmV3IEZpbGUoaW5pdGlhbFJvb3QpOwotCQlyb290Rm9sZGVyLmRlbGV0ZSgpOwotCQlpZiAocm9vdEZvbGRlci5leGlzdHMoKSkgewotCQkJLy9pZiB0aGUgcm9vdEZvbGRlciBzdGlsbCBleGlzdHMsIGl0cyBiZWNhdXNlIHRoZXJlIHdlcmUgb3RoZXIgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIG1vdmVkIG92ZXIKLQkJCW1vdmVDb250ZW50cyhyb290Rm9sZGVyLCBuZXcgRmlsZSh0YXJnZXQpKTsKLQkJfQotCQlyb290Rm9sZGVyLmdldFBhcmVudEZpbGUoKS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBCcmFuZCB0aGUgc3BsYXNoLmFwcCBJbmZvLnBsaXN0IGFuZCAgbGluayBvciBjb3B5IHRoZSBtYWMgbGF1bmNoZXIuCi0JICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtYWMgbGF1bmNoZXIgaGFzIGJlZW4gYnJhbmRlZCBhbHJlYWR5LgotCSAqIEBwYXJhbSBpbml0aWFsUm9vdAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gaWNvbk5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnJhbmRNYWNTcGxhc2goU3RyaW5nIGluaXRpYWxSb290LCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJU3RyaW5nIHNwbGFzaENvbnRlbnRzID0gIi9SZXNvdXJjZXMvU3BsYXNoLmFwcC9Db250ZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkJbW9kaWZ5SW5mb1BMaXN0RmlsZShpbml0aWFsUm9vdCArIHNwbGFzaENvbnRlbnRzLCB0YXJnZXQgKyBzcGxhc2hDb250ZW50cywgaWNvbk5hbWUpOwotCi0JCS8vbGluayB0aGUgTWFjT1MgbGF1bmNoZXIgZm9yIHRoZSBzcGxhc2ggYXBwCi0JCWludCByZXN1bHQgPSAtMTsKLQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvc05hbWUgIT0gbnVsbCAmJiAhb3NOYW1lLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCVN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10geyJsbiIsICItc2YiLCAiLi4vLi4vLi4vTWFjT1MvIiArIG5hbWUsICJNYWNPUy8iICsgbmFtZX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCi0JCQkJRmlsZSBsaW5rRGlyID0gbmV3IEZpbGUodGFyZ2V0LCBzcGxhc2hDb250ZW50cyk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kLCBudWxsLCBsaW5rRGlyKTsKLQkJCQlyZXN1bHQgPSBwcm9jLndhaXRGb3IoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJLy9sbiBmYWlsZWQsIG9yIHdlIGFyZSBvbiB3aW5kb3dzLCBqdXN0IGNvcHkgdGhlIGV4ZWN1dGFibGUgaW5zdGVhZAotCQkJRmlsZSBtYWNPU0RpciA9IG5ldyBGaWxlKHRhcmdldCwgIk1hY09TIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgc3BsYXNoTWFjT1NEaXIgPSBuZXcgRmlsZSh0YXJnZXQsIHNwbGFzaENvbnRlbnRzICsgIi9NYWNPUyIpOyAvLyROT04tTkxTLTEkCi0JCQlzcGxhc2hNYWNPU0Rpci5ta2RpcnMoKTsKLQkJCXRyeSB7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoc3BsYXNoTWFjT1NEaXIsIG5hbWUpOwotCQkJCWNvcHkobmV3IEZpbGUobWFjT1NEaXIsIG5hbWUpLCB0YXJnZXRGaWxlKTsKLQkJCQl0cnkgewotCQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7ImNobW9kIiwgIjc1NSIsIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY29weSBtYWNvc3ggc3BsYXNoIGxhdW5jaGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlQ29udGVudHMoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCWlmICghc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlpZiAoc291cmNlLmdldENhbm9uaWNhbEZpbGUoKS5lcXVhbHModGFyZ2V0LmdldENhbm9uaWNhbEZpbGUoKSkpCi0JCQkJcmV0dXJuOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjb3B5IG1hY29zeCByZXNvdXJjZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXRhcmdldC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCWlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgewotCQkJdGFyZ2V0Lm1rZGlycygpOwotCQkJRmlsZVtdIGNvbnRlbnRzID0gc291cmNlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgZGVzdCA9IG5ldyBGaWxlKHRhcmdldCwgY29udGVudHNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlpZiAoY29udGVudHNbaV0uaXNGaWxlKCkpCi0JCQkJCWNvbnRlbnRzW2ldLnJlbmFtZVRvKGRlc3QpOwotCQkJCWVsc2UKLQkJCQkJbW92ZUNvbnRlbnRzKGNvbnRlbnRzW2ldLCBkZXN0KTsKLQkJCX0KLQkJCXNvdXJjZS5kZWxldGUoKTsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZS5yZW5hbWVUbyh0YXJnZXQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJyYW5kV2luZG93cygpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHRlbXBsYXRlTGF1bmNoZXIgPSBuZXcgRmlsZShyb290LCAibGF1bmNoZXIuZXhlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF0ZW1wbGF0ZUxhdW5jaGVyLmV4aXN0cygpKQotCQkJdGVtcGxhdGVMYXVuY2hlciA9IG5ldyBGaWxlKHJvb3QsICJlY2xpcHNlLmV4ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChicmFuZEljb25zKSB7Ci0JCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tpY29ucy5sZW5ndGggKyAxXTsKLQkJCWFyZ3NbMF0gPSB0ZW1wbGF0ZUxhdW5jaGVyLmdldEFic29sdXRlUGF0aCgpOwotCQkJU3lzdGVtLmFycmF5Y29weShpY29ucywgMCwgYXJncywgMSwgaWNvbnMubGVuZ3RoKTsKLQkJCUljb25FeGUubWFpbihhcmdzKTsKLQkJfQotCQl0ZW1wbGF0ZUxhdW5jaGVyLnJlbmFtZVRvKG5ldyBGaWxlKHJvb3QsIG5hbWUgKyAiLmV4ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVMYXVuY2hlcigpIHsKLQkJaWYgKCFuZXcgRmlsZShyb290LCAibGF1bmNoZXIiKS5yZW5hbWVUbyhuZXcgRmlsZShyb290LCBuYW1lKSkpIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBGaWxlKHJvb3QsICJlY2xpcHNlIikucmVuYW1lVG8obmV3IEZpbGUocm9vdCwgbmFtZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlNYWNMYXVuY2hlcihTdHJpbmcgaW5pdGlhbFJvb3QsIFN0cmluZyB0YXJnZXQpIHsKLQkJU3RyaW5nIHRhcmdldExhdW5jaGVyID0gdGFyZ2V0ICsgIi9NYWNPUy8iOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbGF1bmNoZXIgPSBuZXcgRmlsZShpbml0aWFsUm9vdCArICIvTWFjT1MvbGF1bmNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGVjbGlwc2VMYXVuY2hlciA9IG5ldyBGaWxlKGluaXRpYWxSb290ICsgIi9NYWNPUy9lY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFsYXVuY2hlci5leGlzdHMoKSkgewotCQkJbGF1bmNoZXIgPSBlY2xpcHNlTGF1bmNoZXI7Ci0JCX0gZWxzZSBpZiAoZWNsaXBzZUxhdW5jaGVyLmV4aXN0cygpKSB7Ci0JCQkvL3dlIG1heSBhY3R1YWxseSBoYXZlIGJvdGggaWYgZXhwb3J0aW5nIGZyb20gdGhlIG1hYwotCQkJZWNsaXBzZUxhdW5jaGVyLmRlbGV0ZSgpOwotCQl9Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExhdW5jaGVyLCBuYW1lKTsKLQkJdHJ5IHsKLQkJCWlmICh0YXJnZXRGaWxlLmdldENhbm9uaWNhbEZpbGUoKS5lcXVhbHMobGF1bmNoZXIuZ2V0Q2Fub25pY2FsRmlsZSgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vRm9yY2UgdGhlIGV4ZWN1dGFibGUgYml0IG9uIHRoZSBleGUgYmVjYXVzZSBpdCBoYXMgYmVlbiBsb3N0IHdoZW4gY29weWluZyB0aGUgZmlsZQotCQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7ImNobW9kIiwgIjc1NSIsIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljb3B5KGxhdW5jaGVyLCB0YXJnZXRGaWxlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY29weSBtYWNvc3ggbGF1bmNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQkvL0ZvcmNlIHRoZSBleGVjdXRhYmxlIGJpdCBvbiB0aGUgZXhlIGJlY2F1c2UgaXQgaGFzIGJlZW4gbG9zdCB3aGVuIGNvcHlpbmcgdGhlIGZpbGUKLQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsiY2htb2QiLCAiNzU1IiwgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUKLQkJfQotCQlsYXVuY2hlci5kZWxldGUoKTsKLQkJbGF1bmNoZXIuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5TWFjSW5pKFN0cmluZyBpbml0aWFsUm9vdCwgU3RyaW5nIHRhcmdldCwgU3RyaW5nIGljb25OYW1lKSB7Ci0JCUZpbGUgYnJhbmRlZEluaSA9IG5ldyBGaWxlKGluaXRpYWxSb290LCAiL01hY09TLyIgKyBuYW1lICsgIi5pbmkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJRmlsZSBpbmkgPSBuZXcgRmlsZShpbml0aWFsUm9vdCwgIi9NYWNPUy9lY2xpcHNlLmluaSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghaW5pLmV4aXN0cygpICYmICFicmFuZGVkSW5pLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCWlmIChicmFuZGVkSW5pLmV4aXN0cygpICYmIGluaS5leGlzdHMoKSkgewotCQkJLy90YWtlIHRoZSBvbmUgdGhhdCBpcyBhbHJlYWR5IGJyYW5kZWQKLQkJCWluaS5kZWxldGUoKTsKLQkJCWluaSA9IGJyYW5kZWRJbmk7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyOwotCQl0cnkgewotCQkJYnVmZmVyID0gcmVhZEZpbGUoaW5pKTsKLQkJCWluaS5kZWxldGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBvc3NpYmxlIHRvIGJyYW5kIGluaSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpY29uTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWludCB4ZG9jID0gc2NhbihidWZmZXIsIDAsIFhET0NfSUNPTik7Ci0JCQlpZiAoeGRvYyAhPSAtMSkgewotCQkJCVN0cmluZyBpY25zID0gWERPQ19JQ09OLnJlcGxhY2VGaXJzdCgiRWNsaXBzZS5pY25zIiwgaWNvbk5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLnJlcGxhY2UoeGRvYywgeGRvYyArIFhET0NfSUNPTi5sZW5ndGgoKSwgaWNucyk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0LCAiL01hY09TLyIgKyBuYW1lICsgIi5pbmkiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXRyYW5zZmVyU3RyZWFtcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSksIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3NzaWJsZSB0byBicmFuZCBpbmkgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3NzaWJsZSB0byBicmFuZCBpbmkgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SW5mb1BMaXN0RmlsZShTdHJpbmcgaW5pdGlhbFJvb3QsIFN0cmluZyB0YXJnZXRSb290LCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJRmlsZSBpbmZvUExpc3QgPSBuZXcgRmlsZShpbml0aWFsUm9vdCwgIkluZm8ucGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyOwotCQl0cnkgewotCQkJYnVmZmVyID0gcmVhZEZpbGUoaW5mb1BMaXN0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBvc3NpYmxlIHRvIGJyYW5kIGluZm8ucGxpc3QgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGV4ZVBvcyA9IHNjYW4oYnVmZmVyLCAwLCBNQVJLRVJfTkFNRSk7Ci0JCWlmIChleGVQb3MgIT0gLTEpCi0JCQlidWZmZXIucmVwbGFjZShleGVQb3MsIGV4ZVBvcyArIE1BUktFUl9OQU1FLmxlbmd0aCgpLCBuYW1lKTsKLQkJZWxzZSB7Ci0JCQlleGVQb3MgPSBzY2FuKGJ1ZmZlciwgMCwgTUFSS0VSX0tFWSk7Ci0JCQlpZiAoZXhlUG9zICE9IC0xKSB7Ci0JCQkJaW50IHN0YXJ0ID0gc2NhbihidWZmZXIsIGV4ZVBvcyArIE1BUktFUl9LRVkubGVuZ3RoKCksIFNUUklOR19TVEFSVCk7Ci0JCQkJaW50IGVuZCA9IHNjYW4oYnVmZmVyLCBzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgU1RSSU5HX0VORCk7Ci0JCQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHsKLQkJCQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBTVFJJTkdfU1RBUlQubGVuZ3RoKCksIGVuZCwgbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IGJ1bmRsZVBvcyA9IHNjYW4oYnVmZmVyLCAwLCBCVU5ETEVfTkFNRSk7Ci0JCWlmIChidW5kbGVQb3MgIT0gLTEpCi0JCQlidWZmZXIucmVwbGFjZShidW5kbGVQb3MsIGJ1bmRsZVBvcyArIEJVTkRMRV9OQU1FLmxlbmd0aCgpLCBuYW1lKTsKLQkJZWxzZSB7Ci0JCQlleGVQb3MgPSBzY2FuKGJ1ZmZlciwgMCwgQlVORExFX0tFWSk7Ci0JCQlpZiAoZXhlUG9zICE9IC0xKSB7Ci0JCQkJaW50IHN0YXJ0ID0gc2NhbihidWZmZXIsIGV4ZVBvcyArIEJVTkRMRV9LRVkubGVuZ3RoKCksIFNUUklOR19TVEFSVCk7Ci0JCQkJaW50IGVuZCA9IHNjYW4oYnVmZmVyLCBzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgU1RSSU5HX0VORCk7Ci0JCQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHsKLQkJCQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBTVFJJTkdfU1RBUlQubGVuZ3RoKCksIGVuZCwgbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IGljb25Qb3MgPSBzY2FuKGJ1ZmZlciwgMCwgSUNPTl9OQU1FKTsKLQkJaWYgKGljb25Qb3MgIT0gLTEpCi0JCQlidWZmZXIucmVwbGFjZShpY29uUG9zLCBpY29uUG9zICsgSUNPTl9OQU1FLmxlbmd0aCgpLCBpY29uTmFtZSk7Ci0JCWVsc2UgewotCQkJZXhlUG9zID0gc2NhbihidWZmZXIsIDAsIElDT05fS0VZKTsKLQkJCWlmIChleGVQb3MgIT0gLTEpIHsKLQkJCQlpbnQgc3RhcnQgPSBzY2FuKGJ1ZmZlciwgZXhlUG9zICsgSUNPTl9LRVkubGVuZ3RoKCksIFNUUklOR19TVEFSVCk7Ci0JCQkJaW50IGVuZCA9IHNjYW4oYnVmZmVyLCBzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgU1RSSU5HX0VORCk7Ci0JCQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHsKLQkJCQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBTVFJJTkdfU1RBUlQubGVuZ3RoKCksIGVuZCwgaWNvbk5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUZpbGUgdGFyZ2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRhcmdldCA9IG5ldyBGaWxlKHRhcmdldFJvb3QsICJJbmZvLnBsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRhcmdldC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQl0cmFuc2ZlclN0cmVhbXMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCkpLCBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXQpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3NzaWJsZSB0byBicmFuZCBpbmZvLnBsaXN0IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9zc2libGUgdG8gYnJhbmQgaW5mby5wbGlzdCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJaWYgKCFpbmZvUExpc3QuZ2V0Q2Fub25pY2FsRmlsZSgpLmVxdWFscyh0YXJnZXQuZ2V0Q2Fub25pY2FsRmlsZSgpKSkKLQkJCQlpbmZvUExpc3QuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2ZlcnMgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uIAotCSAqIFJlZ2FyZGxlc3Mgb2YgZmFpbHVyZSwgdGhpcyBtZXRob2QgY2xvc2VzIGJvdGggc3RyZWFtcy4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKSk7Ci0JCQlvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pKTsKLQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IC0xOwotCQkJCWJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyKTsKLQkJCQlpZiAoYnl0ZXNSZWFkID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHNjYW4oU3RyaW5nQnVmZmVyIGJ1ZiwgaW50IHN0YXJ0LCBTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gc2NhbihidWYsIHN0YXJ0LCBuZXcgU3RyaW5nW10ge3RhcmdldE5hbWV9KTsKLQl9Ci0KLQlwcml2YXRlIGludCBzY2FuKFN0cmluZ0J1ZmZlciBidWYsIGludCBzdGFydCwgU3RyaW5nW10gdGFyZ2V0cykgewotCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBidWYubGVuZ3RoKCk7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YXJnZXRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKGkgPCBidWYubGVuZ3RoKCkgLSB0YXJnZXRzW2pdLmxlbmd0aCgpKSB7Ci0JCQkJCVN0cmluZyBtYXRjaCA9IGJ1Zi5zdWJzdHJpbmcoaSwgaSArIHRhcmdldHNbal0ubGVuZ3RoKCkpOwotCQkJCQlpZiAodGFyZ2V0c1tqXS5lcXVhbHNJZ25vcmVDYXNlKG1hdGNoKSkKLQkJCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVhZEZpbGUoRmlsZSB0YXJnZXROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh0YXJnZXROYW1lKSkpOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gYnVmID0gbmV3IGNoYXJbNDA5Nl07Ci0JCWludCBjb3VudDsKLQkJdHJ5IHsKLQkJCWNvdW50ID0gcmVhZGVyLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLQkJCXdoaWxlIChjb3VudCAhPSAtMSkgewotCQkJCXJlc3VsdC5hcHBlbmQoYnVmLCAwLCBjb3VudCk7Ci0JCQkJY291bnQgPSByZWFkZXIucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUgZXhjZXB0aW9ucyBoZXJlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNmZXJTdHJlYW1zKElucHV0U3RyZWFtIHNvdXJjZSwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzb3VyY2UgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb3VyY2UpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSAtMTsKLQkJCQlpZiAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5yZWFkKGJ1ZmZlcikpID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T1MoU3RyaW5nIHZhbHVlKSB7Ci0JCW9zID0gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvcGRlL2ludGVybmFsL3N3dC90b29scy9JY29uRXhlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9wZGUvaW50ZXJuYWwvc3d0L3Rvb2xzL0ljb25FeGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZTdiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9wZGUvaW50ZXJuYWwvc3d0L3Rvb2xzL0ljb25FeGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuc3d0LnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEN1c3RvbWl6ZSB0aGUgaWNvbiBvZiBhIFdpbmRvd3MgZXhlCi0gKiAKLSAqIFdBUk5JTkchIFRoaXMgY2xhc3MgaXMgbm90IHBhcnQgb2YgU1dUIEFQSS4gSXQgaXMgTk9UIEFQSS4gSXQgaXMgYW4gaW50ZXJuYWwKLSAqIHRvb2wgdGhhdCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIGF0IGFueXRpbWUuCi0gKiAKLSAqIEJhc2VkIG9uIE1TRE4gIkFuIEluLURlcHRoIExvb2sgaW50byB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZSBGaWxlIEZvcm1hdCIKLSAqLwotcHVibGljIGNsYXNzIEljb25FeGUgewotCQotCSAvKioKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggbWF0Y2hpbmcgaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICoKLSAJICogVGFrZXMgMiBhcmd1bWVudHMKLQkgKiBhcmd1bWVudCAwOiB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogYXJndW1lbnQgMTogVGhlIC5pY28gZmlsZSB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBlLmcuIGM6L215QXBwLmljbwotCSAqCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiAgVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIGEgLmljbyBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyA2IGltYWdlcwotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIEEgdXNlciBpY29uIG1hdGNoaW5nIGV4YWN0bHkgdGhlIHdpZHRoL2hlaWdodC9kZXB0aCBvZiBhbiBleGVjdXRhYmxlIGljb24gd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGV4ZWN1dGFibGUgYW5kIHdpbGwgcmVwbGFjZSB0aGF0IGV4ZWN1dGFibGUgaWNvbi4gSWYgYW4gZXhlY3V0YWJsZSBpY29uCi0JICogZG9lcyBub3QgbWF0Y2ggYSB1c2VyIGljb24sIGl0IGlzIHNpbGVudGx5IGxlZnQgYXMgaXMuCi0JICogCi0JICogTm90ZSAzLiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBJY29uRXhlIDx3aW5kb3dzIGV4ZWN1dGFibGU+IDxpY28gZmlsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCi0JCUxpc3QgaW1hZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJLy9BbiBJQ08gc2hvdWxkIGNvbnRhaW4gNyBpbWFnZXMsIGEgQk1QIHdpbGwgY29udGFpbiAxCi0JCQkJSW1hZ2VEYXRhW10gY3VycmVudCA9IGxvYWRlci5sb2FkKGFyZ3NbaV0pOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudC5sZW5ndGg7IGorKykgewotCQkJCQlpbWFnZXMuYWRkKGN1cnJlbnRbal0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIHNvIHRoYXQgd2UgcHJvY2VzcyB0aGUgb3RoZXIgaW1hZ2VzCi0JCQl9Ci0JCX0KLQkJSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZURhdGFbaW1hZ2VzLnNpemUoKV07Ci0JCWRhdGEgPSAoSW1hZ2VEYXRhW10pIGltYWdlcy50b0FycmF5KGRhdGEpOwotCQkKLQkJaW50IG5NaXNzaW5nID0gdW5sb2FkSWNvbnMoYXJnc1swXSwgZGF0YSk7Ci0JCWlmIChuTWlzc2luZyAhPSAwKQotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciAtICIgKyBuTWlzc2luZyArICIgaWNvbihzKSBub3QgcmVwbGFjZWQgaW4gIiArIGFyZ3NbMF0gKyAiIHVzaW5nICIgKyBhcmdzWzFdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0JCi0JLyogSW1wbGVtZW50YXRpb24gKi8KLQotCS8qKiAKLQkgKiBSZXRyaWV2ZSB0aGUgRGVza3RvcCBpY29ucyBwcm92aWRlZCBpbiB0aGUgV2luZG93cyBleGVjdXRhYmxlIHByb2dyYW0uCi0JICogVGhlc2UgaWNvbnMgYXJlIHR5cGljYWxseSBzaG93biBpbiB2YXJpb3VzIHBsYWNlcyBvZiB0aGUgV2luZG93cyBkZXNrdG9wLgotCSAqIAotCSAqIE5vdGUuICBUaGUgRWNsaXBzZSAzLjEgbGF1bmNoZXIgcmV0dXJucyB0aGUgZm9sbG93aW5nIDYgaW1hZ2VzCi0JICogMS4gMzJ4MzIsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDIuIDE2eDE2LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAzLiAxNngxNiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNC4gMzJ4MzIsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDUuIDQ4eDQ4LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiA2LiA0OHg0OCwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogCi0JICogQHBhcmFtIHByb2dyYW0gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqLwkKLQlzdGF0aWMgSW1hZ2VEYXRhW10gbG9hZEljb25zKFN0cmluZyBwcm9ncmFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocHJvZ3JhbSwgInIiKTsgLy8kTk9OLU5MUy0xJAotCQlJY29uRXhlIGljb25FeGUgPSBuZXcgSWNvbkV4ZSgpOwotCQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gaWNvbkV4ZS5nZXRJY29ucyhyYWYpOwotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVtpY29uSW5mby5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIGRhdGFbaV0gPSBpY29uSW5mb1tpXS5kYXRhOwotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCS8qKiAKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiBVc2UgbG9hZEljb25zIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgaWNvbnMgKHdpZHRoLCBoZWlnaHQsIGRlcHRoKQotCSAqIGlzIHJlcXVpcmVkIHRvIHJlcGxhY2UgdGhlIGljb25zIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uIEEgdXNlciBpY29uCi0JICogbWF0Y2hpbmcgZXhhY3RseSB0aGUgd2lkdGgvaGVpZ2h0L2RlcHRoIG9mIGFuIGV4ZWN1dGFibGUgaWNvbiB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgZXhlY3V0YWJsZSBhbmQgd2lsbCByZXBsYWNlIHRoYXQgZXhlY3V0YWJsZSBpY29uLiBJZiBhbiBleGVjdXRhYmxlIGljb24KLQkgKiBkb2VzIG5vdCBtYXRjaCBhIHVzZXIgaWNvbiwgaXQgaXMgbGVmdCBhcyBpcy4gVmVyaWZ5IHRoZSByZXR1cm4gdmFsdWUgbWF0Y2hlcwotCSAqIHRoZSBudW1iZXIgb2YgaWNvbnMgdG8gd3JpdGUuIEZpbmFsbHksIHVzZSBsb2FkSWNvbnMgYWZ0ZXIgdGhpcyBvcGVyYXRpb24KLQkgKiB0byB2ZXJpZnkgdGhlIGljb25zIGhhdmUgY2hhbmdlZCBhcyBleHBlY3RlZC4KLQkgKiAKLQkgKiBOb3RlIDMuIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIDYgaW1hZ2VzIChpbiBhbnkgb3JkZXIpLgotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIAotCSAqIE5vdGUgNC4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBtYXkgY2F1c2UKLQkgKiBpdHMgY29ycnVwdGlvbi4gCi0JICogCi0JICogQHBhcmFtIHByb2dyYW0gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqIEBwYXJhbSBpY29ucyB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpY29ucyBmcm9tIHRoZSBvcmlnaW5hbCBwcm9ncmFtIHRoYXQgd2VyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlcGxhY2VkICgwIGlmIHN1Y2Nlc3MpCi0JICovCQotCXN0YXRpYyBpbnQgdW5sb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0sIEltYWdlRGF0YVtdIGljb25zKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocHJvZ3JhbSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQKLQkJSWNvbkV4ZSBpY29uRXhlID0gbmV3IEljb25FeGUoKTsKLQkJSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IGljb25FeGUuZ2V0SWNvbnMocmFmKTsKLQkJaW50IGNudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbkluZm8ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaWNvbnMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoaWNvbnNbal0gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGljb25JbmZvW2ldLmRhdGEud2lkdGggPT0gaWNvbnNbal0ud2lkdGggJiYgaWNvbkluZm9baV0uZGF0YS5oZWlnaHQgPT0gaWNvbnNbal0uaGVpZ2h0ICYmIGljb25JbmZvW2ldLmRhdGEuZGVwdGggPT0gaWNvbnNbal0uZGVwdGgpIHsKLQkJCQkJcmFmLnNlZWsoaWNvbkluZm9baV0ub2Zmc2V0KTsKLQkJCQkJdW5sb2FkSWNvbihyYWYsIGljb25zW2pdKTsKLQkJCQkJY250Kys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGljb25JbmZvLmxlbmd0aCAtIGNudDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIyMDA1MDEyNCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSWNvblJlc0luZm8gewotCQlJbWFnZURhdGEgZGF0YTsKLQkJaW50IG9mZnNldDsKLQkJaW50IHNpemU7Ci0JfQotCQotCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBudWxsOwotCWludCBpY29uQ250OwotCQotCUljb25SZXNJbmZvW10gZ2V0SWNvbnMoUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWljb25JbmZvID0gbmV3IEljb25SZXNJbmZvWzRdOwotCQlpY29uQ250ID0gMDsKLQkJSU1BR0VfRE9TX0hFQURFUiBpbWFnZURvc0hlYWRlciA9IG5ldyBJTUFHRV9ET1NfSEVBREVSKCk7Ci0JCXJlYWQocmFmLCBpbWFnZURvc0hlYWRlcik7Ci0JCWlmIChpbWFnZURvc0hlYWRlci5lX21hZ2ljICE9IElNQUdFX0RPU19TSUdOQVRVUkUpIHJldHVybiBudWxsOwotCQlpbnQgaW1hZ2VOdEhlYWRlcnNPZmZzZXQgPSBpbWFnZURvc0hlYWRlci5lX2xmYW5ldzsKLQkJcmFmLnNlZWsoaW1hZ2VOdEhlYWRlcnNPZmZzZXQpOwotCQlJTUFHRV9OVF9IRUFERVJTIGltYWdlTnRIZWFkZXJzID0gbmV3IElNQUdFX05UX0hFQURFUlMoKTsKLQkJcmVhZChyYWYsIGltYWdlTnRIZWFkZXJzKTsKLQkJaWYgKGltYWdlTnRIZWFkZXJzLlNpZ25hdHVyZSAhPSBJTUFHRV9OVF9TSUdOQVRVUkUpIHJldHVybiBudWxsOwotCQkKLQkJLy8gRHVtcFJlc291cmNlcwotCQlpbnQgcmVzb3VyY2VzUlZBID0gaW1hZ2VOdEhlYWRlcnMuT3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0VdLlZpcnR1YWxBZGRyZXNzOwotCQlpZiAocmVzb3VyY2VzUlZBID09IDApIHJldHVybiBudWxsOwotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiKiBSZXNvdXJjZXMgKFJWQT0gIityZXNvdXJjZXNSVkErIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlNQUdFX1NFQ1RJT05fSEVBREVSIGltYWdlU2VjdGlvbkhlYWRlciA9IG5ldyBJTUFHRV9TRUNUSU9OX0hFQURFUigpOwotCQlpbnQgZmlyc3RTZWN0aW9uT2Zmc2V0ID0gaW1hZ2VOdEhlYWRlcnNPZmZzZXQgKyBJTUFHRV9OVF9IRUFERVJTLkZJRUxEX09GRlNFVF9PcHRpb25hbEhlYWRlciArIGltYWdlTnRIZWFkZXJzLkZpbGVIZWFkZXIuU2l6ZU9mT3B0aW9uYWxIZWFkZXI7Ci0JCXJhZi5zZWVrKGZpcnN0U2VjdGlvbk9mZnNldCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZU50SGVhZGVycy5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7IGkrKykgewotCQkJcmVhZChyYWYsIGltYWdlU2VjdGlvbkhlYWRlcik7Ci0JCQlpZiAocmVzb3VyY2VzUlZBID49IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyAmJiByZXNvdXJjZXNSVkEgPCBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgKyBpbWFnZVNlY3Rpb25IZWFkZXIuTWlzY19WaXJ0dWFsU2l6ZSkgewotCQkJCS8vIGNvdWxkIGNoZWNrIHRoZSBpbWFnZVNlY3Rpb25IZWFkZXIgbmFtZSBpcyAucnNyYwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWZvdW5kKSByZXR1cm4gbnVsbDsKLQkJaW50IGRlbHRhID0gaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzIC0gaW1hZ2VTZWN0aW9uSGVhZGVyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JCWludCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0ID0gcmVzb3VyY2VzUlZBIC0gZGVsdGE7Ci0JCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGRlbHRhLCAwLCAwLCBmYWxzZSk7Ci0JCWlmIChpY29uQ250IDwgaWNvbkluZm8ubGVuZ3RoKSB7Ci0JCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25DbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShpY29uSW5mbywgMCwgbmV3QXJyYXksIDAsIGljb25DbnQpOwotCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJfQotCQlyZXR1cm4gaWNvbkluZm87Ci0JfQotCi12b2lkIGR1bXBSZXNvdXJjZURpcmVjdG9yeShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGludCByZXNvdXJjZUJhc2UsIGludCBkZWx0YSwgaW50IHR5cGUsIGludCBsZXZlbCwgYm9vbGVhbiBydF9pY29uX3Jvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIExFVkVMICIrbGV2ZWwpOyAvLyROT04tTkxTLTEkCi0KLQlJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeSA9IG5ldyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkoKTsKLQlyYWYuc2VlayhpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0KTsKLQlyZWFkKHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeSk7Ci0KLQlpZiAoREVCVUcpIHsKLQkJU3RyaW5nIHNUeXBlID0gIiIrdHlwZTsgLy8kTk9OLU5MUy0xJAotCQkvLyBsZXZlbCAxIHJlc291cmNlcyBhcmUgcmVzb3VyY2UgdHlwZXMKLQkJaWYgKGxldmVsID09IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiX19fX19fX19fX19fX19fX19fX19fX19fX19fIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh0eXBlID09IFJUX0lDT04pIHNUeXBlID0gIlJUX0lDT04iOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodHlwZSA9PSBSVF9HUk9VUF9JQ09OKSBzVHlwZSA9ICJSVF9HUk9VUF9JQ09OIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRGlyZWN0b3J5IFsiK3NUeXBlKyJdIisiIChOYW1lZCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZOYW1lZEVudHJpZXMrIiwgSUQgIitpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzKyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtdIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSgpOwotCQlyZWFkKHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0pOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5EYXRhSXNEaXJlY3RvcnkpIHsKLQkJCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGlyZWN0b3J5ICsgcmVzb3VyY2VCYXNlLCByZXNvdXJjZUJhc2UsIGRlbHRhLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5JZCwgbGV2ZWwgKyAxLCBydF9pY29uX3Jvb3QgPyB0cnVlIDogdHlwZSA9PSBSVF9JQ09OKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFJlc291cmNlIGZvdW5kCi0JCQkvLy8gcFJlc0RpckVudHJ5LT5OYW1lCi0JCQlJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgaXJkZSA9IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldOwotCQkJSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSBkYXRhID0gbmV3IElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkoKTsKLQkJCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGF0YSArIHJlc291cmNlQmFzZSk7Ci0JCQlyZWFkKHJhZiwgZGF0YSk7Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgSWQgIitpcmRlLklkKyIgRGF0YSBPZmZzZXQgUlZBICIrZGF0YS5PZmZzZXRUb0RhdGErIiwgU2l6ZSAiK2RhdGEuU2l6ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlpZiAocnRfaWNvbl9yb290KSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oImljb25jbnQgIitpY29uQ250KyIgfCIraWNvbkluZm8ubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWNvbkluZm9baWNvbkNudF0gPSBuZXcgSWNvblJlc0luZm8oKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XS5kYXRhID0gcGFyc2VJY29uKHJhZiwgZGF0YS5PZmZzZXRUb0RhdGEgLSBkZWx0YSwgZGF0YS5TaXplKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XS5vZmZzZXQgPSBkYXRhLk9mZnNldFRvRGF0YSAtIGRlbHRhOwotCQkJCWljb25JbmZvW2ljb25DbnRdLnNpemUgPSBkYXRhLlNpemU7CQotCQkJCWljb25DbnQrKzsKLQkJCQlpZiAoaWNvbkNudCA9PSBpY29uSW5mby5sZW5ndGgpIHsKLQkJCQkJSWNvblJlc0luZm9bXSBuZXdBcnJheSA9IG5ldyBJY29uUmVzSW5mb1tpY29uSW5mby5sZW5ndGggKyA0XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShpY29uSW5mbywgMCwgbmV3QXJyYXksIDAsIGljb25JbmZvLmxlbmd0aCk7Ci0JCQkJCWljb25JbmZvID0gbmV3QXJyYXk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gCX0KLX0KLQotc3RhdGljIEltYWdlRGF0YSBwYXJzZUljb24oUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBvZmZzZXQsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi5zZWVrKG9mZnNldCk7Ci0JQklUTUFQSU5GTyBiaXRtYXBJbmZvID0gbmV3IEJJVE1BUElORk8oKTsKLQlyZWFkKHJhZiwgYml0bWFwSW5mbyk7Ci0JYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgLz0gMjsKLQlpbnQgd2lkdGggPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoOwotCWludCBoZWlnaHQgPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodDsKLQlpbnQgZGVwdGggPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50OwotCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGxvYWRQYWxldHRlKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCWJ5dGVbXSBzaGFwZURhdGEgPSBsb2FkRGF0YShiaXRtYXBJbmZvLmJtaUhlYWRlciwgcmFmKTsKLQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTsKLQlieXRlW10gbWFza0RhdGEgPSBsb2FkRGF0YShiaXRtYXBJbmZvLmJtaUhlYWRlciwgcmFmKTsKLQltYXNrRGF0YSA9IGNvbnZlcnRQYWQobWFza0RhdGEsIHdpZHRoLCBoZWlnaHQsIDEsIDQsIDIpOwotCWJpdEludmVydERhdGEobWFza0RhdGEsIDAsIG1hc2tEYXRhLmxlbmd0aCk7Ci0JcmV0dXJuIEltYWdlRGF0YS5pbnRlcm5hbF9uZXcoCi0JCXdpZHRoLAotCQloZWlnaHQsCi0JCWRlcHRoLAotCQlwYWxldHRlLAotCQk0LAotCQlzaGFwZURhdGEsCi0JCTIsCi0JCW1hc2tEYXRhLAotCQludWxsLAotCQktMSwKLQkJLTEsCi0JCVNXVC5JTUFHRV9JQ08sCi0JCTAsCi0JCTAsCi0JCTAsCi0JCTApOwotfQotCi1zdGF0aWMgYnl0ZVtdIGJpdEludmVydERhdGEoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkvLyBEZXN0cnVjdGl2ZWx5IGJpdCBpbnZlcnQgZGF0YSBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KLQlmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHsKLQkJZGF0YVtpXSA9IChieXRlKSgyNTUgLSBkYXRhW2kgLSBzdGFydEluZGV4XSk7Ci0JfQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRQYWQoYnl0ZVtdIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGFkLCBpbnQgbmV3UGFkKSB7Ci0JaWYgKHBhZCA9PSBuZXdQYWQpIHJldHVybiBkYXRhOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBkZXB0aCArIDcpIC8gODsKLQlpbnQgYnBsID0gKHN0cmlkZSArIChwYWQgLSAxKSkgLyBwYWQgKiBwYWQ7Ci0JaW50IG5ld0JwbCA9IChzdHJpZGUgKyAobmV3UGFkIC0gMSkpIC8gbmV3UGFkICogbmV3UGFkOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbaGVpZ2h0ICogbmV3QnBsXTsKLQlpbnQgc3JjSW5kZXggPSAwLCBkZXN0SW5kZXggPSAwOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBuZXdCcGwpOwotCQlzcmNJbmRleCArPSBicGw7Ci0JCWRlc3RJbmRleCArPSBuZXdCcGw7Ci0JfQotCXJldHVybiBuZXdEYXRhOwotfQotc3RhdGljIFBhbGV0dGVEYXRhIGxvYWRQYWxldHRlKEJJVE1BUElORk9IRUFERVIgYmloLCBSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgZGVwdGggPSBiaWguYmlCaXRDb3VudDsKLQlpZiAoZGVwdGggPD0gOCkgewotCQlpbnQgbnVtQ29sb3JzID0gYmloLmJpQ2xyVXNlZDsKLQkJaWYgKG51bUNvbG9ycyA9PSAwKSB7Ci0JCQludW1Db2xvcnMgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJaWYgKG51bUNvbG9ycyA+IDI1NikKLQkJCQludW1Db2xvcnMgPSAyNTY7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW251bUNvbG9ycyAqIDRdOwotCQlyYWYucmVhZChidWYpOwotCQlyZXR1cm4gcGFsZXR0ZUZyb21CeXRlcyhidWYsIG51bUNvbG9ycyk7Ci0JfQotCWlmIChkZXB0aCA9PSAxNikgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweDdDMDAsIDB4M0UwLCAweDFGKTsKLQlpZiAoZGVwdGggPT0gMjQpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRiwgMHhGRjAwLCAweEZGMDAwMCk7Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGMDAsIDB4RkYwMDAwLCAweEZGMDAwMDAwKTsKLX0KLXN0YXRpYyBQYWxldHRlRGF0YSBwYWxldHRlRnJvbUJ5dGVzKGJ5dGVbXSBieXRlcywgaW50IG51bUNvbG9ycykgewotCWludCBieXRlc09mZnNldCA9IDA7Ci0JUkdCW10gY29sb3JzID0gbmV3IFJHQltudW1Db2xvcnNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JzOyBpKyspIHsKLQkJY29sb3JzW2ldID0gbmV3IFJHQihieXRlc1tieXRlc09mZnNldCArIDJdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0ICsgMV0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXRdICYgMHhGRik7Ci0JCWJ5dGVzT2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoY29sb3JzKTsKLX0KLXN0YXRpYyBieXRlW10gbG9hZERhdGEoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBzdHJpZGUgPSAoYmloLmJpV2lkdGggKiBiaWguYmlCaXRDb3VudCArIDcpIC8gODsKLQlzdHJpZGUgPSAoc3RyaWRlICsgMykgLyA0ICogNDsgLy8gUm91bmQgdXAgdG8gNCBieXRlIG11bHRpcGxlCi0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShiaWgsIHJhZiwgc3RyaWRlKTsKLQlmbGlwU2NhbkxpbmVzKGRhdGEsIHN0cmlkZSwgYmloLmJpSGVpZ2h0KTsKLQlyZXR1cm4gZGF0YTsKLX0KLXN0YXRpYyB2b2lkIGZsaXBTY2FuTGluZXMoYnl0ZVtdIGRhdGEsIGludCBzdHJpZGUsIGludCBoZWlnaHQpIHsKLQlpbnQgaTEgPSAwOwotCWludCBpMiA9IChoZWlnaHQgLSAxKSAqIHN0cmlkZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaWRlOyBpbmRleCsrKSB7Ci0JCQlieXRlIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci1zdGF0aWMgYnl0ZVtdIGxvYWREYXRhKEJJVE1BUElORk9IRUFERVIgYmloLCBSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHN0cmlkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgZGF0YVNpemUgPSBiaWguYmlIZWlnaHQgKiBzdHJpZGU7Ci0JYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhU2l6ZV07Ci0JaW50IGNtcCA9IGJpaC5iaUNvbXByZXNzaW9uOwotCWlmIChjbXAgPT0gMCkgeyAvLyBCTVBfTk9fQ09NUFJFU1NJT04KLQkJcmFmLnJlYWQoZGF0YSk7Ci0JfSBlbHNlIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIklDTyBjYW5ub3QgYmUgY29tcHJlc3NlZD8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgdW5sb2FkSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHNpemVJbWFnZSA9ICgoKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgMzEpIC8gMzIgKiA0KSArCi0JCSgoaWNvbi53aWR0aCArIDMxKSAvIDMyICogNCkpICogaWNvbi5oZWlnaHQ7Ci0Jd3JpdGU0KHJhZiwgQk1QSGVhZGVyRml4ZWRTaXplKTsKLQl3cml0ZTQocmFmLCBpY29uLndpZHRoKTsKLQl3cml0ZTQocmFmLCBpY29uLmhlaWdodCAqIDIpOwotCXdyaXRlVTIocmFmLCAxKTsKLQl3cml0ZVUyKHJhZiwgaWNvbi5kZXB0aCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0Jd3JpdGU0KHJhZiwgc2l6ZUltYWdlKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCBpY29uLnBhbGV0dGUuY29sb3JzICE9IG51bGwgPyBpY29uLnBhbGV0dGUuY29sb3JzLmxlbmd0aCA6IDApOwotCXdyaXRlNChyYWYsIDApOwotCQotCWJ5dGVbXSByZ2JzID0gcGFsZXR0ZVRvQnl0ZXMoaWNvbi5wYWxldHRlKTsKLQlyYWYud3JpdGUocmdicyk7Ci0JdW5sb2FkU2hhcGVEYXRhKHJhZiwgaWNvbik7Ci0JdW5sb2FkTWFza0RhdGEocmFmLCBpY29uKTsKLX0KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotc3RhdGljIHZvaWQgdW5sb2FkTWFza0RhdGEoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEltYWdlRGF0YSBpY29uKSB7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBpY29uLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKyA3KSAvIDg7Ci0JaW50IHBhZCA9IG1hc2suc2NhbmxpbmVQYWQ7Ci0JaW50IHNyY0JwbCA9IChicGwgKyBwYWQgLSAxKSAvIHBhZCAqIHBhZDsKLQlpbnQgZGVzdEJwbCA9IChicGwgKyAzKSAvIDQgKiA0OwotCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtkZXN0QnBsXTsKLQlpbnQgb2Zmc2V0ID0gKGljb24uaGVpZ2h0IC0gMSkgKiBzcmNCcGw7Ci0JYnl0ZVtdIGRhdGEgPSBtYXNrLmRhdGE7Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uLmhlaWdodDsgaSsrKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgYnVmLCAwLCBicGwpOwotCQkJYml0SW52ZXJ0RGF0YShidWYsIDAsIGJwbCk7Ci0JCQlyYWYud3JpdGUoYnVmLCAwLCBkZXN0QnBsKTsKLQkJCW9mZnNldCAtPSBzcmNCcGw7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLX0KLXN0YXRpYyB2b2lkIHVubG9hZFNoYXBlRGF0YShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgNykgLyA4OwotCWludCBwYWQgPSBpY29uLnNjYW5saW5lUGFkOwotCWludCBzcmNCcGwgPSAoYnBsICsgcGFkIC0gMSkgLyBwYWQgKiBwYWQ7Ci0JaW50IGRlc3RCcGwgPSAoYnBsICsgMykgLyA0ICogNDsKLQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZGVzdEJwbF07Ci0JaW50IG9mZnNldCA9IChpY29uLmhlaWdodCAtIDEpICogc3JjQnBsOwotCWJ5dGVbXSBkYXRhID0gaWNvbi5kYXRhOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbi5oZWlnaHQ7IGkrKykgewotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIGJ1ZiwgMCwgYnBsKTsKLQkJCXJhZi53cml0ZShidWYsIDAsIGRlc3RCcGwpOwotCQkJb2Zmc2V0IC09IHNyY0JwbDsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotfQotc3RhdGljIGJvb2xlYW4gcmVhZEljb25Hcm91cChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlORVdIRUFERVIgbmV3SGVhZGVyID0gbmV3IE5FV0hFQURFUigpOwotCXJlYWQocmFmLCBuZXdIZWFkZXIpOwotCWlmIChuZXdIZWFkZXIuUmVzVHlwZSAhPSBSRVNfSUNPTikgcmV0dXJuIGZhbHNlOwotCVJFU0RJUltdIHJlc0RpciA9IG5ldyBSRVNESVJbbmV3SGVhZGVyLlJlc0NvdW50XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0hlYWRlci5SZXNDb3VudDsgaSsrKSB7Ci0JCXJlc0RpcltpXSA9IG5ldyBSRVNESVIoKTsKLQkJcmVhZChyYWYsIHJlc0RpcltpXSk7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjLCBTdHJpbmcgZHN0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjKTsKLQlGaWxlIGRzdEZpbGUgPSBuZXcgRmlsZShkc3QpOwotCUlucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKSk7Ci0JT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkc3RGaWxlKSk7Ci0JaW50IGM7Ci0Jd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkgb3V0LndyaXRlKGMpOyAKLQlpbi5jbG9zZSgpOwotCW91dC5jbG9zZSgpOwotfQotCi0vKiBJTyB1dGlsaXRpZXMgdG8gcGFyc2UgV2luZG93cyBleGVjdXRhYmxlICovCi1zdGF0aWMgZmluYWwgaW50IElNQUdFX0RPU19TSUdOQVRVUkUgPSAweDVhNGQ7Ci1zdGF0aWMgZmluYWwgaW50IElNQUdFX05UX1NJR05BVFVSRSA9IDB4MDAwMDQ1NTA7Ci1zdGF0aWMgZmluYWwgaW50IElNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRSA9IDI7Ci1zdGF0aWMgZmluYWwgaW50IFJFU19JQ09OID0gMTsKLXN0YXRpYyBmaW5hbCBpbnQgUlRfSUNPTiA9IDM7Ci1zdGF0aWMgZmluYWwgaW50IFJUX0dST1VQX0lDT04gPSAxNDsKLXN0YXRpYyBmaW5hbCBpbnQgQk1QSGVhZGVyRml4ZWRTaXplID0gNDA7Ci0JCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0RPU19IRUFERVIgewotCWludCBlX21hZ2ljOyAvLyBXT1JECi0JaW50IGVfY2JscDsgLy8gV09SRAotCWludCBlX2NwOyAvLyBXT1JECi0JaW50IGVfY3JsYzsgLy8gV09SRAotCWludCBlX2NwYXJoZHI7IC8vIFdPUkQKLQlpbnQgZV9taW5hbGxvYzsgLy8gV09SRAotCWludCBlX21heGFsbG9jOyAvLyBXT1JECi0JaW50IGVfc3M7IC8vIFdPUkQKLQlpbnQgZV9zcDsgLy8gV09SRAotCWludCBlX2NzdW07IC8vIFdPUkQKLQlpbnQgZV9pcDsgLy8gV09SRAotCWludCBlX2NzOyAvLyBXT1JECi0JaW50IGVfbGZhcmxjOyAvLyBXT1JECi0JaW50IGVfb3ZubzsgLy8gV09SRAotCWludFtdIGVfcmVzID0gbmV3IGludFs0XTsgLy8gV09SRFs0XQotCWludCBlX29lbWlkOyAvLyBXT1JECi0JaW50IGVfb2VtaW5mbzsgLy8gV09SRAotCWludFtdIGVfcmVzMiA9IG5ldyBpbnRbMTBdOyAvLyBXT1JEWzEwXQotCWludCBlX2xmYW5ldzsgLy8gTE9ORwotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0ZJTEVfSEVBREVSIHsKLQlpbnQgTWFjaGluZTsgLy8gV09SRAotCWludCBOdW1iZXJPZlNlY3Rpb25zOyAvLyBXT1JECi0JaW50IFRpbWVEYXRlU3RhbXA7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1N5bWJvbFRhYmxlOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlN5bWJvbHM7IC8vIERXT1JECi0JaW50IFNpemVPZk9wdGlvbmFsSGVhZGVyOyAvLyBXT1JECi0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0RBVEFfRElSRUNUT1JZIHsKLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemU7IC8vIERXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfT1BUSU9OQUxfSEVBREVSIHsKLQlpbnQgTWFnaWM7IC8vIFdPUkQKLQlpbnQgTWFqb3JMaW5rZXJWZXJzaW9uOyAvLyBCWVRFCi0JaW50IE1pbm9yTGlua2VyVmVyc2lvbjsgLy8gQllURQotCWludCBTaXplT2ZDb2RlOyAvLyBEV09SRAotCWludCBTaXplT2ZJbml0aWFsaXplZERhdGE7IC8vIERXT1JECi0JaW50IFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOyAvLyBEV09SRAotCWludCBBZGRyZXNzT2ZFbnRyeVBvaW50OyAvLyBEV09SRAotCWludCBCYXNlT2ZDb2RlOyAvLyBEV09SRAotCWludCBCYXNlT2ZEYXRhOyAvLyBEV09SRAotCWludCBJbWFnZUJhc2U7IC8vIERXT1JECi0JaW50IFNlY3Rpb25BbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IEZpbGVBbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBXaW4zMlZlcnNpb25WYWx1ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSW1hZ2U7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYWRlcnM7IC8vIERXT1JECi0JaW50IENoZWNrU3VtOyAvLyBEV09SRAotCWludCBTdWJzeXN0ZW07IC8vIFdPUkQKLQlpbnQgRGxsQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi0JaW50IFNpemVPZlN0YWNrUmVzZXJ2ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mU3RhY2tDb21taXQ7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYXBSZXNlcnZlOyAvLyBEV09SRAotCWludCBTaXplT2ZIZWFwQ29tbWl0OyAvLyBEV09SRAotCWludCBMb2FkZXJGbGFnczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSdmFBbmRTaXplczsgLy8gRFdPUkQKLQlJTUFHRV9EQVRBX0RJUkVDVE9SWVtdIERhdGFEaXJlY3RvcnkgPSBuZXcgSU1BR0VfREFUQV9ESVJFQ1RPUllbMTZdOwotfQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9OVF9IRUFERVJTIHsKLQlpbnQgU2lnbmF0dXJlOyAvLyBEV09SRAotCUlNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXIgPSBuZXcgSU1BR0VfRklMRV9IRUFERVIoKTsKLQlJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXIgPSBuZXcgSU1BR0VfT1BUSU9OQUxfSEVBREVSKCk7Ci0JZmluYWwgc3RhdGljIGludCBGSUVMRF9PRkZTRVRfT3B0aW9uYWxIZWFkZXIgPSAyNDsgIAotfQotCQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9TRUNUSU9OX0hFQURFUiB7Ci0JaW50W10gTmFtZSA9IG5ldyBpbnRbOF07IC8vIEJZVEVbOF0KLQlpbnQgTWlzY19WaXJ0dWFsU2l6ZTsgLy8gRFdPUkQgKHVuaW9uIE1pc2MgeyBEV09SRCBQaHlzaWNhbEFkZHJlc3M7IERXT1JEIFZpcnR1YWxTaXplIH0KLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemVPZlJhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1Jhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1JlbG9jYXRpb25zOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9MaW5lbnVtYmVyczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSZWxvY2F0aW9uczsgLy8gV09SRAotCWludCBOdW1iZXJPZkxpbmVudW1iZXJzOyAvLyBXT1JECi0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gRFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgewotCWludCBDaGFyYWN0ZXJpc3RpY3M7IC8vIERXT1JECi0JaW50IFRpbWVEYXRlU3RhbXA7IC8vIERXT1JECi0JaW50IE1ham9yVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vclZlcnNpb247IC8vIFdPUkQKLQlpbnQgTnVtYmVyT2ZOYW1lZEVudHJpZXM7IC8vIFdPUkQgLSB1c2VkCi0JaW50IE51bWJlck9mSWRFbnRyaWVzOyAvLyBXT1JEIC0gdXNlZAotCWZpbmFsIHN0YXRpYyBpbnQgU0laRU9GID0gMTY7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIHsKLQkvLyB1bmlvbgotCWludCBOYW1lT2Zmc2V0OyAvLyBEV09SRCAzMSBiaXRzCi0JYm9vbGVhbiBOYW1lSXNTdHJpbmc7IC8vIERXT1JEIDEgYml0Ci0JaW50IE5hbWU7IC8vIERXT1JECi0JaW50IElkOyAvLyBXT1JECi0JLy8gdW5pb24KLQlpbnQgT2Zmc2V0VG9EYXRhOyAvLyBEV09SRAotCWludCBPZmZzZXRUb0RpcmVjdG9yeTsgLy8gRFdPUkQgMzEgYml0cwotCWJvb2xlYW4gRGF0YUlzRGlyZWN0b3J5OyAvLyBEV09SRCAxIGJpdAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgewotCWludCBPZmZzZXRUb0RhdGE7IC8vIERXT1JECi0JaW50IFNpemU7IC8vIERXT1JECi0JaW50IENvZGVQYWdlOyAvLyBEV09SRAotCWludCBSZXNlcnZlZDsgLy8gRFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBORVdIRUFERVIgewotCWludCBSZXNlcnZlZDsgLy8gV09SRAotCWludCBSZXNUeXBlOyAvLyBXT1JECi0JaW50IFJlc0NvdW50OyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSUNPTlJFU0RJUiB7Ci0JaW50IFdpZHRoOyAvLyBCWVRFCi0JaW50IEhlaWdodDsgLy8gQllURQotCWludCBDb2xvckNvdW50OyAvLyBCWVRFCi0JaW50IHJlc2VydmVkOyAvLyBCWVRFCi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgQ1VSU09SRElSIHsKLQlpbnQgV2lkdGg7IC8vIFdPUkQKLQlpbnQgSGVpZ2h0OyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgUkVTRElSIHsKLQkvLyB1bmlvbgotCUlDT05SRVNESVIgSWNvbiA9IG5ldyBJQ09OUkVTRElSKCk7Ci0JQ1VSU09SRElSIEN1cnNvciA9IG5ldyBDVVJTT1JESVIoKTsKLQlpbnQgUGxhbmVzOyAvLyBXT1JECi0JaW50IEJpdENvdW50OyAvLyBXT1JECi0JaW50IEJ5dGVzSW5SZXM7IC8vIERXT1JECi0JaW50IEljb25DdXJzb3JJZDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIEJJVE1BUElORk9IRUFERVIgewotCWludCBiaVNpemU7IC8vIERXT1JECi0JaW50IGJpV2lkdGg7IC8vIExPTkcKLQlpbnQgYmlIZWlnaHQ7IC8vIExPTkcKLQlpbnQgYmlQbGFuZXM7IC8vIFdPUkQKLQlpbnQgYmlCaXRDb3VudDsgLy8gV09SRAotCWludCBiaUNvbXByZXNzaW9uOyAvLyBEV09SRAotCWludCBiaVNpemVJbWFnZTsgLy8gRFdPUkQKLQlpbnQgYmlYUGVsc1Blck1ldGVyOyAvLyBMT05HCi0JaW50IGJpWVBlbHNQZXJNZXRlcjsgLy8gTE9ORwotCWludCBiaUNsclVzZWQ7IC8vIERXT1JECi0JaW50IGJpQ2xySW1wb3J0YW50OyAvLyBEV09SRAotfQotCi1zdGF0aWMgY2xhc3MgUkdCUVVBRCB7Ci0JaW50IHJnQmx1ZTsgLy8gQllURQotCWludCByZ2JHcmVlbjsgLy8gQllURQotCWludCByZ2JSZWQ7IC8vIEJZVEUKLQlpbnQgcmdiUmVzZXJ2ZWQ7IC8vIEJZVEUKLX0KLXN0YXRpYyBjbGFzcyBCSVRNQVBJTkZPIHsKLQlCSVRNQVBJTkZPSEVBREVSIGJtaUhlYWRlciA9IG5ldyBCSVRNQVBJTkZPSEVBREVSKCk7Ci0JUkdCUVVBRFtdIGJtaUNvbG9ycyA9IG51bGw7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBCSVRNQVBJTkZPSEVBREVSIGJpaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQliaWguYmlTaXplID0gcmVhZDQocmFmKTsKLQliaWguYmlXaWR0aCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpSGVpZ2h0ID0gcmVhZDQocmFmKTsKLQliaWguYmlQbGFuZXMgPSByZWFkVTIocmFmKTsKLQliaWguYmlCaXRDb3VudCA9IHJlYWRVMihyYWYpOwotCWJpaC5iaUNvbXByZXNzaW9uID0gcmVhZDQocmFmKTsKLQliaWguYmlTaXplSW1hZ2UgPSByZWFkNChyYWYpOwotCWJpaC5iaVhQZWxzUGVyTWV0ZXIgPSByZWFkNChyYWYpOwotCWJpaC5iaVlQZWxzUGVyTWV0ZXIgPSByZWFkNChyYWYpOwotCWJpaC5iaUNsclVzZWQgPSByZWFkNChyYWYpOwotCWJpaC5iaUNsckltcG9ydGFudCA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBCSVRNQVBJTkZPIGJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJlYWQocmFmLCBiaS5ibWlIZWFkZXIpOwotfQotLyogTGl0dGxlIEVuZGlhbiBoZWxwZXJzICovCi1zdGF0aWMgaW50IHJlYWRVMihSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgYjAgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JaW50IGIxID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCXJldHVybiAoYjEgPDwgOCB8IGIwKTsKLX0KLXN0YXRpYyBpbnQgcmVhZDQoUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGIwID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCWludCBiMSA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlpbnQgYjIgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JaW50IGIzID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCXJldHVybiBiMyA8PCAyNCB8IGIyIDw8IDE2IHwgYjEgPDwgOCB8IGIwOwotfQotc3RhdGljIHZvaWQgd3JpdGU0KFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLndyaXRlKHZhbHVlICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLX0KLXN0YXRpYyB2b2lkIHdyaXRlVTIoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYud3JpdGUodmFsdWUgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDgpICYgMHhGRik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9ET1NfSEVBREVSIGlkaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZGguZV9tYWdpYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NibHAgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NybGMgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcGFyaGRyID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbWluYWxsb2MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9tYXhhbGxvYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX3NzID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfc3AgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jc3VtID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfaXAgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2xmYXJsYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX292bm8gPSByZWFkVTIocmFmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkaC5lX3Jlcy5sZW5ndGg7IGkrKykgaWRoLmVfcmVzW2ldID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb2VtaWQgPSByZWFkVTIocmFmKTsKLQlpZGguZV9vZW1pbmZvID0gcmVhZFUyKHJhZik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZGguZV9yZXMyLmxlbmd0aDsgaSsrKSBpZGguZV9yZXMyW2ldID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbGZhbmV3ID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0ZJTEVfSEVBREVSIGlmaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZmguTWFjaGluZSA9IHJlYWRVMihyYWYpOwotCWlmaC5OdW1iZXJPZlNlY3Rpb25zID0gcmVhZFUyKHJhZik7Ci0JaWZoLlRpbWVEYXRlU3RhbXAgPSByZWFkNChyYWYpOwotCWlmaC5Qb2ludGVyVG9TeW1ib2xUYWJsZSA9IHJlYWQ0KHJhZik7Ci0JaWZoLk51bWJlck9mU3ltYm9scyA9IHJlYWQ0KHJhZik7Ci0JaWZoLlNpemVPZk9wdGlvbmFsSGVhZGVyID0gcmVhZFUyKHJhZik7Ci0JaWZoLkNoYXJhY3RlcmlzdGljcyAgPSByZWFkVTIocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0RBVEFfRElSRUNUT1JZIGlkZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZGQuVmlydHVhbEFkZHJlc3MgPSByZWFkNChyYWYpOwotCWlkZC5TaXplID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX09QVElPTkFMX0hFQURFUiBpb2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW9oLk1hZ2ljID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9yTGlua2VyVmVyc2lvbiA9IHJhZi5yZWFkKCk7Ci0JaW9oLk1pbm9yTGlua2VyVmVyc2lvbiA9IHJhZi5yZWFkKCk7Ci0JaW9oLlNpemVPZkNvZGUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZJbml0aWFsaXplZERhdGEgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZVbmluaXRpYWxpemVkRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLkFkZHJlc3NPZkVudHJ5UG9pbnQgPSByZWFkNChyYWYpOwotCWlvaC5CYXNlT2ZDb2RlID0gcmVhZDQocmFmKTsKLQlpb2guQmFzZU9mRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLkltYWdlQmFzZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNlY3Rpb25BbGlnbm1lbnQgPSByZWFkNChyYWYpOwotCWlvaC5GaWxlQWxpZ25tZW50ID0gcmVhZDQocmFmKTsKLQlpb2guTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NYWpvckltYWdlVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vckltYWdlVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JTdWJzeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLldpbjMyVmVyc2lvblZhbHVlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSW1hZ2UgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFkZXJzID0gcmVhZDQocmFmKTsKLQlpb2guQ2hlY2tTdW0gPSByZWFkNChyYWYpOwotCWlvaC5TdWJzeXN0ZW0gPSByZWFkVTIocmFmKTsKLQlpb2guRGxsQ2hhcmFjdGVyaXN0aWNzID0gcmVhZFUyKHJhZik7Ci0JaW9oLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZlN0YWNrQ29tbWl0ID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSGVhcFJlc2VydmUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFwQ29tbWl0ID0gcmVhZDQocmFmKTsKLQlpb2guTG9hZGVyRmxhZ3MgPSByZWFkNChyYWYpOwotCWlvaC5OdW1iZXJPZlJ2YUFuZFNpemVzID0gcmVhZDQocmFmKTsKLQlmb3IgKGludCBpID0gMCA7IGkgPCBpb2guRGF0YURpcmVjdG9yeS5sZW5ndGg7IGkrKykgewotCQlpb2guRGF0YURpcmVjdG9yeVtpXSA9IG5ldyBJTUFHRV9EQVRBX0RJUkVDVE9SWSgpOwotCQlyZWFkKHJhZiwgaW9oLkRhdGFEaXJlY3RvcnlbaV0pOwotCX0KLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX05UX0hFQURFUlMgaW5oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWluaC5TaWduYXR1cmUgPSByZWFkNChyYWYpOwotCXJlYWQocmFmLCBpbmguRmlsZUhlYWRlcik7Ci0JcmVhZChyYWYsIGluaC5PcHRpb25hbEhlYWRlcik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9TRUNUSU9OX0hFQURFUiBpc2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgaXNoLk5hbWUubGVuZ3RoOyBpKyspIGlzaC5OYW1lW2ldID0gcmFmLnJlYWQoKTsKLQlpc2guTWlzY19WaXJ0dWFsU2l6ZSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlZpcnR1YWxBZGRyZXNzID0gcmVhZDQocmFmKTsKLQlpc2guU2l6ZU9mUmF3RGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb1Jhd0RhdGEgPSByZWFkNChyYWYpOwotCWlzaC5Qb2ludGVyVG9SZWxvY2F0aW9ucyA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb0xpbmVudW1iZXJzID0gcmVhZDQocmFmKTsKLQlpc2guTnVtYmVyT2ZSZWxvY2F0aW9ucyA9IHJlYWRVMihyYWYpOwotCWlzaC5OdW1iZXJPZkxpbmVudW1iZXJzID0gcmVhZFUyKHJhZik7Ci0JaXNoLkNoYXJhY3RlcmlzdGljcyA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgaXJkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlyZC5DaGFyYWN0ZXJpc3RpY3MgPSByZWFkNChyYWYpOwotCWlyZC5UaW1lRGF0ZVN0YW1wID0gcmVhZDQocmFmKTsKLQlpcmQuTWFqb3JWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaXJkLk1pbm9yVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlyZC5OdW1iZXJPZk5hbWVkRW50cmllcyA9IHJlYWRVMihyYWYpOwotCWlyZC5OdW1iZXJPZklkRW50cmllcyA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGlyZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkZS5OYW1lID0gcmVhZDQocmFmKTsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JLy8gY29uc3RydWN0IG90aGVyIHVuaW9uIG1lbWJlcnMKLQlpcmRlLk5hbWVPZmZzZXQgPSBpcmRlLk5hbWUgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLk5hbWVJc1N0cmluZyA9IChpcmRlLk5hbWUgJiAoMSA8PCAzMSkpICE9IDA7Ci0JaXJkZS5JZCA9IGlyZGUuTmFtZSAmIDB4RkZGRjsKLQlpcmRlLk9mZnNldFRvRGlyZWN0b3J5ID0gaXJkZS5PZmZzZXRUb0RhdGEgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLkRhdGFJc0RpcmVjdG9yeSA9IChpcmRlLk9mZnNldFRvRGF0YSAmICgxIDw8IDMxKSkgIT0gMDsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgaXJkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5TaXplID0gcmVhZDQocmFmKTsKLQlpcmRlLkNvZGVQYWdlID0gcmVhZDQocmFmKTsKLQlpcmRlLlJlc2VydmVkID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIE5FV0hFQURFUiBuaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQluaC5SZXNlcnZlZCA9IHJlYWRVMihyYWYpOwotCW5oLlJlc1R5cGUgPSByZWFkVTIocmFmKTsKLQluaC5SZXNDb3VudCA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSUNPTlJFU0RJUiBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWkuV2lkdGggPSByYWYucmVhZCgpOwotCWkuSGVpZ2h0ID0gcmFmLnJlYWQoKTsKLQlpLkNvbG9yQ291bnQgPSByYWYucmVhZCgpOwotCWkucmVzZXJ2ZWQgPSByYWYucmVhZCgpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQ1VSU09SRElSIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYy5XaWR0aCA9IHJlYWRVMihyYWYpOwotCWMuSGVpZ2h0ID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBSRVNESVIgcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JbG9uZyBzdGFydCA9IHJhZi5nZXRGaWxlUG9pbnRlcigpOwotCXJlYWQocmFmLCBycy5JY29uKTsKLQlyYWYuc2VlayhzdGFydCk7Ci0JcmVhZChyYWYsIHJzLkN1cnNvcik7Ci0JcnMuUGxhbmVzID0gcmVhZFUyKHJhZik7Ci0JcnMuQml0Q291bnQgPSByZWFkVTIocmFmKTsKLQlycy5CeXRlc0luUmVzID0gcmVhZDQocmFmKTsKLQlycy5JY29uQ3Vyc29ySWQgPSByZWFkVTIocmFmKTsKLX0KLQotLyogSW1hZ2VEYXRhIGFuZCBJbWFnZSBEZWNvZGVyIGlubGluaW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gU1dUIAotICogVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNhbiBiZSBlbnRpcmVseSByZW1vdmVkIGlmIFNXVCBjYW4gYmUgdXNlZC4KLSAqLwotCi1zdGF0aWMgY2xhc3MgUkdCIHsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCByZWQ7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCBncmVlbjsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIFJHQgotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZTsKLQkKLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxNTAyMzQ2MTI0OTA3NEw7Ci0JCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbgotICogcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHJlZCB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gZ3JlZW4gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gYmx1ZSB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBpbnN0YW5jZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKSB7Ci0JaWYgKChyZWQgPiAyNTUpIHx8IChyZWQgPCAwKSB8fAotCQkoZ3JlZW4gPiAyNTUpIHx8IChncmVlbiA8IDApIHx8Ci0JCShibHVlID4gMjU1KSB8fCAoYmx1ZSA8IDApKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl0aGlzLnJlZCA9IHJlZDsKLQl0aGlzLmdyZWVuID0gZ3JlZW47Ci0JdGhpcy5ibHVlID0gYmx1ZTsKLX0KLQotLyoqCi0gKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlCi0gKiBpZiB0aGV5IHJlcHJlc2VudCB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcwotICogc3BlY2lmaWMgY29tcGFyaXNvbi4KLSAqCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAqCi0gKiBAc2VlICNoYXNoQ29kZSgpCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyAoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUkdCKSkgcmV0dXJuIGZhbHNlOwotCVJHQiByZ2IgPSAoUkdCKW9iamVjdDsKLQlyZXR1cm4gKHJnYi5yZWQgPT0gdGhpcy5yZWQpICYmIChyZ2IuZ3JlZW4gPT0gdGhpcy5ncmVlbikgJiYgKHJnYi5ibHVlID09IHRoaXMuYmx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIAotICogb2JqZWN0cyB3aGljaCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gCi0gKiA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzCi0gKiBtZXRob2QuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gKgotICogQHNlZSAjZXF1YWxzKE9iamVjdCkKLSAqLwotcHVibGljIGludCBoYXNoQ29kZSAoKSB7Ci0JcmV0dXJuIChibHVlIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IHJlZDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPlJHQjwvY29kZT4KLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7Ci0JcmV0dXJuICJSR0IgeyIgKyByZWQgKyAiLCAiICsgZ3JlZW4gKyAiLCAiICsgYmx1ZSArICJ9IjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIAotCi0vLyROT04tTkxTLTQkCi19Ci0KLX0KLXN0YXRpYyBjbGFzcyBQYWxldHRlRGF0YSB7Ci0JCi0JLyoqCi0JICogdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBkaXJlY3QgcGFsZXR0ZSwgCi0JICogYW5kIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0OwotCQotCS8qKgotCSAqIHRoZSBSR0IgdmFsdWVzIGZvciBhbiBpbmRleGVkIHBhbGV0dGUsIHdoZXJlIHRoZQotCSAqIGluZGljZXMgb2YgdGhlIGFycmF5IGNvcnJlc3BvbmQgdG8gcGl4ZWwgdmFsdWVzCi0JICovCi0JcHVibGljIFJHQltdIGNvbG9yczsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IHJlZE1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBibHVlTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCByZWRTaGlmdDsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2hpZnQ7Ci0JCi0JLyoqCi0JICogdGhlIGJsdWUgc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGJsdWVTaGlmdDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluZGV4ZWQgcGFsZXR0ZSBnaXZlbiBhbiBhcnJheSBvZiBSR0IgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBjb2xvcnMgdGhlIGFycmF5IG9mIDxjb2RlPlJHQjwvY29kZT5zIGZvciB0aGUgcGFsZXR0ZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFBhbGV0dGVEYXRhKFJHQltdIGNvbG9ycykgewotCWlmIChjb2xvcnMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0aGlzLmNvbG9ycyA9IGNvbG9yczsKLQl0aGlzLmlzRGlyZWN0ID0gZmFsc2U7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldyBkaXJlY3QgcGFsZXR0ZSBnaXZlbiB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBtYXNrcy4KLSAqCi0gKiBAcGFyYW0gcmVkTWFzayB0aGUgcmVkIG1hc2sKLSAqIEBwYXJhbSBncmVlbk1hc2sgdGhlIGdyZWVuIG1hc2sKLSAqIEBwYXJhbSBibHVlTWFzayB0aGUgYmx1ZSBtYXNrCi0gKi8KLXB1YmxpYyBQYWxldHRlRGF0YShpbnQgcmVkTWFzaywgaW50IGdyZWVuTWFzaywgaW50IGJsdWVNYXNrKSB7Ci0JdGhpcy5yZWRNYXNrID0gcmVkTWFzazsKLQl0aGlzLmdyZWVuTWFzayA9IGdyZWVuTWFzazsKLQl0aGlzLmJsdWVNYXNrID0gYmx1ZU1hc2s7Ci0JdGhpcy5pc0RpcmVjdCA9IHRydWU7Ci0JdGhpcy5yZWRTaGlmdCA9IHNoaWZ0Rm9yTWFzayhyZWRNYXNrKTsKLQl0aGlzLmdyZWVuU2hpZnQgPSBzaGlmdEZvck1hc2soZ3JlZW5NYXNrKTsKLQl0aGlzLmJsdWVTaGlmdCA9IHNoaWZ0Rm9yTWFzayhibHVlTWFzayk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcGl4ZWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gPGNvZGU+UkJHPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gcmdiIHRoZSBSR0IgdG8gZ2V0IHRoZSBwaXhlbCB2YWx1ZSBmb3IKLSAqIEByZXR1cm4gdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgZ2l2ZW4gUkdCCi0gKiAKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgUkdCIGlzIG5vdCBmb3VuZCBpbiB0aGUgcGFsZXR0ZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFBpeGVsKFJHQiByZ2IpIHsKLQlpZiAocmdiID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGlzRGlyZWN0KSB7Ci0JCWludCBwaXhlbCA9IDA7Ci0JCXBpeGVsIHw9IChyZWRTaGlmdCA8IDAgPyByZ2IucmVkIDw8IC1yZWRTaGlmdCA6IHJnYi5yZWQgPj4+IHJlZFNoaWZ0KSAmIHJlZE1hc2s7Ci0JCXBpeGVsIHw9IChncmVlblNoaWZ0IDwgMCA/IHJnYi5ncmVlbiA8PCAtZ3JlZW5TaGlmdCA6IHJnYi5ncmVlbiA+Pj4gZ3JlZW5TaGlmdCkgJiBncmVlbk1hc2s7Ci0JCXBpeGVsIHw9IChibHVlU2hpZnQgPCAwID8gcmdiLmJsdWUgPDwgLWJsdWVTaGlmdCA6IHJnYi5ibHVlID4+PiBibHVlU2hpZnQpICYgYmx1ZU1hc2s7Ci0JCXJldHVybiBwaXhlbDsKLQl9IAotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGNvbG9yc1tpXS5lcXVhbHMocmdiKSkgcmV0dXJuIGk7Ci0JfQotCS8qIFRoZSBSR0IgZGlkIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZSAqLwotCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiA8Y29kZT5SR0I8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBpeGVsIHZhbHVlLgotICoKLSAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgdG8gZ2V0IHRoZSBSR0IgdmFsdWUgZm9yCi0gKiBAcmV0dXJuIHRoZSBSR0IgdmFsdWUgZm9yIHRoZSBnaXZlbiBwaXhlbAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgcGl4ZWwgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQiBnZXRSR0IoaW50IHBpeGVsKSB7Ci0JaWYgKGlzRGlyZWN0KSB7Ci0JCWludCByID0gcGl4ZWwgJiByZWRNYXNrOwotCQlyID0gKHJlZFNoaWZ0IDwgMCkgPyByID4+PiAtcmVkU2hpZnQgOiByIDw8IHJlZFNoaWZ0OwotCQlpbnQgZyA9IHBpeGVsICYgZ3JlZW5NYXNrOwotCQlnID0gKGdyZWVuU2hpZnQgPCAwKSA/IGcgPj4+IC1ncmVlblNoaWZ0IDogZyA8PCBncmVlblNoaWZ0OwotCQlpbnQgYiA9IHBpeGVsICYgYmx1ZU1hc2s7Ci0JCWIgPSAoYmx1ZVNoaWZ0IDwgMCkgPyBiID4+PiAtYmx1ZVNoaWZ0IDogYiA8PCBibHVlU2hpZnQ7Ci0JCXJldHVybiBuZXcgUkdCKHIsIGcsIGIpOwotCX0KLQlpZiAocGl4ZWwgPCAwIHx8IHBpeGVsID49IGNvbG9ycy5sZW5ndGgpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JcmV0dXJuIGNvbG9yc1twaXhlbF07Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbGwgdGhlIFJHQiB2YWx1ZXMgaW4gdGhlIHJlY2VpdmVyIGlmIGl0IGlzIGFuCi0gKiBpbmRleGVkIHBhbGV0dGUsIG9yIG51bGwgaWYgaXQgaXMgYSBkaXJlY3QgcGFsZXR0ZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSA8Y29kZT5SR0I8L2NvZGU+cyBmb3IgdGhlIHJlY2VpdmVyIG9yIG51bGwKLSAqLwotcHVibGljIFJHQltdIGdldFJHQnMoKSB7Ci0JcmV0dXJuIGNvbG9yczsKLX0KLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgc2hpZnQgdmFsdWUgZm9yIGEgZ2l2ZW4gbWFzay4KLSAqCi0gKiBAcGFyYW0gbWFzayB0aGUgbWFzayB0byBjb21wdXRlIHRoZSBzaGlmdCBmb3IKLSAqIEByZXR1cm4gdGhlIHNoaWZ0IGFtb3VudAotICoKLSAqIEBzZWUgUGFsZXR0ZURhdGEKLSAqLwotaW50IHNoaWZ0Rm9yTWFzayhpbnQgbWFzaykgewotCWZvciAoaW50IGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsgCi0JCWlmICgoKG1hc2sgPj4gaSkgJiAweDEpICE9IDApIHJldHVybiA3IC0gaTsKLQl9Ci0JcmV0dXJuIDMyOwotfQotCi19Ci1zdGF0aWMgY2xhc3MgSW1hZ2VMb2FkZXIgewotCQotCS8qKgotCSAqIHRoZSBhcnJheSBvZiBJbWFnZURhdGEgb2JqZWN0cyBpbiB0aGlzIEltYWdlTG9hZGVyLgotCSAqIFRoaXMgYXJyYXkgaXMgcmVhZCBpbiB3aGVuIHRoZSBsb2FkIG1ldGhvZCBpcyBjYWxsZWQsCi0JICogYW5kIGl0IGlzIHdyaXR0ZW4gb3V0IHdoZW4gdGhlIHNhdmUgbWV0aG9kIGlzIGNhbGxlZAotCSAqLwotCXB1YmxpYyBJbWFnZURhdGFbXSBkYXRhOwotCQotCS8qKgotCSAqIHRoZSB3aWR0aCBvZiB0aGUgbG9naWNhbCBzY3JlZW4gb24gd2hpY2ggdGhlIGltYWdlcwotCSAqIHJlc2lkZSwgaW4gcGl4ZWxzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBMb2dpY2FsIFNjcmVlbiBXaWR0aCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGxvZ2ljYWxTY3JlZW5XaWR0aDsKLQotCS8qKgotCSAqIHRoZSBoZWlnaHQgb2YgdGhlIGxvZ2ljYWwgc2NyZWVuIG9uIHdoaWNoIHRoZSBpbWFnZXMKLQkgKiByZXNpZGUsIGluIHBpeGVscyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhCi0JICogTG9naWNhbCBTY3JlZW4gSGVpZ2h0IHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgbG9naWNhbFNjcmVlbkhlaWdodDsKLQotCS8qKgotCSAqIHRoZSBiYWNrZ3JvdW5kIHBpeGVsIGZvciB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgCi0JICogY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YSBCYWNrZ3JvdW5kIENvbG9yIEluZGV4IHZhbHVlKS4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAndW5zcGVjaWZpZWQgYmFja2dyb3VuZCcKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGJhY2tncm91bmRQaXhlbDsKLQotCS8qKgotCSAqIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBkaXNwbGF5IG9mIGEgc2VxdWVuY2UKLQkgKiBvZiBhbmltYXRlZCBpbWFnZXMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNvbW1vbmx5LXVzZWQKLQkgKiBHSUYgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGZvciAiTkVUU0NBUEUgMi4wIDAxIikKLQkgKi8KLQlwdWJsaWMgaW50IHJlcGVhdENvdW50OwotCQkKLQkvKgotCSAqIHRoZSBzZXQgb2YgSW1hZ2VMb2FkZXIgZXZlbnQgbGlzdGVuZXJzLCBjcmVhdGVkIG9uIGRlbWFuZAotCSAqLwotCVZlY3RvciBpbWFnZUxvYWRlckxpc3RlbmVyczsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgSW1hZ2VMb2FkZXIuCi0gKi8KLXB1YmxpYyBJbWFnZUxvYWRlcigpIHsKLQlyZXNldCgpOwotfQotCi0vKioKLSAqIFJlc2V0cyB0aGUgZmllbGRzIG9mIHRoZSBJbWFnZUxvYWRlciwgZXhjZXB0IGZvciB0aGUKLSAqIDxjb2RlPmltYWdlTG9hZGVyTGlzdGVuZXJzPC9jb2RlPiBmaWVsZC4KLSAqLwotdm9pZCByZXNldCgpIHsKLQlkYXRhID0gbnVsbDsKLQlsb2dpY2FsU2NyZWVuV2lkdGggPSAwOwotCWxvZ2ljYWxTY3JlZW5IZWlnaHQgPSAwOwotCWJhY2tncm91bmRQaXhlbCA9IC0xOwotCXJlcGVhdENvdW50ID0gMTsKLX0KLQotLyoqCi0gKiBMb2FkcyBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUKLSAqIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFRocm93cyBhbiBlcnJvciBpZiBlaXRoZXIgYW4gZXJyb3IKLSAqIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBpbWFnZXMsIG9yIGlmIHRoZSBpbWFnZXMgYXJlIG5vdAotICogb2YgYSBzdXBwb3J0ZWQgdHlwZS4gUmV0dXJucyB0aGUgbG9hZGVkIGltYWdlIGRhdGEgYXJyYXkuCi0gKgotICogQHBhcmFtIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIGxvYWQgdGhlIGltYWdlcyBmcm9tCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmVhbSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gLSBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZChJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQlpZiAoc3RyZWFtID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmVzZXQoKTsKLQlkYXRhID0gRmlsZUZvcm1hdC5sb2FkKHN0cmVhbSwgdGhpcyk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogTG9hZHMgYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGZyb20gdGhlCi0gKiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgZWl0aGVyCi0gKiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgaW1hZ2VzLCBvciBpZiB0aGUgaW1hZ2VzIGFyZQotICogbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUuIFJldHVybnMgdGhlIGxvYWRlZCBpbWFnZSBkYXRhIGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIHRoZSBpbWFnZXMgZnJvbQotICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyAtIGlmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmb3JtYXQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YVtdIGxvYWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JaWYgKGZpbGVuYW1lID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCXJldHVybiBsb2FkKHN0cmVhbSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSBzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlIGVycm9yCi0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgSW1hZ2VEYXRhIHsKLQkKLQkvKioKLQkgKiBUaGUgd2lkdGggb2YgdGhlIGltYWdlLCBpbiBwaXhlbHMuCi0JICovCi0JcHVibGljIGludCB3aWR0aDsKLQotCS8qKgotCSAqIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLCBpbiBwaXhlbHMuCi0JICovCi0JcHVibGljIGludCBoZWlnaHQ7Ci0KLQkvKioKLQkgKiBUaGUgY29sb3IgZGVwdGggb2YgdGhlIGltYWdlLCBpbiBiaXRzIHBlciBwaXhlbC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgYSBkZXB0aCBvZiA4IG9yIGxlc3MgZG9lcyBub3QgbmVjZXNzYXJpbHkKLQkgKiBtZWFuIHRoYXQgdGhlIGltYWdlIGlzIHBhbGV0dGUgaW5kZXhlZCwgb3IKLQkgKiBjb252ZXJzZWx5IHRoYXQgYSBkZXB0aCBncmVhdGVyIHRoYW4gOCBtZWFucyB0aGF0Ci0JICogdGhlIGltYWdlIGlzIGRpcmVjdCBjb2xvci4gIENoZWNrIHRoZSBhc3NvY2lhdGVkCi0JICogUGFsZXR0ZURhdGEncyBpc0RpcmVjdCBmaWVsZCBmb3Igc3VjaCBkZXRlcm1pbmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgaW50IGRlcHRoOwotCi0JLyoqCi0JICogVGhlIHNjYW5saW5lIHBhZGRpbmcuCi0JICogPHA+Ci0JICogSWYgb25lIHNjYW5saW5lIG9mIHRoZSBpbWFnZSBpcyBub3QgYSBtdWx0aXBsZSBvZgotCSAqIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHVudGlsIGl0IGlzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5saW5lUGFkOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIG11bHRpcGxlIG9mIHRoZSBzY2FubGluZSBwYWRkaW5nLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGJ5dGVzUGVyTGluZTsKLQotCS8qKgotCSAqIFRoZSBwaXhlbCBkYXRhIG9mIHRoZSBpbWFnZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgZm9yIDE2IGJpdCBkZXB0aCBpbWFnZXMgdGhlIHBpeGVsIGRhdGEgaXMgc3RvcmVkCi0JICogaW4gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvcmRlcjsgaG93ZXZlciwgZm9yIDI0Yml0IGFuZAotCSAqIDMyYml0IGRlcHRoIGltYWdlcyB0aGUgcGl4ZWwgZGF0YSBpcyBzdG9yZWQgaW4gbW9zdAotCSAqIHNpZ25pZmljYW50IGJ5dGUgb3JkZXIuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBieXRlW10gZGF0YTsKLQotCS8qKgotCSAqIFRoZSBjb2xvciB0YWJsZSBmb3IgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBQYWxldHRlRGF0YSBwYWxldHRlOwotCi0JLyoqCi0JICogVGhlIHRyYW5zcGFyZW50IHBpeGVsLgotCSAqIDxwPgotCSAqIFBpeGVscyB3aXRoIHRoaXMgdmFsdWUgYXJlIHRyYW5zcGFyZW50LgotCSAqIDwvcD48cD4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAnbm8gdHJhbnNwYXJlbnQgcGl4ZWwnLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IHRyYW5zcGFyZW50UGl4ZWw7Ci0KLQkvKioKLQkgKiBBbiBpY29uLXNwZWNpZmljIGZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgZnJvbSB0aGUgaWNvbiBtYXNrLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSAxIGJpdCBiaXRtYXAgc3RvcmVkIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLQkgKiBiaXQgZmlyc3QuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZSBpcwotCSAqICcoKHdpZHRoICsgNykgLyA4ICsgKG1hc2tQYWQgLSAxKSkgLyBtYXNrUGFkICogbWFza1BhZCcuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIG51bGwgd2hpY2ggbWVhbnMgJ25vIHRyYW5zcGFyZW5jeSBtYXNrJy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBtYXNrRGF0YTsKLQotCS8qKgotCSAqIEFuIGljb24tc3BlY2lmaWMgZmllbGQgY29udGFpbmluZyB0aGUgc2NhbmxpbmUgcGFkIG9mIHRoZSBtYXNrLgotCSAqIDxwPgotCSAqIElmIG9uZSBzY2FubGluZSBvZiB0aGUgdHJhbnNwYXJlbmN5IG1hc2sgaXMgbm90IGEKLQkgKiBtdWx0aXBsZSBvZiB0aGlzIG51bWJlciwgaXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB1bnRpbAotCSAqIGl0IGlzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IG1hc2tQYWQ7Ci0JCi0JLyoqCi0JICogVGhlIGFscGhhIGRhdGEgb2YgdGhlIGltYWdlLgotCSAqIDxwPgotCSAqIEV2ZXJ5IHBpeGVsIGNhbiBoYXZlIGFuIDxlbT5hbHBoYSBibGVuZGluZzwvZW0+IHZhbHVlIHRoYXQKLQkgKiB2YXJpZXMgZnJvbSAwLCBtZWFuaW5nIGZ1bGx5IHRyYW5zcGFyZW50LCB0byAyNTUgbWVhbmluZwotCSAqIGZ1bGx5IG9wYXF1ZS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lIGlzCi0JICogJ3dpZHRoJy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBhbHBoYURhdGE7Ci0JCi0JLyoqCi0JICogVGhlIGdsb2JhbCBhbHBoYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBldmVyeSBwaXhlbC4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIHZhbHVlIGlzIHNldCwgdGhlIDxjb2RlPmFscGhhRGF0YTwvY29kZT4gZmllbGQKLQkgKiBpcyBpZ25vcmVkIGFuZCB3aGVuIHRoZSBpbWFnZSBpcyByZW5kZXJlZCBlYWNoIHBpeGVsCi0JICogd2lsbCBiZSBibGVuZGVkIHdpdGggdGhlIGJhY2tncm91bmQgYW4gYW1vdW50Ci0JICogcHJvcG9ydGlvbmFsIHRvIHRoaXMgdmFsdWUuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICdubyBnbG9iYWwgYWxwaGEgdmFsdWUnCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgYWxwaGE7Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiBmaWxlIGZyb20gd2hpY2ggdGhlIGltYWdlIHdhcyByZWFkLgotCSAqIAotCSAqIEl0IGlzIGV4cHJlc3NlZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0JICogPGRsPgotCSAqIDxkdD48Y29kZT5JTUFHRV9CTVA8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+V2luZG93cyBCTVAgZmlsZSBmb3JtYXQsIG5vIGNvbXByZXNzaW9uPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfQk1QX1JMRTwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIEJNUCBmaWxlIGZvcm1hdCwgUkxFIGNvbXByZXNzaW9uIGlmIGFwcHJvcHJpYXRlPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfR0lGPC9jb2RlPjwvZHQ+Ci0JICogPGRkPkdJRiBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0lDTzwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIElDTyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0pQRUc8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+SlBFRyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX1BORzwvY29kZT48L2R0PgotCSAqIDxkZD5QTkcgZmlsZSBmb3JtYXQ8L2RkPgotCSAqIDwvZGw+Ci0JICovCi0JcHVibGljIGludCB0eXBlOwotCi0JLyoqCi0JICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQotCSAqIHdpdGhpbiB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8KLQkgKiB0aGUgR0lGODlhIEltYWdlIExlZnQgUG9zaXRpb24gdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgeDsKLQotCS8qKgotCSAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UKLQkgKiB3aXRoaW4gdGhlIGxvZ2ljYWwgc2NyZWVuICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvCi0JICogdGhlIEdJRjg5YSBJbWFnZSBUb3AgUG9zaXRpb24gdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgeTsKLQotCS8qKgotCSAqIEEgZGVzY3JpcHRpb24gb2YgaG93IHRvIGRpc3Bvc2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2UKLQkgKiBiZWZvcmUgZGlzcGxheWluZyB0aGUgbmV4dC4KLQkgKiAKLQkgKiBJdCBpcyBleHByZXNzZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCSAqIDxkbD4KLQkgKiA8ZHQ+PGNvZGU+RE1fVU5TUEVDSUZJRUQ8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+ZGlzcG9zYWwgbWV0aG9kIG5vdCBzcGVjaWZpZWQ8L2RkPgotCSAqIDxkdD48Y29kZT5ETV9GSUxMX05PTkU8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+ZG8gbm90aGluZyAtIGxlYXZlIHRoZSBpbWFnZSBpbiBwbGFjZTwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfQkFDS0dST1VORDwvY29kZT48L2R0PgotCSAqIDxkZD5maWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3I8L2RkPgotCSAqIDxkdD48Y29kZT5ETV9GSUxMX1BSRVZJT1VTPC9jb2RlPjwvZHQ+Ci0JICogPGRkPnJlc3RvcmUgdGhlIHByZXZpb3VzIHBpY3R1cmU8L2RkPgotCSAqIDwvZGw+Ci0JICogKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YSBEaXNwb3NhbCBNZXRob2QgdmFsdWUpCi0JICovCi0JcHVibGljIGludCBkaXNwb3NhbE1ldGhvZDsKLQotCS8qKgotCSAqIFRoZSB0aW1lIHRvIGRlbGF5IGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0IGltYWdlCi0JICogaW4gYW4gYW5pbWF0aW9uICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBEZWxheSBUaW1lIHZhbHVlKS4KLQkgKi8KLQlwdWJsaWMgaW50IGRlbGF5VGltZTsKLQotCS8qKgotCSAqIEFyYml0cmFyeSBjaGFubmVsIHdpZHRoIGRhdGEgdG8gOC1iaXQgY29udmVyc2lvbiB0YWJsZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgYnl0ZVtdW10gQU5ZX1RPX0VJR0hUID0gbmV3IGJ5dGVbOV1bXTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBiID0gMDsgYiA8IDk7ICsrYikgewotCQkJYnl0ZVtdIGRhdGEgPSBBTllfVE9fRUlHSFRbYl0gPSBuZXcgYnl0ZVsxIDw8IGJdOwotCQkJaWYgKGIgPT0gMCkgY29udGludWU7Ci0JCQlpbnQgaW5jID0gMDsKLQkJCWZvciAoaW50IGJpdCA9IDB4MTAwMDA7IChiaXQgPj49IGIpICE9IDA7KSBpbmMgfD0gYml0OwotCQkJZm9yIChpbnQgdiA9IDAsIHAgPSAwOyB2IDwgMHgxMDAwMDsgdis9IGluYykgZGF0YVtwKytdID0gKGJ5dGUpKHYgPj4gOCk7Ci0JCX0KLQl9Ci0Jc3RhdGljIGZpbmFsIGJ5dGVbXSBPTkVfVE9fT05FX01BUFBJTkcgPSBBTllfVE9fRUlHSFRbOF07Ci0KLQkvKioKLQkgKiBTY2FsZWQgOHg4IEJheWVyIGRpdGhlciBtYXRyaXguCi0JICovCi0Jc3RhdGljIGZpbmFsIGludFtdW10gRElUSEVSX01BVFJJWCA9IHsKLQkJeyAweGZjMDAwMCwgMHg3YzAwMDAsIDB4ZGMwMDAwLCAweDVjMDAwMCwgMHhmNDAwMDAsIDB4NzQwMDAwLCAweGQ0MDAwMCwgMHg1NDAwMDAgfSwKLQkJeyAweDNjMDAwMCwgMHhiYzAwMDAsIDB4MWMwMDAwLCAweDljMDAwMCwgMHgzNDAwMDAsIDB4YjQwMDAwLCAweDE0MDAwMCwgMHg5NDAwMDAgfSwKLQkJeyAweGNjMDAwMCwgMHg0YzAwMDAsIDB4ZWMwMDAwLCAweDZjMDAwMCwgMHhjNDAwMDAsIDB4NDQwMDAwLCAweGU0MDAwMCwgMHg2NDAwMDAgfSwKLQkJeyAweDBjMDAwMCwgMHg4YzAwMDAsIDB4MmMwMDAwLCAweGFjMDAwMCwgMHgwNDAwMDAsIDB4ODQwMDAwLCAweDI0MDAwMCwgMHhhNDAwMDAgfSwKLQkJeyAweGYwMDAwMCwgMHg3MDAwMDAsIDB4ZDAwMDAwLCAweDUwMDAwMCwgMHhmODAwMDAsIDB4NzgwMDAwLCAweGQ4MDAwMCwgMHg1ODAwMDAgfSwKLQkJeyAweDMwMDAwMCwgMHhiMDAwMDAsIDB4MTAwMDAwLCAweDkwMDAwMCwgMHgzODAwMDAsIDB4YjgwMDAwLCAweDE4MDAwMCwgMHg5ODAwMDAgfSwKLQkJeyAweGMwMDAwMCwgMHg0MDAwMDAsIDB4ZTAwMDAwLCAweDYwMDAwMCwgMHhjODAwMDAsIDB4NDgwMDAwLCAweGU4MDAwMCwgMHg2ODAwMDAgfSwKLQkJeyAweDAwMDAwMCwgMHg4MDAwMDAsIDB4MjAwMDAwLCAweGEwMDAwMCwgMHgwODAwMDAsIDB4ODgwMDAwLCAweDI4MDAwMCwgMHhhODAwMDAgfQotCX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgSW1hZ2VEYXRhIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsCi0gKiBkZXB0aCBhbmQgcGFsZXR0ZS4gVGhlIGRhdGEgd2lsbCBiZSBpbml0aWFsaXplZCB0byBhbiAoYWxsIHplcm8pCi0gKiBhcnJheSBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZS4KLSAqCi0gKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBwYWxldHRlIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZSAobXVzdCBub3QgYmUgbnVsbCkKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUsIG9yIGlmIHRoZSBkZXB0aCBpcyBub3QKLSAqICAgICAgICAJb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYWxldHRlIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSkgewotCXRoaXMod2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUsCi0JCTQsIG51bGwsIDAsIG51bGwsCi0JCW51bGwsIC0xLCAtMSwgU1dULklNQUdFX1VOREVGSU5FRCwKLQkJMCwgMCwgMCwgMCk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgSW1hZ2VEYXRhIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsCi0gKiBkZXB0aCwgcGFsZXR0ZSwgc2NhbmxpbmVQYWQgYW5kIGRhdGEuCi0gKgotICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBkZXB0aCB0aGUgZGVwdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gcGFsZXR0ZSB0aGUgcGFsZXR0ZSBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBzY2FubGluZVBhZCB0aGUgcGFkZGluZyBvZiBlYWNoIGxpbmUsIGluIGJ5dGVzCi0gKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBvZiB0aGUgaW1hZ2UKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUsIG9yIGlmIHRoZSBkZXB0aCBpcyBub3QKLSAqICAgICAgICAJb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYWxldHRlIG9yIGRhdGEgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfQ0FOTk9UX0JFX1pFUk8gLSBpZiB0aGUgc2NhbmxpbmVQYWQgaXMgemVybzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLCBpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhKSB7Ci0JdGhpcyh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwKLQkJc2NhbmxpbmVQYWQsIGNoZWNrRGF0YShkYXRhKSwgMCwgbnVsbCwKLQkJbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gbG9hZGVkIGZyb20gYSBmaWxlIHdpdGggdGhlCi0gKiBzcGVjaWZpZWQgbmFtZS4gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIHRoZQotICogaW1hZ2UsIG9yIGlmIHRoZSBpbWFnZSBoYXMgYW4gdW5zdXBwb3J0ZWQgdHlwZS4KLSAqIDxwPgotICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2Ugd2hlbiBsb2FkaW5nIGEgc2luZ2xlCi0gKiBpbWFnZSBvbmx5LiBJZiB0aGUgZmlsZSBjb250YWlucyBtdWx0aXBsZSBpbWFnZXMsIG9ubHkgdGhlIGZpcnN0Ci0gKiBvbmUgd2lsbCBiZSBsb2FkZWQuIFRvIGxvYWQgbXVsdGlwbGUgaW1hZ2VzLCB1c2UgCi0gKiA8Y29kZT5JbWFnZUxvYWRlci5sb2FkKCk8L2NvZGU+LgotICogPC9wPgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIHRoZSBpbWFnZSBmcm9tIChtdXN0IG5vdCBiZSBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGZpbGUgbmFtZSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKFN0cmluZyBmaWxlbmFtZSkgewotCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VMb2FkZXIoKS5sb2FkKGZpbGVuYW1lKTsKLQlpZiAoZGF0YS5sZW5ndGggPCAxKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCUltYWdlRGF0YSBpID0gZGF0YVswXTsKLQlzZXRBbGxGaWVsZHMoCi0JCWkud2lkdGgsCi0JCWkuaGVpZ2h0LAotCQlpLmRlcHRoLAotCQlpLnNjYW5saW5lUGFkLAotCQlpLmJ5dGVzUGVyTGluZSwKLQkJaS5kYXRhLAotCQlpLnBhbGV0dGUsCi0JCWkudHJhbnNwYXJlbnRQaXhlbCwKLQkJaS5tYXNrRGF0YSwKLQkJaS5tYXNrUGFkLAotCQlpLmFscGhhRGF0YSwKLQkJaS5hbHBoYSwKLQkJaS50eXBlLAotCQlpLngsCi0JCWkueSwKLQkJaS5kaXNwb3NhbE1ldGhvZCwKLQkJaS5kZWxheVRpbWUpOwotfQotCi0vKioKLSAqIFByZXZlbnRzIHVuaW5pdGlhbGl6ZWQgaW5zdGFuY2VzIGZyb20gYmVpbmcgY3JlYXRlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLgotICovCi1JbWFnZURhdGEoKSB7Ci0JLy9lbXB0eSBjb25zdHJ1Y3RvcgotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gaW1hZ2UgZGF0YSBieSBnaXZpbmcgdmFsdWVzIGZvciBhbGwgbm9uLWNvbXB1dGFibGUgZmllbGRzLgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi1JbWFnZURhdGEoCi0JaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsCi0JaW50IHNjYW5saW5lUGFkLCBieXRlW10gZGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBtYXNrRGF0YSwKLQlieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsIGludCB0cmFuc3BhcmVudFBpeGVsLCBpbnQgdHlwZSwKLQlpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkKLXsKLQotCWlmIChwYWxldHRlID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKCEoZGVwdGggPT0gMSB8fCBkZXB0aCA9PSAyIHx8IGRlcHRoID09IDQgfHwgZGVwdGggPT0gOAotCQl8fCBkZXB0aCA9PSAxNiB8fCBkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKHNjYW5saW5lUGFkID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLQotCWludCBieXRlc1BlckxpbmUgPSAoKCh3aWR0aCAqIGRlcHRoICsgNykgLyA4KSArIChzY2FubGluZVBhZCAtIDEpKQotCQkvIHNjYW5saW5lUGFkICogc2NhbmxpbmVQYWQ7Ci0Jc2V0QWxsRmllbGRzKAotCQl3aWR0aCwKLQkJaGVpZ2h0LAotCQlkZXB0aCwKLQkJc2NhbmxpbmVQYWQsCi0JCWJ5dGVzUGVyTGluZSwKLQkJZGF0YSAhPSBudWxsID8gZGF0YSA6IG5ldyBieXRlW2J5dGVzUGVyTGluZSAqIGhlaWdodF0sCi0JCXBhbGV0dGUsCi0JCXRyYW5zcGFyZW50UGl4ZWwsCi0JCW1hc2tEYXRhLAotCQltYXNrUGFkLAotCQlhbHBoYURhdGEsCi0JCWFscGhhLAotCQl0eXBlLAotCQl4LAotCQl5LAotCQlkaXNwb3NhbE1ldGhvZCwKLQkJZGVsYXlUaW1lKTsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXplcyBhbGwgZmllbGRzIGluIHRoZSByZWNlaXZlci4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKLSAqIGJ5IGFsbCBwdWJsaWMgY29uc3RydWN0b3JzIHRvIGVuc3VyZSB0aGF0IGFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkCi0gKiBmb3IgYSBuZXcgSW1hZ2VEYXRhIG9iamVjdC4gSWYgYSBuZXcgZmllbGQgaXMgYWRkZWQgdG8gdGhlIGNsYXNzLAotICogdGhlbiBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoaXMgbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi12b2lkIHNldEFsbEZpZWxkcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHNjYW5saW5lUGFkLAotCWludCBieXRlc1BlckxpbmUsIGJ5dGVbXSBkYXRhLCBQYWxldHRlRGF0YSBwYWxldHRlLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwKLQlieXRlW10gbWFza0RhdGEsIGludCBtYXNrUGFkLCBieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsCi0JaW50IHR5cGUsIGludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKSB7Ci0KLQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JdGhpcy5kZXB0aCA9IGRlcHRoOwotCXRoaXMuc2NhbmxpbmVQYWQgPSBzY2FubGluZVBhZDsKLQl0aGlzLmJ5dGVzUGVyTGluZSA9IGJ5dGVzUGVyTGluZTsKLQl0aGlzLmRhdGEgPSBkYXRhOwotCXRoaXMucGFsZXR0ZSA9IHBhbGV0dGU7Ci0JdGhpcy50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQl0aGlzLm1hc2tEYXRhID0gbWFza0RhdGE7Ci0JdGhpcy5tYXNrUGFkID0gbWFza1BhZDsKLQl0aGlzLmFscGhhRGF0YSA9IGFscGhhRGF0YTsKLQl0aGlzLmFscGhhID0gYWxwaGE7Ci0JdGhpcy50eXBlID0gdHlwZTsKLQl0aGlzLnggPSB4OwotCXRoaXMueSA9IHk7Ci0JdGhpcy5kaXNwb3NhbE1ldGhvZCA9IGRpc3Bvc2FsTWV0aG9kOwotCXRoaXMuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotfQotCi0vKioJIAotICogSW52b2tlcyBpbnRlcm5hbCBTV1QgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YKLSAqIHRoaXMgY2xhc3MuCi0gKiA8cD4KLSAqIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLSAqIEFQSSBmb3IgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPi4gSXQgaXMgbWFya2VkIHB1YmxpYyBvbmx5IHNvIHRoYXQgaXQKLSAqIGNhbiBiZSBzaGFyZWQgd2l0aGluIHRoZSBwYWNrYWdlcyBwcm92aWRlZCBieSBTV1QuIEl0IGlzIHN1YmplY3QKLSAqIHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZnJvbQotICogYXBwbGljYXRpb24gY29kZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotcHVibGljIHN0YXRpYyBJbWFnZURhdGEgaW50ZXJuYWxfbmV3KAotCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLAotCWludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEsIGludCBtYXNrUGFkLCBieXRlW10gbWFza0RhdGEsCi0JYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwgaW50IHR5cGUsCi0JaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpCi17Ci0JcmV0dXJuIG5ldyBJbWFnZURhdGEoCi0JCXdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLCBzY2FubGluZVBhZCwgZGF0YSwgbWFza1BhZCwgbWFza0RhdGEsCi0JCWFscGhhRGF0YSwgYWxwaGEsIHRyYW5zcGFyZW50UGl4ZWwsIHR5cGUsIHgsIHksIGRpc3Bvc2FsTWV0aG9kLCBkZWxheVRpbWUpOwotfQotCi1JbWFnZURhdGEgY29sb3JNYXNrSW1hZ2UoaW50IHBpeGVsKSB7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDEsIGJ3UGFsZXR0ZSgpLAotCQkyLCBudWxsLCAwLCBudWxsLCBudWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotCWludFtdIHJvdyA9IG5ldyBpbnRbd2lkdGhdOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZ2V0UGl4ZWxzKDAsIHksIHdpZHRoLCByb3csIDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLQkJCWlmIChwaXhlbCAhPSAtMSAmJiByb3dbaV0gPT0gcGl4ZWwpIHsKLQkJCQlyb3dbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlyb3dbaV0gPSAxOwotCQkJfQotCQl9Ci0JCW1hc2suc2V0UGl4ZWxzKDAsIHksIHdpZHRoLCByb3csIDApOwotCX0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGJ5dGVbXSBjaGVja0RhdGEoYnl0ZSBbXSBkYXRhKSB7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPmdldFdpZHRoPC9jb2RlPiBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gKiA8Y29kZT54PC9jb2RlPiBpbiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncwotICogZGF0YSBzdGFydGluZyBhdCA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0gZ2V0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkYXRhIHRvIGdldAotICogQHBhcmFtIHBpeGVscyB0aGUgYnVmZmVyIGluIHdoaWNoIHRvIHB1dCB0aGUgcGl4ZWxzCi0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ5dGUgYXJyYXkgdG8gYmVnaW4gc3RvcmluZyBwaXhlbHMKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZ2V0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBnZXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCBvciA4Ci0gKiAgICAgICAgKEZvciBoaWdoZXIgZGVwdGhzLCB1c2UgdGhlIGludFtdIHZlcnNpb24gb2YgdGhpcyBtZXRob2QuKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgZ2V0V2lkdGgsIGJ5dGVbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yCi0KLShTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2sgPSAwOwotCWludCBuID0gZ2V0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHRoZUJ5dGUgJiBtYXNrKSA9PSAwKSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCWludCBvZmZzZXQ7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJb2Zmc2V0ID0gMyAtIChzcmNYICUgNCk7Ci0JCQltYXNrID0gMyA8PCAob2Zmc2V0ICogMik7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkoKHRoZUJ5dGUgJiBtYXNrKSA+PiAob2Zmc2V0ICogMikpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJaWYgKCh4ICYgMHgxKSA9PSAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgJiAweDBGKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQl3aGlsZSAobiA+IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSA+PiA0KTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgJiAweDBGKTsKLQkJCQlpKys7Ci0JCQkJbi0tOwotCQkJCXNyY1grKzsKLQkJCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCQlzcmNZKys7Ci0JCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQkJc3JjWCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgPj4gNCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gZGF0YVtpbmRleF07Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPmdldFdpZHRoPC9jb2RlPiBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gKiA8Y29kZT54PC9jb2RlPiBpbiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncwotICogZGF0YSBzdGFydGluZyBhdCA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0gZ2V0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkYXRhIHRvIGdldAotICogQHBhcmFtIHBpeGVscyB0aGUgYnVmZmVyIGluIHdoaWNoIHRvIHB1dCB0aGUgcGl4ZWxzCi0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciB0byBiZWdpbiBzdG9yaW5nIHBpeGVscwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBnZXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGdldFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggLSBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IGdldFdpZHRoLCBpbnRbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yCi0KLShTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBnZXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgodGhlQnl0ZSAmIG1hc2spID09IDApIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9CQkKLQlpZiAoZGVwdGggPT0gMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQlpbnQgb2Zmc2V0OwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW9mZnNldCA9IDMgLSAoc3JjWCAlIDQpOwotCQkJbWFzayA9IDMgPDwgKG9mZnNldCAqIDIpOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKCh0aGVCeXRlICYgbWFzaykgPj4gKG9mZnNldCAqIDIpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWlmICgoeCAmIDB4MSkgPT0gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgJiAweDBGOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXdoaWxlIChuID4gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgPj4gNDsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSAmIDB4MEY7Ci0JCQkJaSsrOwotCQkJCW4tLTsKLQkJCQlzcmNYKys7Ci0JCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQkJc3JjWSsrOwotCQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJCXNyY1ggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgPj4gNDsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDgpICsgKGRhdGFbaW5kZXhdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMjQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDMpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleF0gJiAweEZGKSA8PCAxNikgfCAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCA4KQotCQkJCXwgKGRhdGFbaW5kZXgrMl0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAzMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogNCk7Ci0JCWkgPSBzdGFydEluZGV4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleF0gJiAweEZGKSA8PCAyNCkgfCAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCAxNikKLQkJCQl8ICgoZGF0YVtpbmRleCsyXSAmIDB4RkYpIDw8IDgpIHwgKGRhdGFbaW5kZXgrM10gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gNDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgPGNvZGU+UkdCPC9jb2RlPnMgd2hpY2ggY29tcHJpc2UgdGhlCi0gKiBpbmRleGVkIGNvbG9yIHRhYmxlIG9mIHRoZSByZWNlaXZlciwgb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIKLSAqIGhhcyBhIGRpcmVjdCBjb2xvciBtb2RlbC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBSR0IgdmFsdWVzIGZvciB0aGUgaW1hZ2Ugb3IgbnVsbCBpZiBkaXJlY3QgY29sb3IKLSAqCi0gKiBAc2VlIFBhbGV0dGVEYXRhI2dldFJHQnMoKQotICovCi1wdWJsaWMgUkdCW10gZ2V0UkdCcygpIHsKLQlyZXR1cm4gcGFsZXR0ZS5nZXRSR0JzKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IHdoaWNoIHNwZWNpZmllcyB0aGUKLSAqIHRyYW5zcGFyZW5jeSBtYXNrIGluZm9ybWF0aW9uIGZvciB0aGUgcmVjZWl2ZXIsIG9yIG51bGwgaWYgdGhlCi0gKiByZWNlaXZlciBoYXMgbm8gdHJhbnNwYXJlbmN5IGFuZCBpcyBub3QgYW4gaWNvbi4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0cmFuc3BhcmVuY3kgbWFzayBvciBudWxsIGlmIG5vbmUgZXhpc3RzCi0gKi8KLXB1YmxpYyBJbWFnZURhdGEgZ2V0VHJhbnNwYXJlbmN5TWFzaygpIHsKLQlpZiAoZ2V0VHJhbnNwYXJlbmN5VHlwZSgpID09IFNXVC5UUkFOU1BBUkVOQ1lfTUFTSykgewotCQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAxLCBid1BhbGV0dGUoKSwgbWFza1BhZCwgbWFza0RhdGEpOwotCX0KLQlyZXR1cm4gY29sb3JNYXNrSW1hZ2UodHJhbnNwYXJlbnRQaXhlbCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgaW1hZ2UgdHJhbnNwYXJlbmN5IHR5cGUuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB0cmFuc3BhcmVuY3kgdHlwZQotICovCi1wdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeVR5cGUoKSB7Ci0JaWYgKG1hc2tEYXRhICE9IG51bGwpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX01BU0s7Ci0JaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX1BJWEVMOwotCWlmIChhbHBoYURhdGEgIT0gbnVsbCkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfQUxQSEE7Ci0JcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIG9mIHRoZSByZWNlaXZlci4KLSAqIAotICogQHJldHVybiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUCi0gKi8KLWludCBnZXRCeXRlT3JkZXIoKSB7Ci0JcmV0dXJuIGRlcHRoICE9IDE2ID8gTVNCX0ZJUlNUIDogTFNCX0ZJUlNUOwotfQotCi0vKioKLSAqIFNldHMgdGhlIHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+eDwvY29kZT4gaW4KLSAqIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzIGRhdGEgdG8gdGhlCi0gKiB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgPGNvZGU+cGl4ZWxzPC9jb2RlPiBzdGFydGluZyBhdAotICogPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHB1dFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHNldHRpbmcKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcHV0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBwdXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgKLSAqICAgICAgICAoRm9yIGhpZ2hlciBkZXB0aHMsIHVzZSB0aGUgaW50W10gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBwdXRXaWR0aCwgYnl0ZVtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gcHV0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHBpeGVsc1tpXSAmIDB4MSkgPT0gMSkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpIHwgbWFzayk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpICYgKG1hc2sgXiAtMSkpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJYnl0ZSBbXSBtYXNrcyA9IHsgKGJ5dGUpMHhGQywgKGJ5dGUpMHhGMywgKGJ5dGUpMHhDRiwgKGJ5dGUpMHgzRiB9OwotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQlpbnQgb2Zmc2V0ID0gMyAtICh4ICUgNCk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MzsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIG1hc2tzW29mZnNldF0pIHwgKHRoZUJ5dGUgPDwgKG9mZnNldCAqIDIpKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCW9mZnNldCA9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0LS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJYm9vbGVhbiBoaWdoID0gKHggJiAweDEpID09IDA7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MEY7Ci0JCQlpZiAoaGlnaCkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4MEYpIHwgKHRoZUJ5dGUgPDwgNCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEYwKSB8IHRoZUJ5dGUpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWhpZ2ggPSB0cnVlOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhpZ2gpIGluZGV4Kys7Ci0JCQkJaGlnaCA9ICFoaWdoOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsc1tpXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT54PC9jb2RlPiBpbgotICogc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MgZGF0YSB0byB0aGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBhcnJheSA8Y29kZT5waXhlbHM8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gKiA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0gcHV0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gc2V0dGluZwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwdXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHB1dFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBwdXRXaWR0aCwgaW50W10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBwdXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHBpeGVsOwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHBpeGVsc1tpXSAmIDB4MSkgPT0gMSkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpIHwgbWFzayk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpICYgKG1hc2sgXiAtMSkpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJYnl0ZSBbXSBtYXNrcyA9IHsgKGJ5dGUpMHhGQywgKGJ5dGUpMHhGMywgKGJ5dGUpMHhDRiwgKGJ5dGUpMHgzRiB9OwotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQlpbnQgb2Zmc2V0ID0gMyAtICh4ICUgNCk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MzsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIG1hc2tzW29mZnNldF0pIHwgKHRoZUJ5dGUgPDwgKG9mZnNldCAqIDIpKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJb2Zmc2V0ID0gMzsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCW9mZnNldCA9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0LS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJYm9vbGVhbiBoaWdoID0gKHggJiAweDEpID09IDA7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MEY7Ci0JCQlpZiAoaGlnaCkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4MEYpIHwgKHRoZUJ5dGUgPDwgNCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEYwKSB8IHRoZUJ5dGUpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWhpZ2ggPSB0cnVlOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhpZ2gpIGluZGV4Kys7Ci0JCQkJaGlnaCA9ICFoaWdoOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsc1tpXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgocGl4ZWwgPj4gMTYpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMl0gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAzMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogNCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgocGl4ZWwgPj4gMjQpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDE2KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDJdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDNdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgcGFsZXR0ZSB3aXRoIDIgY29sb3JzOiBibGFjayAmIHdoaXRlLgotICovCi1zdGF0aWMgUGFsZXR0ZURhdGEgYndQYWxldHRlKCkgewotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBmb3IKLSAqIHRoZSBnaXZlbiBtYXNrLgotICovCi1zdGF0aWMgaW50IGdldE1TQk9mZnNldChpbnQgbWFzaykgewotCWZvciAoaW50IGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKCgobWFzayA+PiBpKSAmIDB4MSkgIT0gMCkgcmV0dXJuIGkgKyAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaC4KLSAqLwotc3RhdGljIGludCBjbG9zZXN0TWF0Y2goaW50IGRlcHRoLCBieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlLCBpbnQgcmVkTWFzaywgaW50IGdyZWVuTWFzaywgaW50IGJsdWVNYXNrLCBieXRlW10gcmVkcywgYnl0ZVtdIGdyZWVucywgYnl0ZVtdIGJsdWVzKSB7Ci0JaWYgKGRlcHRoID4gOCkgewotCQlpbnQgcnNoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQocmVkTWFzayk7Ci0JCWludCBnc2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChncmVlbk1hc2spOwotCQlpbnQgYnNoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQoYmx1ZU1hc2spOwotCQlyZXR1cm4gKCgocmVkIDw8IDI0KSA+Pj4gcnNoaWZ0KSAmIHJlZE1hc2spIHwKLQkJCSgoKGdyZWVuIDw8IDI0KSA+Pj4gZ3NoaWZ0KSAmIGdyZWVuTWFzaykgfAotCQkJKCgoYmx1ZSA8PCAyNCkgPj4+IGJzaGlmdCkgJiBibHVlTWFzayk7Ci0JfQotCWludCByLCBnLCBiOwotCWludCBtaW5EaXN0YW5jZSA9IDB4N2ZmZmZmZmY7Ci0JaW50IG5lYXJlc3RQaXhlbCA9IDA7Ci0JaW50IG4gPSByZWRzLmxlbmd0aDsKLQlmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotCQlyID0gKHJlZHNbal0gJiAweEZGKSAtIChyZWQgJiAweEZGKTsKLQkJZyA9IChncmVlbnNbal0gJiAweEZGKSAtIChncmVlbiAmIDB4RkYpOwotCQliID0gKGJsdWVzW2pdICYgMHhGRikgLSAoYmx1ZSAmIDB4RkYpOwotCQlpbnQgZGlzdGFuY2UgPSByKnIgKyBnKmcgKyBiKmI7Ci0JCWlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7Ci0JCQluZWFyZXN0UGl4ZWwgPSBqOwotCQkJaWYgKGRpc3RhbmNlID09IDApIGJyZWFrOwotCQkJbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKLQkJfQotCX0KLQlyZXR1cm4gbmVhcmVzdFBpeGVsOwotfQotCi1zdGF0aWMgZmluYWwgSW1hZ2VEYXRhIGNvbnZlcnRNYXNrKEltYWdlRGF0YSBtYXNrKSB7Ci0JaWYgKG1hc2suZGVwdGggPT0gMSkgcmV0dXJuIG1hc2s7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LDI1NSwyNTUpfSk7Ci0JSW1hZ2VEYXRhIG5ld01hc2sgPSBuZXcgSW1hZ2VEYXRhKG1hc2sud2lkdGgsIG1hc2suaGVpZ2h0LCAxLCBwYWxldHRlKTsKLQkvKiBGaW5kIGluZGV4IG9mIGJsYWNrIGluIG1hc2sgcGFsZXR0ZSAqLwotCWludCBibGFja0luZGV4ID0gMDsKLQlSR0JbXSByZ2JzID0gbWFzay5nZXRSR0JzKCk7Ci0JaWYgKHJnYnMgIT0gbnVsbCkgewotCQl3aGlsZSAoYmxhY2tJbmRleCA8IHJnYnMubGVuZ3RoKSB7Ci0JCQlpZiAocmdic1tibGFja0luZGV4XS5lcXVhbHMocGFsZXR0ZS5jb2xvcnNbMF0pKSBicmVhazsKLQkJCWJsYWNrSW5kZXgrKzsKLQkJfQotCX0KLQlpbnRbXSBwaXhlbHMgPSBuZXcgaW50W21hc2sud2lkdGhdOwotCWZvciAoaW50IHkgPSAwOyB5IDwgbWFzay5oZWlnaHQ7IHkrKykgewotCQltYXNrLmdldFBpeGVscygwLCB5LCBtYXNrLndpZHRoLCBwaXhlbHMsIDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBpeGVsc1tpXSA9PSBibGFja0luZGV4KSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJfQotCQluZXdNYXNrLnNldFBpeGVscygwLCB5LCBtYXNrLndpZHRoLCBwaXhlbHMsIDApOwotCX0KLQlyZXR1cm4gbmV3TWFzazsKLX0KLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0UGFkKGJ5dGVbXSBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBhZCwgaW50IG5ld1BhZCkgewotCWlmIChwYWQgPT0gbmV3UGFkKSByZXR1cm4gZGF0YTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0JaW50IGJwbCA9IChzdHJpZGUgKyAocGFkIC0gMSkpIC8gcGFkICogcGFkOwkKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIHN0cmlkZSk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci0KLS8qKgotICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGZpbmFsIGludAotCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCUJMSVRfQUxQSEEgPSAyLCAgIC8vIGVuYWJsZSBhbHBoYSBibGVuZGluZwotCUJMSVRfRElUSEVSID0gNDsgIC8vIGVuYWJsZSBkaXRoZXJpbmcgaW4gbG93IGNvbG9yIG1vZGVzCi0KLS8qKgotICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLSAqLwotc3RhdGljIGZpbmFsIGludAotCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQlBTFBIQV9UUkFOU1BBUkVOVCA9IDAsICAgICAgICAvLyBGdWxseSB0cmFuc3BhcmVudCAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQlBTFBIQV9DSEFOTkVMX1NFUEFSQVRFID0gLTEsICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBmcm9tIHNlcGFyYXRlIGFscGhhRGF0YQotCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQlBTFBIQV9NQVNLX1VOUEFDS0VEID0gLTMsICAgICAvLyBVc2UgdHJhbnNwYXJlbmN5IG1hc2sgZm9ybWVkIGJ5IGJ5dGVzIGluIGFscGhhRGF0YSAobm9uLXplcm8gaXMgb3BhcXVlKQotCUFMUEhBX01BU0tfUEFDS0VEID0gLTQsICAgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgcGFja2VkIGJpdHMgaW4gYWxwaGFEYXRhCi0JQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQlBTFBIQV9NQVNLX1JHQiA9IC02OyAgICAgICAgICAvLyBDb25zaWRlciBzb3VyY2UgUkdCcyB0cmFuc3BhcmVudCBpZiBpbiBSR0I4ODggZm9ybWF0IGFscGhhRGF0YSBhcnJheQotCi0vKioKLSAqIEJ5dGUgYW5kIGJpdCBvcmRlciBjb25zdGFudHMuCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQotLyoqCi0gKiBEYXRhIHR5cGVzIChpbnRlcm5hbCkKLSAqLwotLyoKLXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCVRZUEVfR0VORVJJQ184ID0gMCwKLQlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQlUWVBFX0dFTkVSSUNfMjQgPSAzLAotCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCS8vIHBhbGV0dGUgaW5kZXhlZCBjb2xvciBmb3JtYXRzCi0JVFlQRV9JTkRFWF84ID0gNiwKLQlUWVBFX0lOREVYXzQgPSA3LAotCVRZUEVfSU5ERVhfMiA9IDgsCi0JVFlQRV9JTkRFWF8xX01TQiA9IDksCi0JVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotKi8KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFNoaWZ0KGludCBtYXNrKSB7Ci0JaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgKChtYXNrICYgMSkgPT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQltYXNrID4+Pj0gMTsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLSAqLwotc3RhdGljIGludCBnZXRDaGFubmVsV2lkdGgoaW50IG1hc2ssIGludCBzaGlmdCkgewotCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCWludCBpOwotCW1hc2sgPj4+PSBzaGlmdDsKLQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQltYXNrID4+Pj0gMTsKLQl9Ci0JcmV0dXJuIGkgLSBzaGlmdDsKLX0KLQotLyoqCi0gKiBFeHRyYWN0cyBhIGZpZWxkIGZyb20gcGFja2VkIFJHQiBkYXRhIGdpdmVuIGEgbWFzayBmb3IgdGhhdCBmaWVsZC4KLSAqLwotc3RhdGljIGJ5dGUgZ2V0Q2hhbm5lbEZpZWxkKGludCBkYXRhLCBpbnQgbWFzaykgewotCWZpbmFsIGludCBzaGlmdCA9IGdldENoYW5uZWxTaGlmdChtYXNrKTsKLQlyZXR1cm4gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChtYXNrLCBzaGlmdCldWyhkYXRhICYgbWFzaykgPj4+IHNoaWZ0XTsKLX0KLQotLyogCi0gKiBGaWxsIGluIGRpdGhlcmVkIGdyYWRhdGVkIHZhbHVlcyBmb3IgYSBjb2xvciBjaGFubmVsCi0gKi8KLXN0YXRpYyBmaW5hbCB2b2lkIGJ1aWxkRGl0aGVyZWRHcmFkaWVudENoYW5uZWwoaW50IGZyb20sIGludCB0bywgaW50IHN0ZXBzLAotCWludCBiYW5kV2lkdGgsIGludCBiYW5kSGVpZ2h0LCBib29sZWFuIHZlcnRpY2FsLAotCWJ5dGVbXSBiaXRtYXBEYXRhLCBpbnQgZHAsIGludCBieXRlc1BlckxpbmUsIGludCBiaXRzKSB7Ci0JZmluYWwgaW50IG1hc2sgPSAweGZmMDAgPj4+IGJpdHM7Ci0JaW50IHZhbCA9IGZyb20gPDwgMTY7Ci0JZmluYWwgaW50IGluYyA9ICgodG8gPDwgMTYpIC0gdmFsKSAvIHN0ZXBzICsgMTsKLQlpZiAodmVydGljYWwpIHsKLQkJZm9yIChpbnQgZHkgPSAwOyBkeSA8IGJhbmRIZWlnaHQ7ICsrZHksIGRwICs9IGJ5dGVzUGVyTGluZSkgewotCQkJZm9yIChpbnQgZHggPSAwLCBkcHRyID0gZHA7IGR4IDwgYmFuZFdpZHRoOyArK2R4LCBkcHRyICs9IDQpIHsKLQkJCQlmaW5hbCBpbnQgdGhyZXNoID0gRElUSEVSX01BVFJJWFtkeSAmIDddW2R4XSA+Pj4gYml0czsKLQkJCQlpbnQgdGVtcCA9IHZhbCArIHRocmVzaDsKLQkJCQlpZiAodGVtcCA+IDB4ZmZmZmZmKSBiaXRtYXBEYXRhW2RwdHJdID0gLTE7Ci0JCQkJZWxzZSBiaXRtYXBEYXRhW2RwdHJdID0gKGJ5dGUpKCh0ZW1wID4+PiAxNikgJiBtYXNrKTsKLQkJCX0KLQkJCXZhbCArPSBpbmM7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGludCBkeCA9IDA7IGR4IDwgYmFuZFdpZHRoOyArK2R4LCBkcCArPSA0KSB7Ci0JCQlmb3IgKGludCBkeSA9IDAsIGRwdHIgPSBkcDsgZHkgPCBiYW5kSGVpZ2h0OyArK2R5LCBkcHRyICs9IGJ5dGVzUGVyTGluZSkgewotCQkJCWZpbmFsIGludCB0aHJlc2ggPSBESVRIRVJfTUFUUklYW2R5XVtkeCAmIDddID4+PiBiaXRzOwotCQkJCWludCB0ZW1wID0gdmFsICsgdGhyZXNoOwotCQkJCWlmICh0ZW1wID4gMHhmZmZmZmYpIGJpdG1hcERhdGFbZHB0cl0gPSAtMTsKLQkJCQllbHNlIGJpdG1hcERhdGFbZHB0cl0gPSAoYnl0ZSkoKHRlbXAgPj4+IDE2KSAmIG1hc2spOwotCQkJfQotCQkJdmFsICs9IGluYzsKLQkJfQotCX0KLX0KLX0KLQotc3RhdGljIGNsYXNzIExFRGF0YUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCWludCBwb3NpdGlvbjsKLQlJbnB1dFN0cmVhbSBpbjsKLQotCS8qKgotCSAqIFRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBidWY7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZjwvY29kZT4uIEEgdmFsdWUKLQkgKiBlcXVhbCB0byBidWYubGVuZ3RoIGluZGljYXRlcyBubyBieXRlcyBhdmFpbGFibGUuICBBIHZhbHVlIG9mCi0JICogMCBpbmRpY2F0ZXMgdGhlIGJ1ZmZlciBpcyBmdWxsLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcG9zOwotCQotCi0JcHVibGljIExFRGF0YUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCXRoaXMoaW5wdXQsIDUxMik7Ci0JfQotCQotCXB1YmxpYyBMRURhdGFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgaW50IGJ1ZmZlclNpemUpIHsKLQkJdGhpcy5pbiA9IGlucHV0OwotCQlpZiAoYnVmZmVyU2l6ZSA+IDApIHsKLQkJCWJ1ZiA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwotCQkJcG9zID0gYnVmZmVyU2l6ZTsKLQkJfSAKLQkJZWxzZSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnVmID0gbnVsbDsKLQkJaWYgKGluICE9IG51bGwpIHsKLQkJCWluLmNsb3NlKCk7Ci0JCQlpbiA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlcnMgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyB3aXRob3V0IGJsb2NraW5nCi0JICovCi0JcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gKGJ1Zi5sZW5ndGggLSBwb3MpICsgaW4uYXZhaWxhYmxlKCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmV4dCBieXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJcG9zaXRpb24rKzsKLQkJaWYgKHBvcyA8IGJ1Zi5sZW5ndGgpIHJldHVybiAoYnVmW3BvcysrXSAmIDB4RkYpOwotCQlyZXR1cm4gaW4ucmVhZCgpOwotCX0KLQkKLQkvKioKLQkgKiBEb24ndCBpbWl0YXRlIHRoZSBKREsgYmVoYXZpb3VyIG9mIHJlYWRpbmcgYSByYW5kb20gbnVtYmVyCi0JICogb2YgYnl0ZXMgd2hlbiB5b3UgY2FuIGFjdHVhbGx5IHJlYWQgdGhlbSBhbGwuCi0JICovCi0JcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0OwotCQlpbnQgbGVmdCA9IGxlbjsKLQkJcmVzdWx0ID0gcmVhZERhdGEoYiwgb2ZmLCBsZW4pOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlc3VsdCA9PSAtMSkgcmV0dXJuIC0xOwotCQkJcG9zaXRpb24gKz0gcmVzdWx0OwotCQkJaWYgKHJlc3VsdCA9PSBsZWZ0KSByZXR1cm4gbGVuOwotCQkJbGVmdCAtPSByZXN1bHQ7Ci0JCQlvZmYgKz0gcmVzdWx0OwotCQkJcmVzdWx0ID0gcmVhZERhdGEoYiwgb2ZmLCBsZWZ0KTsKLQkJfQotCX0KLQkKLQkvKioKLSAJICogUmVhZHMgYXQgbW9zdCA8Y29kZT5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhpcyBMRURhdGFJbnB1dFN0cmVhbSBhbmQgCi0gCSAqIHN0b3JlcyB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+LgotIAkgKiA8cD4KLSAJICogQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIAotIAkgKiBlbmQgb2Ygc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4gIFRoaXMgaW1wbGVtZW50YXRpb24gcmVhZHMgYnl0ZXMgZnJvbSAKLSAJICogdGhlIHB1c2hiYWNrIGJ1ZmZlciBmaXJzdCwgdGhlbiB0aGUgdGFyZ2V0IHN0cmVhbSBpZiBtb3JlIGJ5dGVzIGFyZSByZXF1aXJlZAotIAkgKiB0byBzYXRpc2Z5IDxjb2RlPmNvdW50PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGJ1ZmZlciB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0JICoKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgotCSAqLwotCXByaXZhdGUgaW50IHJlYWREYXRhKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWYgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwKLSAgCQkgCWxlbmd0aCA8IDAgfHwgKGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpKSB7Ci0JIAkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQkgCX0KLQkJCQkKLQkJaW50IGNhY2hlQ29waWVkID0gMDsKLQkJaW50IG5ld09mZnNldCA9IG9mZnNldDsKLQkKLQkJLy8gQXJlIHRoZXJlIHB1c2hiYWNrIGJ5dGVzIGF2YWlsYWJsZT8KLQkJaW50IGF2YWlsYWJsZSA9IGJ1Zi5sZW5ndGggLSBwb3M7Ci0JCWlmIChhdmFpbGFibGUgPiAwKSB7Ci0JCQljYWNoZUNvcGllZCA9IChhdmFpbGFibGUgPj0gbGVuZ3RoKSA/IGxlbmd0aCA6IGF2YWlsYWJsZTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCBwb3MsIGJ1ZmZlciwgbmV3T2Zmc2V0LCBjYWNoZUNvcGllZCk7Ci0JCQluZXdPZmZzZXQgKz0gY2FjaGVDb3BpZWQ7Ci0JCQlwb3MgKz0gY2FjaGVDb3BpZWQ7Ci0JCX0KLQkKLQkJLy8gSGF2ZSB3ZSBjb3BpZWQgZW5vdWdoPwotCQlpZiAoY2FjaGVDb3BpZWQgPT0gbGVuZ3RoKSByZXR1cm4gbGVuZ3RoOwotCi0JCWludCBpbkNvcGllZCA9IGluLnJlYWQoYnVmZmVyLCBuZXdPZmZzZXQsIGxlbmd0aCAtIGNhY2hlQ29waWVkKTsKLQotCQlpZiAoaW5Db3BpZWQgPiAwKSByZXR1cm4gaW5Db3BpZWQgKyBjYWNoZUNvcGllZDsKLQkJaWYgKGNhY2hlQ29waWVkID09IDApIHJldHVybiBpbkNvcGllZDsKLQkJcmV0dXJuIGNhY2hlQ29waWVkOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYW4gaW50ZWdlciBjb21wcmlzZWQgb2YgdGhlIG5leHQKLQkgKiBmb3VyIGJ5dGVzIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIGludCByZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOwotCQlyZWFkKGJ1Zik7Ci0JCXJldHVybiAoKCgoKChidWZbM10gJiAweEZGKSA8PCA4KSB8IAotCQkJKGJ1ZlsyXSAmIDB4RkYpKSA8PCA4KSB8IAotCQkJKGJ1ZlsxXSAmIDB4RkYpKSA8PCA4KSB8IAotCQkJKGJ1ZlswXSAmIDB4RkYpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSBzaG9ydCBjb21wcmlzZWQgb2YgdGhlIG5leHQKLQkgKiB0d28gYnl0ZXMgb2YgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzJdOwotCQlyZWFkKGJ1Zik7Ci0JCXJldHVybiAoc2hvcnQpKCgoYnVmWzFdICYgMHhGRikgPDwgOCkgfCAoYnVmWzBdICYgMHhGRikpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIGJhY2sgdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBnaXZlbiBidWZmZXIgPGNvZGU+YjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhlIGJ5dGVzIGFyZSBwdXNoZWQgc28gdGhhdCB0aGV5IHdvdWxkIGJlIHJlYWQgYmFjayBiWzBdLCBiWzFdLCBldGMuIAotCSAqIElmIHRoZSBwdXNoIGJhY2sgYnVmZmVyIGNhbm5vdCBoYW5kbGUgdGhlIGJ5dGVzIGNvcGllZCBmcm9tIDxjb2RlPmI8L2NvZGU+LCAKLQkgKiBhbiBJT0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBhbmQgbm8gYnl0ZSB3aWxsIGJlIHB1c2hlZCBiYWNrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheSBjb250YWluaW5nIGJ5dGVzIHRvIHB1c2ggYmFjayBpbnRvIHRoZSBzdHJlYW0KLQkgKgotCSAqIEBleGNlcHRpb24gCWphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyB0b28gc21hbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBiLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA+IHBvcykgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCXBvc2l0aW9uIC09IGxlbmd0aDsKLQkJcG9zIC09IGxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBidWYsIHBvcywgbGVuZ3RoKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZpbGVGb3JtYXQgewkKLQlMRURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlJbWFnZUxvYWRlciBsb2FkZXI7Ci0JaW50IGNvbXByZXNzaW9uOwotCi1ieXRlW10gYml0SW52ZXJ0RGF0YShieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCS8vIERlc3RydWN0aXZlbHkgYml0IGludmVydCBkYXRhIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgotCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewotCQlkYXRhW2ldID0gKGJ5dGUpKDI1NSAtIGRhdGFbaSAtIHN0YXJ0SW5kZXhdKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCi0gKiByZXByZXNlbnRzIGEgc3VwcG9ydGVkIGZpbGUgZm9ybWF0LgotICovCi1hYnN0cmFjdCBib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pOwotCi1hYnN0cmFjdCBJbWFnZURhdGFbXSBsb2FkRnJvbUJ5dGVTdHJlYW0oKTsKLQotcHVibGljIEltYWdlRGF0YVtdIGxvYWRGcm9tU3RyZWFtKExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWlucHV0U3RyZWFtID0gc3RyZWFtOwotCQlyZXR1cm4gbG9hZEZyb21CeXRlU3RyZWFtKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBJbWFnZURhdGFbXSBsb2FkKElucHV0U3RyZWFtIGlzLCBJbWFnZUxvYWRlciBsb2FkZXIpIHsKLQlMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgTEVEYXRhSW5wdXRTdHJlYW0oaXMpOwotCWJvb2xlYW4gaXNTdXBwb3J0ZWQgPSBmYWxzZTsJCi0JRmlsZUZvcm1hdCBmaWxlRm9ybWF0ID0gbmV3IFdpbklDT0ZpbGVGb3JtYXQoKTsKLQlpZiAoZmlsZUZvcm1hdC5pc0ZpbGVGb3JtYXQoc3RyZWFtKSkgaXNTdXBwb3J0ZWQgPSB0cnVlOwotCWVsc2UgewotCQlmaWxlRm9ybWF0ID0gbmV3IFdpbkJNUEZpbGVGb3JtYXQoKTsKLQkJaWYgKGZpbGVGb3JtYXQuaXNGaWxlRm9ybWF0KHN0cmVhbSkpIGlzU3VwcG9ydGVkID0gdHJ1ZTsKLQl9Ci0JaWYgKCFpc1N1cHBvcnRlZCkgU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQpOwotCWZpbGVGb3JtYXQubG9hZGVyID0gbG9hZGVyOwotCXJldHVybiBmaWxlRm9ybWF0LmxvYWRGcm9tU3RyZWFtKHN0cmVhbSk7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgV2luQk1QRmlsZUZvcm1hdCBleHRlbmRzIEZpbGVGb3JtYXQgewotCXN0YXRpYyBmaW5hbCBpbnQgQk1QRmlsZUhlYWRlclNpemUgPSAxNDsKLQlzdGF0aWMgZmluYWwgaW50IEJNUEhlYWRlckZpeGVkU2l6ZSA9IDQwOwotCWludCBpbXBvcnRhbnRDb2xvcnM7Ci0KLXZvaWQgZGVjb21wcmVzc0RhdGEoYnl0ZVtdIHNyYywgYnl0ZVtdIGRlc3QsIGludCBzdHJpZGUsIGludCBjbXApIHsKLQlpZiAoY21wID09IDEpIHsgLy8gQk1QX1JMRThfQ09NUFJFU1NJT04KLQkJaWYgKGRlY29tcHJlc3NSTEU4RGF0YShzcmMsIHNyYy5sZW5ndGgsIHN0cmlkZSwgZGVzdCwgZGVzdC5sZW5ndGgpIDw9IDApCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjbXAgPT0gMikgeyAvLyBCTVBfUkxFNF9DT01QUkVTU0lPTgotCQlpZiAoZGVjb21wcmVzc1JMRTREYXRhKHNyYywgc3JjLmxlbmd0aCwgc3RyaWRlLCBkZXN0LCBkZXN0Lmxlbmd0aCkgPD0gMCkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLX0KLWludCBkZWNvbXByZXNzUkxFNERhdGEoYnl0ZVtdIHNyYywgaW50IG51bUJ5dGVzLCBpbnQgc3RyaWRlLCBieXRlW10gZGVzdCwgaW50IGRlc3RTaXplKSB7Ci0JaW50IHNwID0gMDsKLQlpbnQgc2UgPSBudW1CeXRlczsKLQlpbnQgZHAgPSAwOwotCWludCBkZSA9IGRlc3RTaXplOwotCWludCB4ID0gMCwgeSA9IDA7Ci0Jd2hpbGUgKHNwIDwgc2UpIHsKLQkJaW50IGxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQlzcCsrOwotCQlpZiAobGVuID09IDApIHsKLQkJCWxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQkJc3ArKzsKLQkJCXN3aXRjaCAobGVuKSB7Ci0JCQkJY2FzZSAwOiAvKiBlbmQgb2YgbGluZSAqLwotCQkJCQl5Kys7Ci0JCQkJCXggPSAwOwotCQkJCQlkcCA9IHkgKiBzdHJpZGU7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAvKiBlbmQgb2YgYml0bWFwICovCi0JCQkJCXJldHVybiAxOwotCQkJCWNhc2UgMjogLyogZGVsdGEgKi8KLQkJCQkJeCArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJeSArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJZHAgPSB5ICogc3RyaWRlICsgeCAvIDI7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogLyogYWJzb2x1dGUgbW9kZSBydW4gKi8KLQkJCQkJaWYgKChsZW4gJiAxKSAhPSAwKSAvKiBvZGQgcnVuIGxlbmd0aHMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJeCArPSBsZW47Ci0JCQkJCWxlbiA9IGxlbiAvIDI7Ci0JCQkJCWlmIChsZW4gPiAoc2UgLSBzcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQkJCWRlc3RbZHBdID0gc3JjW3NwXTsKLQkJCQkJCWRwKys7Ci0JCQkJCQlzcCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoc3AgJiAxKSAhPSAwKQotCQkJCQkJc3ArKzsgLyogd29yZCBhbGlnbiBzcD8gKi8KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKGxlbiAmIDEpICE9IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJeCArPSBsZW47Ci0JCQlsZW4gPSBsZW4gLyAyOwotCQkJYnl0ZSB0aGVCeXRlID0gc3JjW3NwXTsKLQkJCXNwKys7Ci0JCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCXJldHVybiAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlkZXN0W2RwXSA9IHRoZUJ5dGU7Ci0JCQkJZHArKzsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLWludCBkZWNvbXByZXNzUkxFOERhdGEoYnl0ZVtdIHNyYywgaW50IG51bUJ5dGVzLCBpbnQgc3RyaWRlLCBieXRlW10gZGVzdCwgaW50IGRlc3RTaXplKSB7Ci0JaW50IHNwID0gMDsKLQlpbnQgc2UgPSBudW1CeXRlczsKLQlpbnQgZHAgPSAwOwotCWludCBkZSA9IGRlc3RTaXplOwotCWludCB4ID0gMCwgeSA9IDA7Ci0Jd2hpbGUgKHNwIDwgc2UpIHsKLQkJaW50IGxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQlzcCsrOwotCQlpZiAobGVuID09IDApIHsKLQkJCWxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQkJc3ArKzsKLQkJCXN3aXRjaCAobGVuKSB7Ci0JCQkJY2FzZSAwOiAvKiBlbmQgb2YgbGluZSAqLwotCQkJCQl5Kys7Ci0JCQkJCXggPSAwOwotCQkJCQlkcCA9IHkgKiBzdHJpZGU7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAvKiBlbmQgb2YgYml0bWFwICovCi0JCQkJCXJldHVybiAxOwotCQkJCWNhc2UgMjogLyogZGVsdGEgKi8KLQkJCQkJeCArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJeSArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJZHAgPSB5ICogc3RyaWRlICsgeDsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlIHJ1biAqLwotCQkJCQlpZiAobGVuID4gKHNlIC0gc3ApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCQlkZXN0W2RwXSA9IHNyY1tzcF07Ci0JCQkJCQlkcCsrOwotCQkJCQkJc3ArKzsKLQkJCQkJfQotCQkJCQlpZiAoKHNwICYgMSkgIT0gMCkKLQkJCQkJCXNwKys7IC8qIHdvcmQgYWxpZ24gc3A/ICovCi0JCQkJCXggKz0gbGVuOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ5dGUgdGhlQnl0ZSA9IHNyY1tzcF07Ci0JCQlzcCsrOwotCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGVzdFtkcF0gPSB0aGVCeXRlOwotCQkJCWRwKys7Ci0JCQl9Ci0JCQl4ICs9IGxlbjsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLWJvb2xlYW4gaXNGaWxlRm9ybWF0KExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVsxOF07Ci0JCXN0cmVhbS5yZWFkKGhlYWRlcik7Ci0JCXN0cmVhbS51bnJlYWQoaGVhZGVyKTsKLQkJaW50IGluZm9IZWFkZXJTaXplID0gKGhlYWRlclsxNF0gJiAweEZGKSB8ICgoaGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpIHwgKChoZWFkZXJbMTZdICYgMHhGRikgPDwgMTYpIHwgKChoZWFkZXJbMTddICYgMHhGRikgPDwgMjQpOwotCQlyZXR1cm4gaGVhZGVyWzBdID09IDB4NDIgJiYgaGVhZGVyWzFdID09IDB4NEQgJiYgaW5mb0hlYWRlclNpemUgPj0gQk1QSGVhZGVyRml4ZWRTaXplOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1ieXRlW10gbG9hZERhdGEoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBiaXRDb3VudCArIDcpIC8gODsKLQlzdHJpZGUgPSAoc3RyaWRlICsgMykgLyA0ICogNDsgLy8gUm91bmQgdXAgdG8gNCBieXRlIG11bHRpcGxlCi0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShpbmZvSGVhZGVyLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBoZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotYnl0ZVtdIGxvYWREYXRhKGJ5dGVbXSBpbmZvSGVhZGVyLCBpbnQgc3RyaWRlKSB7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkYXRhU2l6ZSA9IGhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gKGluZm9IZWFkZXJbMTZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMThdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzE5XSAmIDB4RkYpIDw8IDI0KTsKLQlpZiAoY21wID09IDApIHsgLy8gQk1QX05PX0NPTVBSRVNTSU9OCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChkYXRhKSAhPSBkYXRhU2l6ZSkKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBjb21wcmVzc2VkU2l6ZSA9IChpbmZvSGVhZGVyWzIwXSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzIxXSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzIyXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsyM10gJiAweEZGKSA8PCAyNCk7Ci0JCWJ5dGVbXSBjb21wcmVzc2VkID0gbmV3IGJ5dGVbY29tcHJlc3NlZFNpemVdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoY29tcHJlc3NlZCkgIT0gY29tcHJlc3NlZFNpemUpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQkJZGVjb21wcmVzc0RhdGEoY29tcHJlc3NlZCwgZGF0YSwgc3RyaWRlLCBjbXApOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLWludFtdIGxvYWRGaWxlSGVhZGVyKCkgewotCWludFtdIGhlYWRlciA9IG5ldyBpbnRbNV07Ci0JdHJ5IHsKLQkJaGVhZGVyWzBdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclsxXSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaGVhZGVyWzJdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbNF0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKGhlYWRlclswXSAhPSAweDRENDIpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIGhlYWRlcjsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbG9hZEZpbGVIZWFkZXIoKTsKLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW0JNUEhlYWRlckZpeGVkU2l6ZV07Ci0JdHJ5IHsKLQkJaW5wdXRTdHJlYW0ucmVhZChpbmZvSGVhZGVyKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JaWYgKGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkgPCBmaWxlSGVhZGVyWzRdKSB7Ci0JCS8vIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLnNraXAoZmlsZUhlYWRlcls0XSAtIGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0KLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGluZm9IZWFkZXIpOwotCXRoaXMuY29tcHJlc3Npb24gPSAoaW5mb0hlYWRlclsxNl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxN10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxOF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTldICYgMHhGRikgPDwgMjQpOwotCXRoaXMuaW1wb3J0YW50Q29sb3JzID0gKGluZm9IZWFkZXJbMzZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzhdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM5XSAmIDB4RkYpIDw8IDI0KTsKLS8vCWludCB4UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMjZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzI3XSAmIDB4RkYpIDw8IDI0KTsKLS8vCWludCB5UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzMxXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgdHlwZSA9ICh0aGlzLmNvbXByZXNzaW9uID09IDEgLypCTVBfUkxFOF9DT01QUkVTU0lPTiovKSB8fCAodGhpcy5jb21wcmVzc2lvbiA9PSAyIC8qQk1QX1JMRTRfQ09NUFJFU1NJT04qLykgPyBTV1QuSU1BR0VfQk1QX1JMRSA6IFNXVC5JTUFHRV9CTVA7Ci0JcmV0dXJuIG5ldyBJbWFnZURhdGFbXSB7Ci0JCUltYWdlRGF0YS5pbnRlcm5hbF9uZXcoCi0JCQl3aWR0aCwKLQkJCWhlaWdodCwKLQkJCWJpdENvdW50LAotCQkJcGFsZXR0ZSwKLQkJCTQsCi0JCQlkYXRhLAotCQkJMCwKLQkJCW51bGwsCi0JCQludWxsLAotCQkJLTEsCi0JCQktMSwKLQkJCXR5cGUsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQkwKQotCX07Ci19Ci1QYWxldHRlRGF0YSBsb2FkUGFsZXR0ZShieXRlW10gaW5mb0hlYWRlcikgewotCWludCBkZXB0aCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCWludCBudW1Db2xvcnMgPSAoaW5mb0hlYWRlclszMl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclszM10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclszNF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMzVdICYgMHhGRikgPDwgMjQpOwotCQlpZiAobnVtQ29sb3JzID09IDApIHsKLQkJCW51bUNvbG9ycyA9IDEgPDwgZGVwdGg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobnVtQ29sb3JzID4gMjU2KQotCQkJCW51bUNvbG9ycyA9IDI1NjsKLQkJfQotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbnVtQ29sb3JzICogNF07Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChidWYpICE9IGJ1Zi5sZW5ndGgpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQkJcmV0dXJuIHBhbGV0dGVGcm9tQnl0ZXMoYnVmLCBudW1Db2xvcnMpOwotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHg3QzAwLCAweDNFMCwgMHgxRik7Ci0JaWYgKGRlcHRoID09IDI0KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYsIDB4RkYwMCwgMHhGRjAwMDApOwotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwLCAweEZGMDAwMCwgMHhGRjAwMDAwMCk7Ci19Ci1QYWxldHRlRGF0YSBwYWxldHRlRnJvbUJ5dGVzKGJ5dGVbXSBieXRlcywgaW50IG51bUNvbG9ycykgewotCWludCBieXRlc09mZnNldCA9IDA7Ci0JUkdCW10gY29sb3JzID0gbmV3IFJHQltudW1Db2xvcnNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JzOyBpKyspIHsKLQkJY29sb3JzW2ldID0gbmV3IFJHQihieXRlc1tieXRlc09mZnNldCArIDJdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0ICsgMV0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXRdICYgMHhGRik7Ci0JCWJ5dGVzT2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoY29sb3JzKTsKLX0KLS8qKgotICogQW5zd2VyIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBCTVAgcmVwcmVzZW50YXRpb24gb2YKLSAqIHRoZSBnaXZlbiBkZXZpY2UgaW5kZXBlbmRlbnQgcGFsZXR0ZS4KLSAqLwotc3RhdGljIGJ5dGVbXSBwYWxldHRlVG9CeXRlcyhQYWxldHRlRGF0YSBwYWwpIHsKLQlpbnQgbiA9IHBhbC5jb2xvcnMgPT0gbnVsbCA/IDAgOiAocGFsLmNvbG9ycy5sZW5ndGggPCAyNTYgPyBwYWwuY29sb3JzLmxlbmd0aCA6IDI1Nik7Ci0JYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbiAqIDRdOwotCWludCBvZmZzZXQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVJHQiBjb2wgPSBwYWwuY29sb3JzW2ldOwotCQlieXRlc1tvZmZzZXRdID0gKGJ5dGUpY29sLmJsdWU7Ci0JCWJ5dGVzW29mZnNldCArIDFdID0gKGJ5dGUpY29sLmdyZWVuOwotCQlieXRlc1tvZmZzZXQgKyAyXSA9IChieXRlKWNvbC5yZWQ7Ci0JCW9mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXZvaWQgZmxpcFNjYW5MaW5lcyhieXRlW10gZGF0YSwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkgewotCWludCBpMSA9IDA7Ci0JaW50IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspIHsKLQkJCWJ5dGUgYiA9IGRhdGFbaW5kZXggKyBpMV07Ci0JCQlkYXRhW2luZGV4ICsgaTFdID0gZGF0YVtpbmRleCArIGkyXTsKLQkJCWRhdGFbaW5kZXggKyBpMl0gPSBiOwotCQl9Ci0JCWkxICs9IHN0cmlkZTsKLQkJaTIgLT0gc3RyaWRlOwotCX0KLX0KLQotfQotCi1zdGF0aWMgY2xhc3MgV2luSUNPRmlsZUZvcm1hdCBleHRlbmRzIEZpbGVGb3JtYXQgewotCQotc3RhdGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0UGFkKGJ5dGVbXSBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBhZCwgaW50IG5ld1BhZCkgewotCWlmIChwYWQgPT0gbmV3UGFkKSByZXR1cm4gZGF0YTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0JaW50IGJwbCA9IChzdHJpZGUgKyAocGFkIC0gMSkpIC8gcGFkICogcGFkOwotCWludCBuZXdCcGwgPSAoc3RyaWRlICsgKG5ld1BhZCAtIDEpKSAvIG5ld1BhZCAqIG5ld1BhZDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2hlaWdodCAqIG5ld0JwbF07Ci0JaW50IHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgbmV3QnBsKTsKLQkJc3JjSW5kZXggKz0gYnBsOwotCQlkZXN0SW5kZXggKz0gbmV3QnBsOwotCX0KLQlyZXR1cm4gbmV3RGF0YTsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbgotICogaWNvbgotICovCi1pbnQgaWNvblNpemUoSW1hZ2VEYXRhIGkpIHsKLQlpbnQgc2hhcGVEYXRhU3RyaWRlID0gKGkud2lkdGggKiBpLmRlcHRoICsgMzEpIC8gMzIgKiA0OwotCWludCBtYXNrRGF0YVN0cmlkZSA9IChpLndpZHRoICsgMzEpIC8gMzIgKiA0OwotCWludCBkYXRhU2l6ZSA9IChzaGFwZURhdGFTdHJpZGUgKyBtYXNrRGF0YVN0cmlkZSkgKiBpLmhlaWdodDsKLQlpbnQgcGFsZXR0ZVNpemUgPSBpLnBhbGV0dGUuY29sb3JzICE9IG51bGwgPyBpLnBhbGV0dGUuY29sb3JzLmxlbmd0aCAqIDQgOiAwOwotCXJldHVybiBXaW5CTVBGaWxlRm9ybWF0LkJNUEhlYWRlckZpeGVkU2l6ZSArIHBhbGV0dGVTaXplICsgZGF0YVNpemU7Ci19Ci1ib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbNF07Ci0JCXN0cmVhbS5yZWFkKGhlYWRlcik7Ci0JCXN0cmVhbS51bnJlYWQoaGVhZGVyKTsKLQkJcmV0dXJuIGhlYWRlclswXSA9PSAwICYmIGhlYWRlclsxXSA9PSAwICYmIGhlYWRlclsyXSA9PSAxICYmIGhlYWRlclszXSA9PSAwOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1ib29sZWFuIGlzVmFsaWRJY29uKEltYWdlRGF0YSBpKSB7Ci0Jc3dpdGNoIChpLmRlcHRoKSB7Ci0JCWNhc2UgMToKLQkJY2FzZSA0OgotCQljYXNlIDg6Ci0JCQlpZiAoaS5wYWxldHRlLmlzRGlyZWN0KSByZXR1cm4gZmFsc2U7Ci0JCQlpbnQgc2l6ZSA9IGkucGFsZXR0ZS5jb2xvcnMubGVuZ3RoOwotCQkJcmV0dXJuIHNpemUgPT0gMiB8fCBzaXplID09IDE2IHx8IHNpemUgPT0gMzIgfHwgc2l6ZSA9PSAyNTY7Ci0JCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6Ci0JCQlyZXR1cm4gaS5wYWxldHRlLmlzRGlyZWN0OwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1pbnQgbG9hZEZpbGVIZWFkZXIoTEVEYXRhSW5wdXRTdHJlYW0gYnl0ZVN0cmVhbSkgewotCWludFtdIGZpbGVIZWFkZXIgPSBuZXcgaW50WzNdOwotCXRyeSB7Ci0JCWZpbGVIZWFkZXJbMF0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQlmaWxlSGVhZGVyWzFdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJZmlsZUhlYWRlclsyXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKChmaWxlSGVhZGVyWzBdICE9IDApIHx8IChmaWxlSGVhZGVyWzFdICE9IDEpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWludCBudW1JY29ucyA9IGZpbGVIZWFkZXJbMl07Ci0JaWYgKG51bUljb25zIDw9IDApCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIG51bUljb25zOwotfQotaW50IGxvYWRGaWxlSGVhZGVyKExFRGF0YUlucHV0U3RyZWFtIGJ5dGVTdHJlYW0sIGJvb2xlYW4gaGFzSGVhZGVyKSB7Ci0JaW50W10gZmlsZUhlYWRlciA9IG5ldyBpbnRbM107Ci0JdHJ5IHsKLQkJaWYgKGhhc0hlYWRlcikgewotCQkJZmlsZUhlYWRlclswXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQlmaWxlSGVhZGVyWzFdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVIZWFkZXJbMF0gPSAwOwotCQkJZmlsZUhlYWRlclsxXSA9IDE7Ci0JCX0KLQkJZmlsZUhlYWRlclsyXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKChmaWxlSGVhZGVyWzBdICE9IDApIHx8IChmaWxlSGVhZGVyWzFdICE9IDEpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWludCBudW1JY29ucyA9IGZpbGVIZWFkZXJbMl07Ci0JaWYgKG51bUljb25zIDw9IDApCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIG51bUljb25zOwotfQotSW1hZ2VEYXRhW10gbG9hZEZyb21CeXRlU3RyZWFtKCkgewotCWludCBudW1JY29ucyA9IGxvYWRGaWxlSGVhZGVyKGlucHV0U3RyZWFtKTsKLQlpbnRbXVtdIGhlYWRlcnMgPSBsb2FkSWNvbkhlYWRlcnMobnVtSWNvbnMpOwotCUltYWdlRGF0YVtdIGljb25zID0gbmV3IEltYWdlRGF0YVtoZWFkZXJzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykgewotCQlpY29uc1tpXSA9IGxvYWRJY29uKGhlYWRlcnNbaV0pOwotCX0KLQlyZXR1cm4gaWNvbnM7Ci19Ci0vKioKLSAqIExvYWQgb25lIGljb24gZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCi0gKi8KLUltYWdlRGF0YSBsb2FkSWNvbihpbnRbXSBpY29uSGVhZGVyKSB7Ci0JYnl0ZVtdIGluZm9IZWFkZXIgPSBsb2FkSW5mb0hlYWRlcihpY29uSGVhZGVyKTsKLQlXaW5CTVBGaWxlRm9ybWF0IGJtcEZvcm1hdCA9IG5ldyBXaW5CTVBGaWxlRm9ybWF0KCk7Ci0JYm1wRm9ybWF0LmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGJtcEZvcm1hdC5sb2FkUGFsZXR0ZShpbmZvSGVhZGVyKTsKLQlieXRlW10gc2hhcGVEYXRhID0gYm1wRm9ybWF0LmxvYWREYXRhKGluZm9IZWFkZXIpOwotCWludCB3aWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGRlcHRoID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaW5mb0hlYWRlclsxNF0gPSAxOwotCWluZm9IZWFkZXJbMTVdID0gMDsKLQlieXRlW10gbWFza0RhdGEgPSBibXBGb3JtYXQubG9hZERhdGEoaW5mb0hlYWRlcik7Ci0JbWFza0RhdGEgPSBjb252ZXJ0UGFkKG1hc2tEYXRhLCB3aWR0aCwgaGVpZ2h0LCAxLCA0LCAyKTsKLQliaXRJbnZlcnREYXRhKG1hc2tEYXRhLCAwLCBtYXNrRGF0YS5sZW5ndGgpOwotCXJldHVybiBJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQl3aWR0aCwKLQkJaGVpZ2h0LAotCQlkZXB0aCwKLQkJcGFsZXR0ZSwKLQkJNCwKLQkJc2hhcGVEYXRhLAotCQkyLAotCQltYXNrRGF0YSwKLQkJbnVsbCwKLQkJLTEsCi0JCS0xLAotCQlTV1QuSU1BR0VfSUNPLAotCQkwLAotCQkwLAotCQkwLAotCQkwKTsKLX0KLWludFtdW10gbG9hZEljb25IZWFkZXJzKGludCBudW1JY29ucykgewotCWludFtdW10gaGVhZGVycyA9IG5ldyBpbnRbbnVtSWNvbnNdWzddOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSWNvbnM7IGkrKykgewotCQkJaGVhZGVyc1tpXVswXSA9IGlucHV0U3RyZWFtLnJlYWQoKTsKLQkJCWhlYWRlcnNbaV1bMV0gPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQloZWFkZXJzW2ldWzJdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzNdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzRdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzVdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQkJaGVhZGVyc1tpXVs2XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCXJldHVybiBoZWFkZXJzOwotfQotYnl0ZVtdIGxvYWRJbmZvSGVhZGVyKGludFtdIGljb25IZWFkZXIpIHsKLQlpbnQgd2lkdGggPSBpY29uSGVhZGVyWzBdOwotCWludCBoZWlnaHQgPSBpY29uSGVhZGVyWzFdOwotCWludCBudW1Db2xvcnMgPSBpY29uSGVhZGVyWzJdOyAvLyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpcyBpbiB0aGUgbG93IGJ5dGUsIGJ1dCB0aGUgaGlnaCBieXRlIG11c3QgYmUgMAotCWlmIChudW1Db2xvcnMgPT0gMCkgbnVtQ29sb3JzID0gMjU2OyAvLyB0aGlzIGlzIHNwZWNpZmllZDogJzAwJyByZXByZXNlbnRzICcyNTYnICgweDEwMCkgY29sb3JzCi0JaWYgKChudW1Db2xvcnMgIT0gMikgJiYgKG51bUNvbG9ycyAhPSA4KSAmJiAobnVtQ29sb3JzICE9IDE2KSAmJgotCQkobnVtQ29sb3JzICE9IDMyKSAmJiAobnVtQ29sb3JzICE9IDI1NikpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaWYgKGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkgPCBpY29uSGVhZGVyWzZdKSB7Ci0JCS8vIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLnNraXAoaWNvbkhlYWRlcls2XSAtIGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbmV3IGJ5dGVbV2luQk1QRmlsZUZvcm1hdC5CTVBIZWFkZXJGaXhlZFNpemVdOwotCXRyeSB7Ci0JCWlucHV0U3RyZWFtLnJlYWQoaW5mb0hlYWRlcik7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKCgoaW5mb0hlYWRlclsxMl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxM10gJiAweEZGKSA8PCA4KSkgIT0gMSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgaW5mb1dpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBpbmZvSGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGJpdENvdW50ID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaWYgKGhlaWdodCA9PSBpbmZvSGVpZ2h0ICYmIGJpdENvdW50ID09IDEpIGhlaWdodCAvPSAyOwotCWlmICghKCh3aWR0aCA9PSBpbmZvV2lkdGgpICYmIChoZWlnaHQgKiAyID09IGluZm9IZWlnaHQpICYmCi0JCShiaXRDb3VudCA9PSAxIHx8IGJpdENvdW50ID09IDQgfHwgYml0Q291bnQgPT0gOCB8fCBiaXRDb3VudCA9PSAyNCB8fCBiaXRDb3VudCA9PSAzMikpKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbmZvSGVhZGVyWzhdID0gKGJ5dGUpKGhlaWdodCAmIDB4RkYpOwotCWluZm9IZWFkZXJbOV0gPSAoYnl0ZSkoKGhlaWdodCA+PiA4KSAmIDB4RkYpOwotCWluZm9IZWFkZXJbMTBdID0gKGJ5dGUpKChoZWlnaHQgPj4gMTYpICYgMHhGRik7Ci0JaW5mb0hlYWRlclsxMV0gPSAoYnl0ZSkoKGhlaWdodCA+PiAyNCkgJiAweEZGKTsKLQlyZXR1cm4gaW5mb0hlYWRlcjsKLX0KLX0KLXN0YXRpYyBjbGFzcyBTV1QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX0lDTyA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU8gPSAzOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lNQUdFID0gNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTlVMTF9BUkdVTUVOVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9BUkdVTUVOVCA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ0FOTk9UX0JFX1pFUk8gPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX1VOREVGSU5FRCA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIID0gMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX01BU0sgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfRk9STUFUID0gNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX0FMUEhBID0gMSA8PCAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9OT05FID0gMHgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9QSVhFTCA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9CTVAgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX0JNUF9STEUgPSAxOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgIitjb2RlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoaW50IGNvZGUsIFRocm93YWJsZSB0KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvR2VuZXJhdG9yVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9HZW5lcmF0b3JUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTNiZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9HZW5lcmF0b3JUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmFudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnMuRWNsaXBzZUluc3RhbGxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9ucy5Mb2NhbFVwZGF0ZVNpdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBBbnQgdGFzayB0byBjYWxsIHRoZSBwMiBNZXRhZGF0YSBHZW5lcmF0b3IgYXBwbGljYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRvclRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotCXByb3RlY3RlZCBQdWJsaXNoZXJJbmZvIHByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCXByb3RlY3RlZCBTdHJpbmcgbWV0YWRhdGFMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGFkYXRhUmVwb05hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBhcnRpZmFjdExvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgYXJ0aWZhY3RSZXBvTmFtZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlucGxhY2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXVzZVBhY2tlZEZpbGVzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbmZpZ3VyYXRpb25zOwotCXByb3RlY3RlZCBTdHJpbmcgbW9kZTsKLQlwcml2YXRlIEZpbGVbXSBidW5kbGVzOwotCXByaXZhdGUgRmlsZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3RGaWxlOwotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQlwcml2YXRlIFN0cmluZyBvcGVyYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uVmFsdWU7Ci0JcHJpdmF0ZSBib29sZWFuIGFkZERlZmF1bHRJVXM7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdDsKLQlwcml2YXRlIFN0cmluZyByb290VmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uQWR2aWNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgcm9vdE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0b3BMZXZlbDsKLQlwcml2YXRlIGJvb2xlYW4gc3RhcnQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBub25Sb290RmlsZXM7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaW5pdGlhbGl6ZShnZXRJbmZvKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gY29uZmlndXJlIHJlcG9zaXRvcmllcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY3JlYXRlVmVyc2lvbkFkdmljZSgpOwotCQlJUHVibGlzaGluZ0FjdGlvbltdIGFjdGlvbnMgPSBjcmVhdGVBY3Rpb25zKCk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbmV3IFB1Ymxpc2hlcihnZXRJbmZvKCkpLnB1Ymxpc2goYWN0aW9ucyk7Ci0KLQkJLy8gVE9ETyBoYWNrIGFzc2lnbm1lbnRzIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGZyb20gd2hpbmluZyBhYm91dCB0aGUgdW5yZWZlcmVuY2VkIHByaXZhdGVzLgotCQlPYmplY3QgbyA9IGJ1bmRsZXM7Ci0JCW8gPSBmZWF0dXJlczsKLQkJbyA9IHByb2R1Y3RGaWxlOwotCQlib29sZWFuIGIgPSBhZGREZWZhdWx0SVVzOwotCi0JCS8vCQl0cnkgewotCQkvLwkJCWlmICgiaW5jcmVtZW50YWwiLmVxdWFscyhtb2RlKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJLy8JCQkJCXJlc3VsdCA9IG5ldyBQdWJsaXNoZXJSZXN1bHQoKTsKLQkJLy8JCQkJZ2VuZXJhdG9yLnNldEluY3JlbWVudGFsUmVzdWx0KHJlc3VsdCk7Ci0JCS8vCQkJCWdlbmVyYXRvci5zZXRHZW5lcmF0b3JSb290SVUoZmFsc2UpOwotCQkvLwkJCX0gZWxzZSBpZiAoImZpbmFsIi5lcXVhbHMobW9kZSkgJiYgcmVzdWx0ICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQlnZW5lcmF0b3Iuc2V0SW5jcmVtZW50YWxSZXN1bHQocmVzdWx0KTsKLQkJLy8JCQkJZ2VuZXJhdG9yLnNldEdlbmVyYXRvclJvb3RJVSh0cnVlKTsKLQkJLy8JCQl9Ci0JCS8vCi0JCS8vCQkJZ2VuZXJhdG9yLnJ1bihwcm92aWRlcik7Ci0JCS8vCi0JCS8vCQkJaWYgKCEiaW5jcmVtZW50YWwiLmVxdWFscyhtb2RlKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCXByb3ZpZGVyID0gbnVsbDsKLQkJLy8JCQkJZ2VuZXJhdG9yID0gbnVsbDsKLQkJLy8JCQkJcmVzdWx0ID0gbnVsbDsKLQkJLy8JCQl9Ci0JCS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkvLwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihUYXNrTWVzc2FnZXMuZXhjZXB0aW9uX2Vycm9yT2NjdXJyZWRDYWxsaW5nR2VuZXJhdG9yLCBlKTsKLQkJLy8JCX0KLQl9Ci0KLQlwcml2YXRlIElQdWJsaXNoaW5nQWN0aW9uW10gY3JlYXRlQWN0aW9ucygpIHsKLQkJaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotCQkJLy8gVE9ETyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8KLQkJCXJldHVybiBuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7fTsKLQkJaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi11cGRhdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHtuZXcgTG9jYWxVcGRhdGVTaXRlQWN0aW9uKG9wZXJhdGlvblZhbHVlKX07Ci0JCWlmIChvcGVyYXRpb24uZXF1YWxzKCItc291cmNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE8gd2hhdCB0byBkbyBpbiB0aGlzIGNhc2U/Ci0JCQlyZXR1cm4gbmV3IElQdWJsaXNoaW5nQWN0aW9uW10ge25ldyBFY2xpcHNlSW5zdGFsbEFjdGlvbihvcGVyYXRpb25WYWx1ZSwgcm9vdCwgcm9vdFZlcnNpb24sIHJvb3ROYW1lLCBmbGF2b3IsIHRvcExldmVsLCBub25Sb290RmlsZXMsIHN0YXJ0KX07Ci0JCWlmIChvcGVyYXRpb24uZXF1YWxzKCItdXBkYXRlIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE8gd2hhdCB0byBkbyBpbiB0aGlzIGNhc2U/Ci0JCQlyZXR1cm4gbmV3IElQdWJsaXNoaW5nQWN0aW9uW10ge307Ci0JCWlmIChvcGVyYXRpb24uZXF1YWxzKCItdXBkYXRlIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE8gd2hhdCB0byBkbyBpbiB0aGlzIGNhc2U/Ci0JCQlyZXR1cm4gbmV3IElQdWJsaXNoaW5nQWN0aW9uW10ge307Ci0JCS8vIFRPRE8gd2hhdCB0byBkbyBpbiB0aGlzIGNhc2U/Ci0JCXJldHVybiBuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7fTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvbkFkdmljZSgpIHsKLQkJaWYgKHZlcnNpb25BZHZpY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gVE9ETyByZWFkIHRoZSB2ZXJzaW9uIGFkdmljZSBhbmQgYWRkIHRoZSBJVmVyc2lvbkFkdmljZQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKGlucGxhY2UpIHsKLQkJCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWV0YWRhdGFMb2NhdGlvbiA9PSBudWxsKQotCQkJCQltZXRhZGF0YUxvY2F0aW9uID0gbG9jYXRpb24udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCWlmIChhcnRpZmFjdExvY2F0aW9uID09IG51bGwpCi0JCQkJCWFydGlmYWN0TG9jYXRpb24gPSBsb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIG91Z2h0IG5vdCBoYXBwZW4uLi4KLQkJCX0KLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX0lOREVYIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKTsKLQkJfSBlbHNlCi0JCQlpbmZvLnNldEFydGlmYWN0T3B0aW9ucyhpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9JTkRFWCB8IElQdWJsaXNoZXJJbmZvLkFfUFVCTElTSCB8IElQdWJsaXNoZXJJbmZvLkFfT1ZFUldSSVRFKTsKLQkJaW5pdGlhbGl6ZVJlcG9zaXRvcmllcyhpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVwb3NpdG9yaWVzKFB1Ymxpc2hlckluZm8gaW5mbykgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWluZm8uc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFB1Ymxpc2hlci5jcmVhdGVBcnRpZmFjdFJlcG9zaXRvcnkoYXJ0aWZhY3RMb2NhdGlvbiwgYXJ0aWZhY3RSZXBvTmFtZSwgYXBwZW5kLCBjb21wcmVzcywgcmV1c2VQYWNrZWRGaWxlcykpOwotCQlpbmZvLnNldE1ldGFkYXRhUmVwb3NpdG9yeShQdWJsaXNoZXIuY3JlYXRlTWV0YWRhdGFSZXBvc2l0b3J5KG1ldGFkYXRhTG9jYXRpb24sIG1ldGFkYXRhUmVwb05hbWUsIGFwcGVuZCwgY29tcHJlc3MpKTsKLQl9Ci0KLQlwcml2YXRlIFB1Ymxpc2hlckluZm8gZ2V0SW5mbygpIHsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlwcm92aWRlciA9IG5ldyBQdWJsaXNoZXJJbmZvKCk7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcHBlbmQoU3RyaW5nIHZhbHVlKSB7Ci0JCWFwcGVuZCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFN0cmluZyBsb2NhdGlvbikgewotCQlhcnRpZmFjdExvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJYXJ0aWZhY3RSZXBvTmFtZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhc2UoU3RyaW5nIHZhbHVlKSB7Ci0JCXNvdXJjZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZXMoU3RyaW5nIHZhbHVlKSB7Ci0JCWJ1bmRsZXMgPSBuZXcgRmlsZVtdIHtuZXcgRmlsZSh2YWx1ZSl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXByZXNzKFN0cmluZyB2YWx1ZSkgewotCQljb21wcmVzcyA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKFN0cmluZyB2YWx1ZSkgewotCQlvcGVyYXRpb24gPSAiLWNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkJb3BlcmF0aW9uVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnBsYWNlKFN0cmluZyB2YWx1ZSkgewotCQlvcGVyYXRpb24gPSAiLWlucGxhY2UiOyAvLyROT04tTkxTLTEkCi0JCW9wZXJhdGlvblZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBsb2NhdGlvbikgewotCQlvcGVyYXRpb24gPSAiLXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkJb3BlcmF0aW9uVmFsdWUgPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlKFN0cmluZyB2YWx1ZSkgewotCQlvcGVyYXRpb24gPSAiLXVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJb3BlcmF0aW9uVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4ZShTdHJpbmcgdmFsdWUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlcyhTdHJpbmcgdmFsdWUpIHsKLQkJZmVhdHVyZXMgPSBuZXcgRmlsZVtdIHtuZXcgRmlsZSh2YWx1ZSl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgdmFsdWUpIHsKLQkJZmxhdm9yID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hlckNvbmZpZyhTdHJpbmcgdmFsdWUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCW1ldGFkYXRhTG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnlOYW1lKFN0cmluZyB2YWx1ZSkgewotCQltZXRhZGF0YVJlcG9OYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9EZWZhdWx0SVVzKFN0cmluZyB2YWx1ZSkgewotCQlhZGREZWZhdWx0SVVzID0gIUJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQMk9TKFN0cmluZyB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2R1Y3RGaWxlKFN0cmluZyBmaWxlKSB7Ci0JCXByb2R1Y3RGaWxlID0gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQXJ0aWZhY3RSZXBvc2l0b3J5KFN0cmluZyB2YWx1ZSkgewotCQlnZXRJbmZvKCkuc2V0QXJ0aWZhY3RPcHRpb25zKGdldEluZm8oKS5nZXRBcnRpZmFjdE9wdGlvbnMoKSB8IElQdWJsaXNoZXJJbmZvLkFfSU5ERVgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdHMoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluZm8oKS5zZXRBcnRpZmFjdE9wdGlvbnMoZ2V0SW5mbygpLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290KFN0cmluZyB2YWx1ZSkgewotCQlyb290ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdFZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXJvb3RWZXJzaW9uID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgdmFsdWUpIHsKLQkJbW9kZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25BZHZpY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCXZlcnNpb25BZHZpY2UgPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9UYXNrTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNzEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5hbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVGFza01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZXJyb3JPY2N1cnJlZENhbGxpbmdHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Vycm9yQXJ0aWZhY3RSZXBvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9lcnJvck1ldGFkYXRhUmVwbzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBUYXNrTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyZWIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1leGNlcHRpb25fZXJyb3JPY2N1cnJlZENhbGxpbmdHZW5lcmF0b3IgPSBBbiBlcnJvciBvY2N1cnJlZCB3aGVuIGNhbGxpbmcgZ2VuZXJhdG9yLgotZXhjZXB0aW9uX2Vycm9yQXJ0aWZhY3RSZXBvID0gRXJyb3Igc2V0dGluZyBhcnRpZmFjdCByZXBvc2l0b3J5IHswfS4KLWV4Y2VwdGlvbl9lcnJvck1ldGFkYXRhUmVwbyA9IEVycm9yIHNldHRpbmcgbWV0YWRhdGEgcmVwb3NpdG9yeSB7MH0uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3RlbXAuZm9sZGVyL2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4vb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvdGVtcC5mb2xkZXIvYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbi9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvVGFza01lc3NhZ2VzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDJmYTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvdGVtcC5mb2xkZXIvYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbi9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvVGFza01lc3NhZ2VzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNjYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWJkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDEwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI1NhdCBPY3QgMjcgMTQ6MTk6MjQgUERUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJjYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU4OjA3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0ZjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLkFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4zIiwKLSBvcmcueG1sLnNheAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlO2J1bmRsZS12ZXJzaW9uPSIwLjEuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjNjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGFlMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRHJvcGluIFJlY29uY2lsZXIgUGx1Zy1pbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjMmM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgIGlkPSJleHRlbnNpb25SZXBvc2l0b3J5IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS5tZXRhZGF0YVJlcG9zaXRvcmllcyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgIHN1ZmZpeD0iZWNsaXBzZSI+Ci0gICAgICA8L2ZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5hcnRpZmFjdFJlcG9zaXRvcmllcyI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIHN1ZmZpeD0iZWNsaXBzZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0J1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0J1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzMxMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9CdW5kbGVQb29sRmlsdGVyZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEJ1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyIGV4dGVuZHMgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciBkZWxlZ2F0ZTsKLQlwcml2YXRlIFNldCBidW5kbGVQb29sRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIEJ1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZGVsZWdhdGUgPSBsaXN0ZW5lcjsKLQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgYnVuZGxlUG9vbCA9IFV0aWwuZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkoQWN0aXZhdG9yLmdldEN1cnJlbnRQcm9maWxlKGNvbnRleHQpKTsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IGJ1bmRsZVBvb2wuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBhcnRpZmFjdEZpbGUgPSBidW5kbGVQb29sLmdldEFydGlmYWN0RmlsZShrZXlzW2ldKTsKLQkJCWlmIChhcnRpZmFjdEZpbGUgIT0gbnVsbCkKLQkJCQlidW5kbGVQb29sRmlsZXMuYWRkKGFydGlmYWN0RmlsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGRlbGVnYXRlLmFkZGVkKGZpbGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5jaGFuZ2VkKGZpbGUpOwotCX0KLQotCXB1YmxpYyBMb25nIGdldFNlZW5GaWxlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZGVsZWdhdGUuZ2V0U2VlbkZpbGUoZmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmVzdGVkKEZpbGUgZmlsZSkgewotCQlpZiAoYnVuZGxlUG9vbEZpbGVzLmNvbnRhaW5zKGZpbGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBkZWxlZ2F0ZS5pc0ludGVyZXN0ZWQoZmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlZChGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGRlbGVnYXRlLnJlbW92ZWQoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRQb2xsKCkgewotCQlkZWxlZ2F0ZS5zdGFydFBvbGwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wUG9sbCgpIHsKLQkJZGVsZWdhdGUuc3RvcFBvbGwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeS5BYnN0cmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT09MRUQgPSAiLnBvb2xlZCI7IC8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0VYVEVOU0lPTiA9ICJwcm9maWxlLmV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRSA9ICJlY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOUyA9ICJwbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBhcnRpZmFjdFJlcG9zaXRvcnk7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlzdXBlcigiRXh0ZW5zaW9uOiAiICsgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSwgbnVsbCwgbnVsbCwgbG9jYXRpb24sIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJRmlsZSBiYXNlID0gZ2V0QmFzZURpcmVjdG9yeShsb2NhdGlvbik7Ci0JCUZpbGUgcGx1Z2lucyA9IG5ldyBGaWxlKGJhc2UsIFBMVUdJTlMpOwotCQlGaWxlIGZlYXR1cmVzID0gbmV3IEZpbGUoYmFzZSwgRkVBVFVSRVMpOwotCi0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCVN0cmluZyBzdGF0ZURpck5hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkuaGFzaENvZGUoKSk7Ci0JCUZpbGUgYnVuZGxlRGF0YSA9IGNvbnRleHQuZ2V0RGF0YUZpbGUobnVsbCk7Ci0JCUZpbGUgc3RhdGVEaXIgPSBuZXcgRmlsZShidW5kbGVEYXRhLCBzdGF0ZURpck5hbWUpOwotCQlVUkwgbG9jYWxSZXBvc2l0b3J5VVJMOwotCQl0cnkgewotCQkJbG9jYWxSZXBvc2l0b3J5VVJMID0gc3RhdGVEaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHVuZXhwZWN0ZWQKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJGYWlsZWQgdG8gY3JlYXRlIGxvY2FsIHJlcG9zaXRvcnkiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFydGlmYWN0UmVwb3NpdG9yeSA9IChJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgaW5pdGlhbGl6ZUFydGlmYWN0UmVwb3NpdG9yeShsb2NhbFJlcG9zaXRvcnlVUkwsICJleHRlbnNpb24gbG9jYXRpb24gaW1wbGVtZW50YXRpb24gLSAiICsgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihuZXcgRmlsZVtdIHtwbHVnaW5zLCBmZWF0dXJlc30pOwotCQlEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBSZXBvc2l0b3J5TGlzdGVuZXIoY29udGV4dCwgbnVsbCwgYXJ0aWZhY3RSZXBvc2l0b3J5KTsKLQkJaWYgKGxvY2F0aW9uLmdldFBhdGgoKS5lbmRzV2l0aChQT09MRUQpKQotCQkJbGlzdGVuZXIgPSBuZXcgQnVuZGxlUG9vbEZpbHRlcmVkTGlzdGVuZXIoY29udGV4dCwgbGlzdGVuZXIpOwotCi0JCXdhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgaW5pdGlhbGl6ZUFydGlmYWN0UmVwb3NpdG9yeShVUkwgc3RhdGVEaXJVUkwsIFN0cmluZyByZXBvc2l0b3J5TmFtZSkgewotCQlTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGZhY3RvcnkubG9hZChzdGF0ZURpclVSTCwgbnVsbCk7Ci0KLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGZhY3RvcnkuY3JlYXRlKHN0YXRlRGlyVVJMLCByZXBvc2l0b3J5TmFtZSwgbnVsbCk7Ci0JCS8vcmVwb3NpdG9yeS5zZXRQcm9wZXJ0eShQUk9GSUxFX0VYVEVOU0lPTiwgInRydWUiKTsKLQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJZ2V0QmFzZURpcmVjdG9yeShsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEJhc2VEaXJlY3RvcnkoVVJMIHVybCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmICghRklMRS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCAibG9jYXRpb24gbXVzdCB1c2UgZmlsZSBwcm90b2NvbCIsIG51bGwpKTsKLQotCQlTdHJpbmcgcGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCUZpbGUgYmFzZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAocGF0aC5lbmRzV2l0aChQT09MRUQpKSB7Ci0JCQliYXNlID0gYmFzZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQotCQlpZiAoIWJhc2UuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG5vdCBhIGRpcmVjdG9yeSIsIG51bGwpKTsKLQotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGJhc2UpKQotCQkJcmV0dXJuIGJhc2U7Ci0KLQkJRmlsZSBlY2xpcHNlQmFzZSA9IG5ldyBGaWxlKGJhc2UsIEVDTElQU0UpOwotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGVjbGlwc2VCYXNlKSkKLQkJCXJldHVybiBlY2xpcHNlQmFzZTsKLQotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBpcyBub3QgYW4gZXh0ZW5zaW9uIiwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCYXNlRGlyZWN0b3J5KEZpbGUgYmFzZSkgewotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShiYXNlLCBQTFVHSU5TKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGJhc2UsIEZFQVRVUkVTKTsKLQotCQlyZXR1cm4gcGx1Z2lucy5pc0RpcmVjdG9yeSgpIHx8IGZlYXR1cmVzLmlzRGlyZWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcnMoSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmNvbnRhaW5zKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5jb250YWlucyhrZXkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdHMocmVxdWVzdHMsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0T3V0cHV0U3RyZWFtKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RGaWxlKGtleSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjYjkyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkudmFsaWRhdGUobG9jYXRpb24sIG1vbml0b3IpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWI1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LkFic3RyYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LlNpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElNZXRhZGF0YVJlcG9zaXRvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPT0xFRCA9ICIucG9vbGVkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFID0gImVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIElNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5OwotCi0JcHVibGljIEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIoIkV4dGVuc2lvbjogIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCksIG51bGwsIG51bGwsIGxvY2F0aW9uLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgYmFzZSA9IGdldEJhc2VEaXJlY3RvcnkobG9jYXRpb24pOwotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShiYXNlLCBQTFVHSU5TKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGJhc2UsIEZFQVRVUkVTKTsKLQotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlTdHJpbmcgc3RhdGVEaXJOYW1lID0gSW50ZWdlci50b1N0cmluZyhsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLmhhc2hDb2RlKCkpOwotCQlGaWxlIGJ1bmRsZURhdGEgPSBjb250ZXh0LmdldERhdGFGaWxlKG51bGwpOwotCQlGaWxlIHN0YXRlRGlyID0gbmV3IEZpbGUoYnVuZGxlRGF0YSwgc3RhdGVEaXJOYW1lKTsKLQkJVVJMIGxvY2FsUmVwb3NpdG9yeVVSTDsKLQkJdHJ5IHsKLQkJCWxvY2FsUmVwb3NpdG9yeVVSTCA9IHN0YXRlRGlyLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmV4cGVjdGVkCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRmFpbGVkIHRvIGNyZWF0ZSBsb2NhbCByZXBvc2l0b3J5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQltZXRhZGF0YVJlcG9zaXRvcnkgPSBpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2FsUmVwb3NpdG9yeVVSTCwgImV4dGVuc2lvbiBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiAtICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKG5ldyBGaWxlW10ge3BsdWdpbnMsIGZlYXR1cmVzfSk7Ci0JCURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcihjb250ZXh0LCBtZXRhZGF0YVJlcG9zaXRvcnksIG51bGwpOwotCQlpZiAobG9jYXRpb24uZ2V0UGF0aCgpLmVuZHNXaXRoKFBPT0xFRCkpCi0JCQlsaXN0ZW5lciA9IG5ldyBCdW5kbGVQb29sRmlsdGVyZWRMaXN0ZW5lcihjb250ZXh0LCBsaXN0ZW5lcik7Ci0KLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCX0KLQotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBzdGF0ZURpclVSTCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0JCVNpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5sb2FkKHN0YXRlRGlyVVJMLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZShzdGF0ZURpclVSTCwgcmVwb3NpdG9yeU5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIGluc3RhbGxhYmxlVW5pdHMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnN0YWxsYWJsZVVuaXRzKFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3RvciBxdWVyeShRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBtZXRhZGF0YVJlcG9zaXRvcnkucXVlcnkocXVlcnksIGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJZ2V0QmFzZURpcmVjdG9yeShsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEJhc2VEaXJlY3RvcnkoVVJMIHVybCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmICghRklMRS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCAibG9jYXRpb24gbXVzdCB1c2UgZmlsZSBwcm90b2NvbCIsIG51bGwpKTsKLQotCQlTdHJpbmcgcGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCUZpbGUgYmFzZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAocGF0aC5lbmRzV2l0aChQT09MRUQpKSB7Ci0JCQliYXNlID0gYmFzZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQotCQlpZiAoIWJhc2UuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG5vdCBhIGRpcmVjdG9yeSIsIG51bGwpKTsKLQotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGJhc2UpKQotCQkJcmV0dXJuIGJhc2U7Ci0KLQkJRmlsZSBlY2xpcHNlQmFzZSA9IG5ldyBGaWxlKGJhc2UsIEVDTElQU0UpOwotCQlpZiAoaXNCYXNlRGlyZWN0b3J5KGVjbGlwc2VCYXNlKSkKLQkJCXJldHVybiBlY2xpcHNlQmFzZTsKLQotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBpcyBub3QgYW4gZXh0ZW5zaW9uIiwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCYXNlRGlyZWN0b3J5KEZpbGUgYmFzZSkgewotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShiYXNlLCBQTFVHSU5TKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGJhc2UsIEZFQVRVUkVTKTsKLQotCQlyZXR1cm4gcGx1Z2lucy5pc0RpcmVjdG9yeSgpIHx8IGZlYXR1cmVzLmlzRGlyZWN0b3J5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LkFic3RyYWN0UmVwb3NpdG9yeSNnZXRQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCWlmIChtZXRhZGF0YVJlcG9zaXRvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBtZXRhZGF0YVJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRhMDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMgSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkgewotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgY3JlYXRlKFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgbG9hZChVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkobG9jYXRpb24sIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeS52YWxpZGF0ZShsb2NhdGlvbiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjA2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIGlkZWFzIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeVdhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QSU5TX0RJUkVDVE9SWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy5kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0lfQ09ORklHVVJBVElPTl9BUkVBID0gIm9zZ2kuY29uZmlndXJhdGlvbi5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QSU5TID0gImRyb3BpbnMiOyAvLyROT04tTkxTLTEkCi0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfRVhURU5TSU9OID0gInByb2ZpbGUuZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW47Ci0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWY7Ci0JcHJpdmF0ZSBMaXN0IHdhdGNoZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnlbXSBkcm9waW5SZXBvc2l0b3JpZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeVtdIGNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeVtdIGxpbmtzUmVwb3NpdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZWNsaXBzZVByb2R1Y3RSZXBvc2l0b3J5OwotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBsb2FkIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgbG9hZE1ldGFkYXRhUmVwb3NpdG9yeShVUkwgcmVwb1VSTCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9VUkwsIG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gbG9hZCBhbiBhcnRpZmFjdCByZXBvc2l0b3J5IGZyb20gdGhlIGdpdmVuIFVSTC4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZEFydGlmYWN0UmVwb3NpdG9yeShVUkwgcmVwb1VSTCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9VUkwsIG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGFja2FnZUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlzZXRQYWNrYWdlQWRtaW4oKFBhY2thZ2VBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZikpOwotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQotCQlpZiAoIXN0YXJ0RWFybHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQlpZiAoIXN0YXJ0RWFybHkoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJaWYgKCFzdGFydEVhcmx5KCJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0Q3VycmVudFByb2ZpbGUoY29udGV4dCk7Ci0JCWlmIChwcm9maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY3JlYXRlIGEgd2F0Y2hlciBmb3IgdGhlIG1haW4gcGx1Z2lucyBhbmQgZmVhdHVyZXMgZGlyZWN0b3JpZXMKLQkJd2F0Y2hFY2xpcHNlUHJvZHVjdCgpOwotCQkvLyBjcmVhdGUgdGhlIHdhdGNoZXIgZm9yIHRoZSAiZHJvcC1pbnMiIGZvbGRlcgotCQl3YXRjaERyb3BpbnMocHJvZmlsZSk7Ci0JCS8vIGtlZXAgYW4gZXllIG9uIHRoZSBwbGF0Zm9ybS54bWwKLQkJaWYgKGZhbHNlKQotCQkJd2F0Y2hDb25maWd1cmF0aW9uKCk7Ci0KLQkJc3luY2hyb25pemUobmV3IEFycmF5TGlzdCgwKSwgbnVsbCk7Ci0KLQkJLy8gd2Ugc2hvdWxkIHByb2JhYmx5IGJlICBob2xkaW5nIG9uIHRvIHRoZXNlIHJlcG9zIGJ5IFVSTAotCQkvLyBzZWUgQnVnIDIyMzQyMgotCQkvLyBmb3Igbm93IGV4cGxpY2l0bHkgbnVsbGluZyBvdXQgdGhlc2UgcmVwb3MgdG8gYWxsb3cgR0MgdG8gb2NjdXIKLQkJZHJvcGluUmVwb3NpdG9yaWVzID0gbnVsbDsKLQkJY29uZmlndXJhdGlvblJlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWxpbmtzUmVwb3NpdG9yaWVzID0gbnVsbDsKLQkJZWNsaXBzZVByb2R1Y3RSZXBvc2l0b3J5ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2F0Y2hFY2xpcHNlUHJvZHVjdCgpIHsKLQotCQlVUkwgYmFzZVVSTDsKLQkJdHJ5IHsKLQkJCWJhc2VVUkwgPSBuZXcgVVJMKGJ1bmRsZUNvbnRleHQuZ2V0UHJvcGVydHkoT1NHSV9DT05GSUdVUkFUSU9OX0FSRUEpKTsKLQkJCVVSTCBwb29sZWRVUkwgPSBuZXcgVVJMKGJhc2VVUkwsICIuLi8ucG9vbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvYWRBcnRpZmFjdFJlcG9zaXRvcnkocG9vbGVkVVJMKTsKLQkJCWVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeSA9IGxvYWRNZXRhZGF0YVJlcG9zaXRvcnkocG9vbGVkVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gcHJvcGVyIGxvZ2dpbmcKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIHByb3BlciBsb2dnaW5nCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRFYXJseShTdHJpbmcgYnVuZGxlTmFtZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoYnVuZGxlTmFtZSk7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJYnVuZGxlLnN0YXJ0KEJ1bmRsZS5TVEFSVF9UUkFOU0lFTlQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFN5bmNocm9uaXplIHRoZSBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3luY2hyb25pemUoTGlzdCBleHRyYVJlcG9zaXRvcmllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBnZXRDdXJyZW50UHJvZmlsZShidW5kbGVDb250ZXh0KTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gY3JlYXRlIHRoZSBwcm9maWxlIHN5bmNocm9uaXplciBvbiBhbGwgYXZhaWxhYmxlIHJlcG9zaXRvcmllcwotCQlTZXQgcmVwb3NpdG9yaWVzID0gbmV3IEhhc2hTZXQoZXh0cmFSZXBvc2l0b3JpZXMpOwotCQlpZiAoZHJvcGluUmVwb3NpdG9yaWVzICE9IG51bGwpCi0JCQlyZXBvc2l0b3JpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZHJvcGluUmVwb3NpdG9yaWVzKSk7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXMgIT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWd1cmF0aW9uUmVwb3NpdG9yaWVzKSk7Ci0KLQkJaWYgKGxpbmtzUmVwb3NpdG9yaWVzICE9IG51bGwpCi0JCQlyZXBvc2l0b3JpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobGlua3NSZXBvc2l0b3JpZXMpKTsKLQotCQlpZiAoZWNsaXBzZVByb2R1Y3RSZXBvc2l0b3J5ICE9IG51bGwpCi0JCQlyZXBvc2l0b3JpZXMuYWRkKGVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeSk7Ci0KLQkJUHJvZmlsZVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgUHJvZmlsZVN5bmNocm9uaXplcihwcm9maWxlLCByZXBvc2l0b3JpZXMpOwotCQlJU3RhdHVzIHJlc3VsdCA9IHN5bmNocm9uaXplci5zeW5jaHJvbml6ZShtb25pdG9yKTsKLQkJaWYgKCFyZXN1bHQuaXNPSygpKQotCQkJTG9nSGVscGVyLmxvZyhyZXN1bHQpOwotCi0JfQotCi0JLyoKLQkgKiBXYXRjaCB0aGUgcGxhdGZvcm0ueG1sIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhdGNoQ29uZmlndXJhdGlvbigpIHsKLQkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoImNvbmZpZ3VyYXRpb24vb3JnLmVjbGlwc2UudXBkYXRlL3BsYXRmb3JtLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKGNvbmZpZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtWG1sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGxhdGZvcm1YbWxMaXN0ZW5lcihjb25maWdGaWxlKTsKLQkJCXdhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJd2F0Y2hlci5wb2xsKCk7Ci0JCQlMaXN0IHJlcG9zaXRvcmllcyA9IGxpc3RlbmVyLmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCk7Ci0JCQlpZiAocmVwb3NpdG9yaWVzICE9IG51bGwpCi0JCQkJY29uZmlndXJhdGlvblJlcG9zaXRvcmllcyA9IChJTWV0YWRhdGFSZXBvc2l0b3J5W10pIHJlcG9zaXRvcmllcy50b0FycmF5KG5ldyBJTWV0YWRhdGFSZXBvc2l0b3J5WzBdKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gcHJvcGVyIGxvZ2dpbmcKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhIG5ldyBkaXJlY3Rvcnkgd2F0Y2hlciB3aXRoIGEgcmVwb3NpdG9yeSBsaXN0ZW5lciBvbiB0aGUgZHJvcC1pbnMgZm9sZGVyLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2F0Y2hEcm9waW5zKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJTGlzdCBkaXJlY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSBkcm9waW5zRGlyZWN0b3J5ID0gZ2V0RHJvcGluc0RpcmVjdG9yeSgpOwotCQlpZiAoZHJvcGluc0RpcmVjdG9yeSAhPSBudWxsKQotCQkJZGlyZWN0b3JpZXMuYWRkKGRyb3BpbnNEaXJlY3RvcnkpOwotCQlGaWxlIGxpbmtzRGlyZWN0b3J5ID0gZ2V0TGlua3NEaXJlY3RvcnkoKTsKLQkJaWYgKGxpbmtzRGlyZWN0b3J5ICE9IG51bGwpCi0JCQlkaXJlY3Rvcmllcy5hZGQobGlua3NEaXJlY3RvcnkpOwotCQlpZiAoZGlyZWN0b3JpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCURyb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCAiZHJvcGluczoiICsgZHJvcGluc0RpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCS8vCQlsaXN0ZW5lci5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKS5zZXRQcm9wZXJ0eShQUk9GSUxFX0VYVEVOU0lPTiwgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKChGaWxlW10pIGRpcmVjdG9yaWVzLnRvQXJyYXkobmV3IEZpbGVbZGlyZWN0b3JpZXMuc2l6ZSgpXSkpOwotCQl3YXRjaGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd2F0Y2hlci5wb2xsKCk7Ci0KLQkJZHJvcGluUmVwb3NpdG9yaWVzID0gbGlzdGVuZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3YXRjaGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IChEaXJlY3RvcnlXYXRjaGVyKSBpdGVyLm5leHQoKTsKLQkJCXdhdGNoZXIuc3RvcCgpOwotCQl9Ci0JCWJ1bmRsZUNvbnRleHQgPSBudWxsOwotCQlzZXRQYWNrYWdlQWRtaW4obnVsbCk7Ci0JCWNvbnRleHQudW5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGJ1bmRsZSBjb250ZXh0IGZvciB0aGlzIGJ1bmRsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGJ1bmRsZUNvbnRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRMaW5rc0RpcmVjdG9yeSgpIHsKLQkJdHJ5IHsKLQkJCS8vVE9ETzogYSBwcm9wZXIgaW5zdGFsbCBhcmVhIHdvdWxkIGJlIGJldHRlci4gb3NnaS5pbnN0YWxsLmFyZWEgaXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yayBqYXIKLQkJCVVSTCBiYXNlVVJMID0gbmV3IFVSTChidW5kbGVDb250ZXh0LmdldFByb3BlcnR5KE9TR0lfQ09ORklHVVJBVElPTl9BUkVBKSk7Ci0JCQlVUkwgZm9sZGVyVVJMID0gbmV3IFVSTChiYXNlVVJMLCAiLi4vbGlua3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBGaWxlKGZvbGRlclVSTC5nZXRQYXRoKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RHJvcGluc0RpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIHdhdGNoZWREaXJlY3RvcnlQcm9wZXJ0eSA9IGJ1bmRsZUNvbnRleHQuZ2V0UHJvcGVydHkoRFJPUElOU19ESVJFQ1RPUlkpOwotCQlpZiAod2F0Y2hlZERpcmVjdG9yeVByb3BlcnR5ICE9IG51bGwpIHsKLQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUod2F0Y2hlZERpcmVjdG9yeVByb3BlcnR5KTsKLQkJCXJldHVybiBmb2xkZXI7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vVE9ETzogYSBwcm9wZXIgaW5zdGFsbCBhcmVhIHdvdWxkIGJlIGJldHRlci4gb3NnaS5pbnN0YWxsLmFyZWEgaXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yayBqYXIKLQkJCVVSTCBiYXNlVVJMID0gbmV3IFVSTChidW5kbGVDb250ZXh0LmdldFByb3BlcnR5KE9TR0lfQ09ORklHVVJBVElPTl9BUkVBKSk7Ci0JCQlVUkwgZm9sZGVyVVJMID0gbmV3IFVSTChiYXNlVVJMLCAiLi4vIiArIERST1BJTlMpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGZvbGRlclVSTC5nZXRQYXRoKCkpOwotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gRGlzYWJsZWQgZm9yIG5vdwotCi0JLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZVVud2F0Y2hlZFJlcG9zaXRvcmllcyhCdW5kbGVDb250ZXh0IGNvbnRleHQsIFByb2ZpbGUgcHJvZmlsZSwgRmlsZSB3YXRjaGVkRm9sZGVyKSB7Ci0JLy8JCXJlbW92ZVVud2F0Y2hlZE1ldGFkYXRhUmVwb3NpdG9yaWVzKGNvbnRleHQsIHByb2ZpbGUsIHdhdGNoZWRGb2xkZXIpOwotCS8vCQlyZW1vdmVVbndhdGNoZWRBcnRpZmFjdFJlcG9zaXRvcmllcyhjb250ZXh0LCBwcm9maWxlLCB3YXRjaGVkRm9sZGVyKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIHZvaWQgcmVtb3ZlVW53YXRjaGVkQXJ0aWZhY3RSZXBvc2l0b3JpZXMoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBQcm9maWxlIHByb2ZpbGUsIEZpbGUgd2F0Y2hlZEZvbGRlcikgewotCS8vCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCS8vCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkvLwkJdHJ5IHsKLQkvLwkJCUlBcnRpZmFjdFJlcG9zaXRvcnlbXSByZXBvc2l0b3JpZXMgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKCk7Ci0JLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCS8vCQkJCU1hcCBwcm9wZXJ0aWVzID0gcmVwb3NpdG9yaWVzW2ldLmdldFByb3BlcnRpZXMoKTsKLQkvLwkJCQlTdHJpbmcgcHJvZmlsZUlkID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoInByb2ZpbGVJZCIpOwotCS8vCQkJCVN0cmluZyBmb2xkZXJOYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoImZvbGRlciIpOwotCS8vCi0JLy8JCQkJaWYgKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkuZXF1YWxzKHByb2ZpbGVJZCkgJiYgIXdhdGNoZWRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGZvbGRlck5hbWUpKSB7Ci0JLy8JCQkJCW1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShyZXBvc2l0b3JpZXNbaV0pOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfSBmaW5hbGx5IHsKLQkvLwkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JLy8JCX0KLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIHZvaWQgcmVtb3ZlVW53YXRjaGVkTWV0YWRhdGFSZXBvc2l0b3JpZXMoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBQcm9maWxlIHByb2ZpbGUsIEZpbGUgd2F0Y2hlZEZvbGRlcikgewotCS8vCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCS8vCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkvLwkJdHJ5IHsKLQkvLwkJCUlNZXRhZGF0YVJlcG9zaXRvcnlbXSByZXBvc2l0b3JpZXMgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKCk7Ci0JLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCS8vCQkJCU1hcCBwcm9wZXJ0aWVzID0gcmVwb3NpdG9yaWVzW2ldLmdldFByb3BlcnRpZXMoKTsKLQkvLwkJCQlTdHJpbmcgcHJvZmlsZUlkID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoInByb2ZpbGVJZCIpOwotCS8vCQkJCWlmIChwcm9maWxlLmdldFByb2ZpbGVJZCgpLmVxdWFscyhwcm9maWxlSWQpKSB7Ci0JLy8JCQkJCVN0cmluZyBmb2xkZXJOYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoImZvbGRlciIpOwotCS8vCQkJCQlpZiAoKGZvbGRlck5hbWUgIT0gbnVsbCkgJiYgIXdhdGNoZWRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGZvbGRlck5hbWUpKSB7Ci0JLy8JCQkJCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLmdldExvY2F0aW9uKCkpOwotCS8vCQkJCQl9Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9IGZpbmFsbHkgewotCS8vCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkvLwkJfQotCS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2ZpbGUgZ2V0Q3VycmVudFByb2ZpbGUoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl0cnkgewotCQkJcmV0dXJuIHByb2ZpbGVSZWdpc3RyeS5nZXRQcm9maWxlKElQcm9maWxlUmVnaXN0cnkuU0VMRik7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGFja2FnZUFkbWluKFBhY2thZ2VBZG1pbiBzZXJ2aWNlKSB7Ci0JCXBhY2thZ2VBZG1pbiA9IHNlcnZpY2U7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9SZXR1cm4gdGhlIGZpcnN0IGJ1bmRsZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb3IgdW5pbnN0YWxsZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewotCQkJCXJldHVybiBidW5kbGVzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY5YzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0Ryb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLlJlcG9zaXRvcnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBEcm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyIGV4dGVuZHMgUmVwb3NpdG9yeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVIgPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOSyA9ICIubGluayI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWklQID0gIi56aXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktTX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUElOX0FSVElGQUNUX1JFUE9TSVRPUklFUyA9ICJkcm9waW4uYXJ0aWZhY3RSZXBvc2l0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BJTl9NRVRBREFUQV9SRVBPU0lUT1JJRVMgPSAiZHJvcGluLm1ldGFkYXRhUmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBFID0gInwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBMaXN0IG1ldGFkYXRhUmVwb3NpdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBhcnRpZmFjdFJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBEcm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0JCXN1cGVyKGNvbnRleHQsIHJlcG9zaXRvcnlOYW1lKTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZS5lbmRzV2l0aChKQVIpIHx8IG5hbWUuZW5kc1dpdGgoWklQKSB8fCBuYW1lLmVuZHNXaXRoKExJTkspOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZGVkKEZpbGUgZmlsZSkgewotCQlpZiAoc3VwZXIuYWRkZWQoZmlsZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlVUkwgcmVwb3NpdG9yeVVSTCA9IGNyZWF0ZVJlcG9zaXRvcnlVUkwoZmlsZSk7Ci0JCWlmIChyZXBvc2l0b3J5VVJMICE9IG51bGwpIHsKLQkJCWxvYWRNZXRhZGF0YVJlcG9zaXRvcnkocmVwb3NpdG9yeVVSTCk7Ci0JCQlsb2FkQXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG9zaXRvcnlVUkwpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoRmlsZSBmaWxlKSB7Ci0JCWlmIChzdXBlci5jaGFuZ2VkKGZpbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJVVJMIHJlcG9zaXRvcnlVUkwgPSBjcmVhdGVSZXBvc2l0b3J5VVJMKGZpbGUpOwotCQlpZiAocmVwb3NpdG9yeVVSTCAhPSBudWxsKSB7Ci0JCQlsb2FkTWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9zaXRvcnlVUkwpOwotCQkJbG9hZEFydGlmYWN0UmVwb3NpdG9yeShyZXBvc2l0b3J5VVJMKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaW5rUGF0aChGaWxlIGZpbGUpIHsKLQkJUHJvcGVydGllcyBsaW5rcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJdHJ5IHsKLQkJCQlsaW5rcy5sb2FkKGlucHV0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXQuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJU3RyaW5nIHBhdGggPSBsaW5rcy5nZXRQcm9wZXJ0eShMSU5LU19QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJLy8gbG9nCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHBhcnNlIG91dCBsaW5rIGluZm9ybWF0aW9uCi0JCWlmIChwYXRoLnN0YXJ0c1dpdGgoInIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDIpLnRyaW0oKTsKLQkJfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoInJ3ICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygzKS50cmltKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcGF0aC50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgY3JlYXRlUmVwb3NpdG9yeVVSTChGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aChMSU5LKSkgewotCQkJCUZpbGUgbGlua0ZpbGUgPSBmaWxlOwotCQkJCVN0cmluZyBwYXRoID0gZ2V0TGlua1BhdGgobGlua0ZpbGUpOwotCQkJCS8vIHRvZG8gbG9nCi0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJLy8gbGluayBzdXBwb3J0IGlzIHJlbGF0aXZlIHRvIHRoZSBpbnN0YWxsIHJvb3QKLQkJCQkJLy8gRm9yIG5vdyB3ZSB3aWxsIHVzZSB0aGUgcGFyZW50IG9mIGRyb3BpbnMgZm9sZGVyCi0JCQkJCWZpbGUgPSBuZXcgRmlsZShBY3RpdmF0b3IuZ2V0RHJvcGluc0RpcmVjdG9yeSgpLmdldFBhcmVudEZpbGUoKSwgcGF0aCk7Ci0JCQkJfQotCQkJfQotCi0JCQlGaWxlIGNhbm9uaWNhbEZpbGUgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCVVSTCByZXBvc2l0b3J5VVJMID0gY2Fub25pY2FsRmlsZS50b1VSTCgpOwotCQkJaWYgKGNhbm9uaWNhbEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFpJUCkgfHwgY2Fub25pY2FsRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoSkFSKSkgewotCQkJCXJlcG9zaXRvcnlVUkwgPSBuZXcgVVJMKCJqYXI6IiArIHJlcG9zaXRvcnlVUkwudG9TdHJpbmcoKSArICIhLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiByZXBvc2l0b3J5VVJMOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0b2RvIGxvZwkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIHJlcG9VUkwpIHsKLQkJdHJ5IHsKLQkJCW1ldGFkYXRhUmVwb3NpdG9yaWVzLmFkZChBY3RpdmF0b3IubG9hZE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvVVJMKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE86IGxvZwotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkQXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCByZXBvVVJMKSB7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdFJlcG9zaXRvcmllcy5hZGQoQWN0aXZhdG9yLmxvYWRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb1VSTCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9UT0RPOiBsb2cKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0KLQkJc3luY2hyb25pemVEcm9waW5NZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCQlzeW5jaHJvbml6ZURyb3BpbkFydGlmYWN0UmVwb3NpdG9yaWVzKCk7Ci0KLQkJc3VwZXIuc3RvcFBvbGwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVEcm9waW5NZXRhZGF0YVJlcG9zaXRvcmllcygpIHsKLQkJTGlzdCBjdXJyZW50UmVwb3NpdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbWV0YWRhdGFSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB1cmxTdHJpbmcgPSByZXBvc2l0b3J5LmdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCWN1cnJlbnRSZXBvc2l0b3JpZXMuYWRkKHVybFN0cmluZyk7Ci0JCX0KLQkJTGlzdCBwcmV2aW91c1JlcG9zaXRvcmllcyA9IGdldExpc3RSZXBvc2l0b3J5UHJvcGVydHkoZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCksIERST1BJTl9NRVRBREFUQV9SRVBPU0lUT1JJRVMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJldmlvdXNSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHJlcG9zaXRvcnkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWN1cnJlbnRSZXBvc2l0b3JpZXMuY29udGFpbnMocmVwb3NpdG9yeSkpCi0JCQkJcmVtb3ZlTWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9zaXRvcnkpOwotCQl9Ci0JCXNldExpc3RSZXBvc2l0b3J5UHJvcGVydHkoZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCksIERST1BJTl9NRVRBREFUQV9SRVBPU0lUT1JJRVMsIGN1cnJlbnRSZXBvc2l0b3JpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIHVybFN0cmluZykgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKQotCQkJbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG5vdCByZWdpc3RlcmVkLiIpOwotCi0JCXRyeSB7Ci0JCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobmV3IFVSTCh1cmxTdHJpbmcpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE86IGxvZwotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRHJvcGluQXJ0aWZhY3RSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgY3VycmVudFJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFydGlmYWN0UmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQljdXJyZW50UmVwb3NpdG9yaWVzLmFkZCh1cmxTdHJpbmcpOwotCQl9Ci0JCUxpc3QgcHJldmlvdXNSZXBvc2l0b3JpZXMgPSBnZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldEFydGlmYWN0UmVwb3NpdG9yeSgpLCBEUk9QSU5fQVJUSUZBQ1RfUkVQT1NJVE9SSUVTKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZXZpb3VzUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFjdXJyZW50UmVwb3NpdG9yaWVzLmNvbnRhaW5zKHJlcG9zaXRvcnkpKQotCQkJCXJlbW92ZUFydGlmYWN0UmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKLQkJfQotCQlzZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldEFydGlmYWN0UmVwb3NpdG9yeSgpLCBEUk9QSU5fQVJUSUZBQ1RfUkVQT1NJVE9SSUVTLCBjdXJyZW50UmVwb3NpdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHVybFN0cmluZykgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKQotCQkJbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG5vdCByZWdpc3RlcmVkLiIpOwotCi0JCXRyeSB7Ci0JCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobmV3IFVSTCh1cmxTdHJpbmcpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETzogbG9nCi0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TGlzdFJlcG9zaXRvcnlQcm9wZXJ0eShJUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcga2V5KSB7Ci0JCUxpc3QgbGlzdFByb3BlcnR5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgZHJvcGluUmVwb3NpdG9yaWVzID0gKFN0cmluZykgcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7Ci0JCWlmIChkcm9waW5SZXBvc2l0b3JpZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZHJvcGluUmVwb3NpdG9yaWVzLCBQSVBFKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlsaXN0UHJvcGVydHkuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3RQcm9wZXJ0eTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TGlzdFJlcG9zaXRvcnlQcm9wZXJ0eShJUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcga2V5LCBMaXN0IGxpc3RQcm9wZXJ0eSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdFByb3BlcnR5Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5U3RyaW5nID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnVmZmVyLmFwcGVuZChyZXBvc2l0b3J5U3RyaW5nKTsKLQkJCWlmIChpdC5oYXNOZXh0KCkpCi0JCQkJYnVmZmVyLmFwcGVuZChQSVBFKTsKLQkJfQotCQlTdHJpbmcgdmFsdWUgPSAoYnVmZmVyLmxlbmd0aCgpID09IDApID8gbnVsbCA6IGJ1ZmZlci50b1N0cmluZygpOwotCQlyZXBvc2l0b3J5LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5W10gZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChtZXRhZGF0YVJlcG9zaXRvcmllcyk7Ci0JCXJlc3VsdC5hZGQoZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCkpOwotCQlyZXR1cm4gKElNZXRhZGF0YVJlcG9zaXRvcnlbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElNZXRhZGF0YVJlcG9zaXRvcnlbMF0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGExNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHJvY2Vzc2luZ0NvbmZnOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9QbGF0Zm9ybVhtbExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9QbGF0Zm9ybVhtbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTk1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUGxhdGZvcm1YbWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuU2l0ZURlbHRhLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtWG1sTGlzdGVuZXIgZXh0ZW5kcyBEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fWE1MID0gInBsYXRmb3JtLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCXByaXZhdGUgTWFwIHNpdGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEZpbGUgcm9vdDsKLQlwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkID0gLTFsOwotCi0JcHVibGljIFBsYXRmb3JtWG1sTGlzdGVuZXIoRmlsZSBmaWxlKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCFQTEFURk9STV9YTUwuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5yb290ID0gZmlsZTsKLQkJLy8gZG9uJ3QgbmVlZCB0byBzZXQgdGhlICJzaXRlcyIgdmFyaWFibGUgc2luY2Ugd2Ugd2lsbCB0cmVhdAotCQkvLyBldmVyeXRoaW5nIGFzICJhZGRlZCIgaW4gdGhlIGRlbHRhIGlmIGl0IGlzIG51bGwKLQkJcHJvY2VzcygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjYWRkZWQoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZGVkKEZpbGUgZmlsZSkgewotCQljaGFuZ2VkID0gY2hhbmdlZCB8fCBQTEFURk9STV9YTUwuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjY2hhbmdlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hhbmdlZChGaWxlIGZpbGUpIHsKLQkJY2hhbmdlZCA9IGNoYW5nZWQgfHwgUExBVEZPUk1fWE1MLmVxdWFscyhmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2dldFNlZW5GaWxlKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgTG9uZyBnZXRTZWVuRmlsZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIG5ldyBMb25nKDApOwotCX0KLQotCS8qCi0JICogUGFyc2UgdGhlIHBsYXRmb3JtLnhtbCBmaWxlIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2Ygc2l0ZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlQ29uZmlndXJhdGlvbigpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlDb25maWd1cmF0aW9uIGNmZyA9IENvbmZpZ3VyYXRpb25QYXJzZXIucGFyc2Uocm9vdCwgKFVSTCkgbnVsbCk7Ci0JCXJldHVybiBjZmcgPT0gbnVsbCA/IG5ldyBBcnJheUxpc3QoMCkgOiBjZmcuZ2V0U2l0ZXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjaXNJbnRlcmVzdGVkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoUExBVEZPUk1fWE1MKSAmJiBsYXN0TW9kaWZpZWQgIT0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2l0ZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNpdGVJbmZvIGluZm8gPSAoU2l0ZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LmFkZChpbmZvLmdldFNpdGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgd2hlcmUgd2UgcmVjb25jaWxlIHRoZSBwbGF0Zm9ybS54bWwgYW5kIGJ1bmRsZXMuaW5mby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2VzcygpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlsYXN0TW9kaWZpZWQgPSByb290Lmxhc3RNb2RpZmllZCgpOwotCQlTaXRlRGVsdGEgZGVsdGEgPSBTaXRlRGVsdGEuY3JlYXRlKGdldFNpdGVzKCksIHBhcnNlQ29uZmlndXJhdGlvbigpKTsKLQkJaWYgKGRlbHRhLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJYWRkZWQoZGVsdGEuYWRkZWQoKSk7Ci0JCXJlbW92ZWQoZGVsdGEucmVtb3ZlZCgpKTsKLQkJY2hhbmdlZChkZWx0YS5jaGFuZ2VkKCkpOwotCQkvL0FjdGl2YXRvci5zeW5jaHJvbml6ZShnZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpLCBudWxsKTsgLy8gVE9ETyBwcm9wZXIgcHJvZ3Jlc3MgbW9uaXRvcmluZz8KLQl9Ci0KLQkvLyBpdGVyYXRlIG92ZXIgdGhlIHNpdGUgbGlzdGVuZXJzIGFuZCBjb2xsZWN0IHRoZSBtZXRhZGF0YSByZXBvc2l0b3JpZXMKLQlwdWJsaWMgTGlzdCBnZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpdGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2l0ZUluZm8gaW5mbyA9IChTaXRlSW5mbykgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQuYWRkKGluZm8uZ2V0UmVwb3NpdG9yeSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogVGhlIGdpdmVuIGxpc3Qgb2Ygc2l0ZXMgaGFzIGJlZW4gYWRkZWQgc28gYWRkIGRpcmVjdG9yeQotCSAqIHdhdGNoZXJzIGZvciBlYWNoIG9mIHRoZW0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZGVkKFNpdGVbXSBhZGRlZCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmIChhZGRlZCA9PSBudWxsIHx8IGFkZGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlTaXRlIHNpdGUgPSBhZGRlZFtpXTsKLQkJCS8vIFRPRE8gc2tpcCBmb3Igbm93Ci0JCQlpZiAoInBsYXRmb3JtOi9iYXNlLyIuZXF1YWxzKHNpdGUuZ2V0VXJsKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHNpdGUuZ2V0VXJsKCkpOwotCQkJCXRyeSB7Ci0JCQkJCXVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTWVzc2FnZXMuZXJyb3JQcm9jZXNzaW5nQ29uZmcsIGUpOwotCQkJCX0KLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBBY3RpdmF0b3IubG9hZE1ldGFkYXRhUmVwb3NpdG9yeSh1cmwpOwotCQkJCWlmIChyZXBvID09IG51bGwpIHsKLQkJCQkJLy8gdG9kbwotCQkJCX0gZWxzZQotCQkJCQlzaXRlcy5wdXQoc2l0ZS5nZXRVcmwoKSwgbmV3IFNpdGVJbmZvKHNpdGUsIHJlcG8pKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihNZXNzYWdlcy5lcnJvclByb2Nlc3NpbmdDb25mZywgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBnaXZlbiBsaXN0IG9mIHNpdGVzIGhhcyBiZWVuIHJlbW92ZWQgc28gYWN0IGFjY29yZGluZ2x5LgotCSAqIFJlbW92ZSBhbGwgdGhlIHJlZ2lzdGVyZWQgZGlyZWN0b3J5IHdhdGNoZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVkKFNpdGVbXSByZW1vdmVkKSB7Ci0JCWlmIChyZW1vdmVkID09IG51bGwgfHwgcmVtb3ZlZC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlTaXRlIHNpdGUgPSByZW1vdmVkW2ldOwotCQkJU2l0ZUluZm8gaW5mbyA9IChTaXRlSW5mbykgc2l0ZXMuZ2V0KHNpdGUuZ2V0VXJsKCkpOwotCQkJLy8gVE9ETyBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGFuIGVycm9yPwotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCS8vIAotCQkJfQotCi0JCQlzaXRlcy5yZW1vdmUoc2l0ZS5nZXRVcmwoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBnaXZlbiBzZXQgb2Ygc2l0ZXMgaGFzIGhhZCB0aGVpciBjb250ZW50cyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VkKENoYW5nZVtdIGNoYW5nZXMpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNoYW5nZSBjaGFuZ2UgPSBjaGFuZ2VzW2ldOwotCQkJaWYgKG1ham9yQ2hhbmdlKGNoYW5nZSkpIHsKLQkJCQlyZW1vdmVkKG5ldyBTaXRlW10ge2NoYW5nZS5vbGRTaXRlfSk7Ci0JCQkJYWRkZWQobmV3IFNpdGVbXSB7Y2hhbmdlLm5ld1NpdGV9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIDIgc2l0ZXMgc2hvdWxkIGNhdXNlCi0JICogYSBuZXcgbGlzdGVuZXIgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWFqb3JDaGFuZ2UoQ2hhbmdlIGNoYW5nZSkgewotCQlTaXRlIG9uZSA9IGNoYW5nZS5vbGRTaXRlOwotCQlTaXRlIHR3byA9IGNoYW5nZS5uZXdTaXRlOwotCQlpZiAoIVV0aWxzLmVxdWFscyhvbmUuZ2V0UG9saWN5KCksIHR3by5nZXRQb2xpY3koKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuICFVdGlscy5lcXVhbHMob25lLmdldExpc3QoKSwgdHdvLmdldExpc3QoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNyZW1vdmVkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVkKEZpbGUgZmlsZSkgewotCQljaGFuZ2VkID0gY2hhbmdlZCB8fCBQTEFURk9STV9YTUwuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjc3RhcnRQb2xsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFBvbGwoKSB7Ci0JCWNoYW5nZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI3N0b3BQb2xsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9sbCgpIHsKLQkJaWYgKGNoYW5nZWQpCi0JCQl0cnkgewotCQkJCXByb2Nlc3MoKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJY2hhbmdlZCA9IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUHJvZmlsZVN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUHJvZmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjhiNTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1Byb2ZpbGVTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgaWRlYXMgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBTeW5jaHJvbml6ZXMgYSBwcm9maWxlIHdpdGggYSBzZXQgb2YgcmVwb3NpdG9yaWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvZmlsZVN5bmNocm9uaXplciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUFNfRklMRV9QUkVGSVggPSAidGltZXN0YW1wcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9USU1FU1RBTVAgPSAiUFJPRklMRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fVElNRVNUQU1QID0gIi0xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX0lVID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZHJvcGlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBjbGFzcyBMaXN0Q29sbGVjdG9yIGV4dGVuZHMgQ29sbGVjdG9yIHsKLQkJcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRMaXN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRVhURU5TSU9OUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNhY2hlLmV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUEUgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBJUHJvZmlsZSBwcm9maWxlOwotCi0JZmluYWwgTWFwIHJlcG9zaXRvcnlNYXA7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHRpbWVzdGFtcHM7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIFByb2ZpbGVTeW5jaHJvbml6ZXIoSVByb2ZpbGUgcHJvZmlsZSwgQ29sbGVjdGlvbiByZXBvc2l0b3JpZXMpIHsKLQkJdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKLQkJdGhpcy5yZXBvc2l0b3J5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJcmVwb3NpdG9yeU1hcC5wdXQocmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCksIHJlcG9zaXRvcnkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTeW5jaHJvbml6ZSB0aGUgcHJvZmlsZSB3aXRoIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHJlcG9zaXRvcmllcy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBzeW5jaHJvbml6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmVhZFRpbWVzdGFtcHMoKTsKLQkJaWYgKGlzVXBUb0RhdGUoKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gc3luY2hyb25pemVDYWNoZUV4dGVuc2lvbnMoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQotCQlQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBjcmVhdGVQcm9maWxlQ2hhbmdlUmVxdWVzdChjb250ZXh0KTsKLQotCQlpZiAocmVxdWVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTAwKTsKLQkJdHJ5IHsKLQkJCS8vY3JlYXRlIHRoZSBwcm92aXNpb25pbmcgcGxhbgotCQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gY3JlYXRlUHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoNTApKTsKLQotCQkJc3RhdHVzID0gcGxhbi5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SIHx8IHBsYW4uZ2V0T3BlcmFuZHMoKS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCi0JCQkvL2ludm9rZSB0aGUgZW5naW5lIHRvIHBlcmZvcm0gaW5zdGFsbHMvdW5pbnN0YWxscwotCQkJSVN0YXR1cyBlbmdpbmVSZXN1bHQgPSBleGVjdXRlUGxhbihwbGFuLCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoNTApKTsKLQotCQkJaWYgKCFlbmdpbmVSZXN1bHQuaXNPSygpKQotCQkJCXJldHVybiBlbmdpbmVSZXN1bHQ7Ci0JCQl3cml0ZVRpbWVzdGFtcHMoKTsKLQotCQkJYXBwbHlDb25maWd1cmF0aW9uKCk7Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWIuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlVGltZXN0YW1wcygpIHsKLQkJdGltZXN0YW1wcy5jbGVhcigpOwotCQl0aW1lc3RhbXBzLnB1dChQUk9GSUxFX1RJTUVTVEFNUCwgTG9uZy50b1N0cmluZyhwcm9maWxlLmdldFRpbWVzdGFtcCgpKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3J5TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJTWV0YWRhdGFSZXBvc2l0b3J5KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJTWFwIHByb3BzID0gcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlTdHJpbmcgdGltZXN0YW1wID0gbnVsbDsKLQkJCWlmIChwcm9wcyAhPSBudWxsKQotCQkJCXRpbWVzdGFtcCA9IChTdHJpbmcpIHByb3BzLmdldChJUmVwb3NpdG9yeS5QUk9QX1RJTUVTVEFNUCk7Ci0KLQkJCWlmICh0aW1lc3RhbXAgPT0gbnVsbCkKLQkJCQl0aW1lc3RhbXAgPSBOT19USU1FU1RBTVA7Ci0KLQkJCXRpbWVzdGFtcHMucHV0KGVudHJ5LmdldEtleSgpLCB0aW1lc3RhbXApOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoVElNRVNUQU1QU19GSUxFX1BSRUZJWCArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkuaGFzaENvZGUoKSk7Ci0JCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJdHJ5IHsKLQkJCQl0aW1lc3RhbXBzLnNhdmUob3MsICJUaW1lc3RhbXBzIGZvciAiICsgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCW9zLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBUb0RhdGUoKSB7Ci0JCVN0cmluZyBsYXN0S25vd25Qcm9maWxlVGltZVN0YW1wID0gKFN0cmluZykgdGltZXN0YW1wcy5yZW1vdmUoUFJPRklMRV9USU1FU1RBTVApOwotCQlpZiAobGFzdEtub3duUHJvZmlsZVRpbWVTdGFtcCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWxhc3RLbm93blByb2ZpbGVUaW1lU3RhbXAuZXF1YWxzKExvbmcudG9TdHJpbmcocHJvZmlsZS5nZXRUaW1lc3RhbXAoKSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vV2hlbiB3ZSBnZXQgaGVyZSB0aGUgdGltZXN0YW1wcyBtYXAgb25seSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJlcG9zCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3J5TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJTWV0YWRhdGFSZXBvc2l0b3J5KSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0JCQlNYXAgcHJvcHMgPSByZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKTsKLQkJCVN0cmluZyBjdXJyZW50VGltZXN0YW1wID0gbnVsbDsKLQkJCWlmIChwcm9wcyAhPSBudWxsKQotCQkJCWN1cnJlbnRUaW1lc3RhbXAgPSAoU3RyaW5nKSBwcm9wcy5nZXQoSVJlcG9zaXRvcnkuUFJPUF9USU1FU1RBTVApOwotCi0JCQlpZiAoY3VycmVudFRpbWVzdGFtcCA9PSBudWxsKQotCQkJCWN1cnJlbnRUaW1lc3RhbXAgPSBOT19USU1FU1RBTVA7Ci0KLQkJCVN0cmluZyBsYXN0S25vd25UaW1lc3RhbXAgPSAoU3RyaW5nKSB0aW1lc3RhbXBzLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQkvL0EgcmVwbyBoYXMgYmVlbiBhZGRlZCAKLQkJCWlmIChsYXN0S25vd25UaW1lc3RhbXAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIWxhc3RLbm93blRpbWVzdGFtcC5lcXVhbHMoY3VycmVudFRpbWVzdGFtcCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy9BIHJlcG8gaGFzIGJlZW4gcmVtb3ZlZAotCQlpZiAodGltZXN0YW1wcy5zaXplKCkgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFRpbWVzdGFtcHMoKSB7Ci0JCUZpbGUgZmlsZSA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoVElNRVNUQU1QU19GSUxFX1BSRUZJWCArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkuaGFzaENvZGUoKSk7Ci0JCXRpbWVzdGFtcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJdGltZXN0YW1wcy5sb2FkKGlzKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJCWlzLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25pbmdDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCUFycmF5TGlzdCByZXBvVVJMcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlcG9zaXRvcnlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlyZXBvVVJMcy5hZGQobmV3IFVSTCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKFVSTFtdKSByZXBvVVJMcy50b0FycmF5KG5ldyBVUkxbcmVwb1VSTHMuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBzeW5jaHJvbml6ZUNhY2hlRXh0ZW5zaW9ucygpIHsKLQkJTGlzdCBjdXJyZW50RXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcnlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHJlcG9zaXRvcnlJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gQWN0aXZhdG9yLmxvYWRBcnRpZmFjdFJlcG9zaXRvcnkobmV3IFVSTChyZXBvc2l0b3J5SWQpKTsKLQotCQkJCWlmIChyZXBvc2l0b3J5IGluc3RhbmNlb2YgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIHsKLQkJCQkJY3VycmVudEV4dGVuc2lvbnMuYWRkKHJlcG9zaXRvcnlJZCk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocmVwb3NpdG9yeUlkKTsKLQkJCQkJaWYgKGl0Lmhhc05leHQoKSkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoUElQRSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdW5leHBlY3RlZAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGN1cnJlbnRFeHRlbnNpb25zUHJvcGVydHkgPSAoYnVmZmVyLmxlbmd0aCgpID09IDApID8gbnVsbCA6IGJ1ZmZlci50b1N0cmluZygpOwotCi0JCUxpc3QgcHJldmlvdXNFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgcHJldmlvdXNFeHRlbnNpb25zUHJvcGVydHkgPSBwcm9maWxlLmdldFByb3BlcnR5KENBQ0hFX0VYVEVOU0lPTlMpOwotCQlpZiAocHJldmlvdXNFeHRlbnNpb25zUHJvcGVydHkgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJldmlvdXNFeHRlbnNpb25zUHJvcGVydHksIFBJUEUpOwotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlwcmV2aW91c0V4dGVuc2lvbnMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJldmlvdXNFeHRlbnNpb25zLnNpemUoKSA9PSBjdXJyZW50RXh0ZW5zaW9ucy5zaXplKCkgJiYgcHJldmlvdXNFeHRlbnNpb25zLmNvbnRhaW5zQWxsKGN1cnJlbnRFeHRlbnNpb25zKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCU9wZXJhbmQgb3BlcmFuZCA9IG5ldyBQcm9wZXJ0eU9wZXJhbmQoQ0FDSEVfRVhURU5TSU9OUywgcHJldmlvdXNFeHRlbnNpb25zUHJvcGVydHksIGN1cnJlbnRFeHRlbnNpb25zUHJvcGVydHkpOwotCi0JCXJldHVybiBleGVjdXRlT3BlcmFuZHMobmV3IFByb3Zpc2lvbmluZ0NvbnRleHQobmV3IFVSTFswXSksIG5ldyBPcGVyYW5kW10ge29wZXJhbmR9LCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlUm9vdElVKExpc3QgY2hpbGRyZW4pIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKFNVUEVSX0lVKTsKLQkJaXUuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigiMS4wLjAudiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotCQlMaXN0IHJlcXVpcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgbmV4dCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyLm5leHQoKTsKLQkJCXJlcXVpcmVkLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBuZXh0LmdldElkKCksIG51bGwsIG51bGwsIGZhbHNlIC8qIG9wdGlvbmFsICovLCBmYWxzZSwgdHJ1ZSkpOwotCQl9Ci0JCWlmIChyZXF1aXJlZC5zaXplKCkgPiAwKQotCQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXF1aXJlZC50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZWQuc2l6ZSgpXSkpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjcmVhdGVQcm9maWxlQ2hhbmdlUmVxdWVzdChQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJTGlzdCB0b0FkZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkZWZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlDb2xsZWN0b3IgYWxsSVVzID0gZ2V0QWxsSVVzRnJvbVJlcG9zKCk7Ci0KLQkJLy9Ob3RoaW5nIGhhcyBjaGFuZ2VkCi0JCUlJbnN0YWxsYWJsZVVuaXQgcHJldmlvdXMgPSBnZXRJVShTVVBFUl9JVSk7Ci0JCS8vRW1wdHkgcmVwbwotCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCWlmIChhbGxJVXMuc2l6ZSgpID09IDApIHsKLQkJCWlmIChwcmV2aW91cyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQkvL1JlcXVlc3QgdGhlIHJlbW92YWwgb2YgdGhlIHN1cGVyIElVCi0JCQlyZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cHJldmlvdXN9KTsKLQkJCXJldHVybiByZXF1ZXN0OwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbElVcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWRlZmF1bHRzLmFkZChjcmVhdGVEZWZhdWx0SVUoaXUpKTsKLQkJCXRvQWRkLmFkZChjcmVhdGVJbmNsdWRlZElVKGl1KSk7Ci0JCQlpZiAoQm9vbGVhbi52YWx1ZU9mKGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQKSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJcmVxdWVzdC5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoaXUsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX1JPT1RfSVUsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJfQotCi0JCUxpc3QgZXh0cmEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWV4dHJhLmFkZEFsbChkZWZhdWx0cyk7Ci0JCWV4dHJhLmFkZEFsbCh0b0FkZCk7Ci0JCWNvbnRleHQuc2V0RXh0cmFJVXMoZXh0cmEpOwotCi0JCS8vIG9ubHkgYWRkIG9uZSBJVSB0byB0aGUgcmVxdWVzdC4gaXQgd2lsbCBjb250YWluIGFsbCB0aGUgb3RoZXIgSVVzIHdlIHdhbnQgdG8gaW5zdGFsbAotCQlJSW5zdGFsbGFibGVVbml0IHJvb3RJVSA9IGNyZWF0ZVJvb3RJVSh0b0FkZCk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtyb290SVV9KTsKLQotCQkvL1JlcXVlc3QgdGhlIHJlbW92YWwgb2YgdGhlIHByZXZpb3VzIHN1cGVyIElVCi0JCWlmIChwcmV2aW91cyAhPSBudWxsKQotCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3ByZXZpb3VzfSk7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdG9yIGdldEFsbElVc0Zyb21SZXBvcygpIHsKLQkJQ29sbGVjdG9yIGFsbFJlcG9zID0gbmV3IENvbGxlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXJlcG9zaXRvcnkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBhbGxSZXBvcywgbnVsbCkuaXRlcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVwb3M7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUluY2x1ZGVkSVUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdWQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1ZC5zZXRJZChpdS5nZXRJZCgpKTsKLQkJaXVkLnNldFZlcnNpb24obmV3IFZlcnNpb24oMCwgMCwgMCwgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaXUuZ2V0SWQoKSwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKX07Ci0JCWl1ZC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXFzKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXVkKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdElVKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXVkID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdWQuc2V0SWQoaXUuZ2V0SWQoKSk7Ci0JCWl1ZC5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDAsIDAsIDApKTsKLQkJaXVkLnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIG5ldyBWZXJzaW9uKDAsIDAsIDApKX0pOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdWQpOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBnZXRJVShTdHJpbmcgaXVJZCkgewotCQlMaXN0Q29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBMaXN0Q29sbGVjdG9yKCk7Ci0JCXByb2ZpbGUucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGl1SWQpLCBjb2xsZWN0b3IsIG51bGwpOwotCQlpZiAoY29sbGVjdG9yLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXQpIGNvbGxlY3Rvci5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25pbmdQbGFuIGNyZWF0ZVByb3Zpc2lvbmluZ1BsYW4oUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92aXNpb25pbmdDb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSVBsYW5uZXIgcGxhbm5lciA9IChJUGxhbm5lcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgcHJvdmlzaW9uaW5nQ29udGV4dCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGV4ZWN1dGVQbGFuKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92aXNpb25pbmdDb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJT3BlcmFuZFtdIG9wZXJhbmRzID0gcGxhbi5nZXRPcGVyYW5kcygpOwotCQlyZXR1cm4gZXhlY3V0ZU9wZXJhbmRzKHByb3Zpc2lvbmluZ0NvbnRleHQsIG9wZXJhbmRzLCBtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgZXhlY3V0ZU9wZXJhbmRzKFByb3Zpc2lvbmluZ0NvbnRleHQgcHJvdmlzaW9uaW5nQ29udGV4dCwgT3BlcmFuZFtdIG9wZXJhbmRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUVuZ2luZS5jbGFzcy5nZXROYW1lKCkpOwotCQlJRW5naW5lIGVuZ2luZSA9IChJRW5naW5lKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQkJSVN0YXR1cyBlbmdpbmVSZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIHByb3Zpc2lvbmluZ0NvbnRleHQsIG1vbml0b3IpOwotCQkJcmV0dXJuIGVuZ2luZVJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gKENvbmZpZ3VyYXRvcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXRyeSB7Ci0JCQljb25maWd1cmF0b3IuYXBwbHlDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJVbmV4cGVjdGVkIGZhaWx1cmUgYXBwbHlpbmcgY29uZmlndXJhdGlvbiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1NpdGVEZWx0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDJhZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZURlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS5TaXRlOwotCi0vKgotICogUmVwcmVzZW50cyB0aGUgY2hhbmdlcyBiZXR3ZWVuIDIgbGlzdHMgb2Ygc2l0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlRGVsdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0JBU0UgPSAicGxhdGZvcm06L2Jhc2UvIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGNsYXNzIENoYW5nZSB7Ci0JCVNpdGUgb2xkU2l0ZTsKLQkJU2l0ZSBuZXdTaXRlOwotCi0JCUNoYW5nZShTaXRlIG9sZFNpdGUsIFNpdGUgbmV3U2l0ZSkgewotCQkJdGhpcy5vbGRTaXRlID0gb2xkU2l0ZTsKLQkJCXRoaXMubmV3U2l0ZSA9IG5ld1NpdGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgYWRkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IHJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGNoYW5nZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGRlbHRhIG9iamVjdCBiYXNlZCBvbiB0aGUgdHdvIGdpdmVuIGxpc3RzIG9mCi0JICogc2l0ZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2l0ZURlbHRhIGNyZWF0ZShMaXN0IG9uZUxpc3QsIExpc3QgdHdvTGlzdCkgewotCQlTaXRlW10gb25lID0gKFNpdGVbXSkgb25lTGlzdC50b0FycmF5KG5ldyBTaXRlW29uZUxpc3Quc2l6ZSgpXSk7Ci0JCVNpdGVbXSB0d28gPSAoU2l0ZVtdKSB0d29MaXN0LnRvQXJyYXkobmV3IFNpdGVbdHdvTGlzdC5zaXplKCldKTsKLQkJU2l0ZURlbHRhIHJlc3VsdCA9IG5ldyBTaXRlRGVsdGEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IG9uZSA9PSBudWxsIHx8IGkgPCBvbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyAhZm91bmQgJiYgaiA8IHR3by5sZW5ndGg7IGorKykgewotCQkJCWlmICh0d29bal0gIT0gbnVsbCAmJiBvbmVbaV0uZ2V0VXJsKCkuZXF1YWxzKHR3b1tqXS5nZXRVcmwoKSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkvLyBUT0RPCi0JCQkJCWlmICghb25lW2ldLmdldFVybCgpLmVxdWFscyhQTEFURk9STV9CQVNFKSAmJiAhb25lW2ldLmVxdWFscyh0d29bal0pKQotCQkJCQkJcmVzdWx0LmNoYW5nZWQuYWRkKG5ldyBDaGFuZ2Uob25lW2ldLCB0d29bal0pKTsKLQkJCQkJb25lW2ldID0gbnVsbDsKLQkJCQkJdHdvW2pdID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPCi0JCQlpZiAoIWZvdW5kICYmICFQTEFURk9STV9CQVNFLmVxdWFscyhvbmVbaV0uZ2V0VXJsKCkpKQotCQkJCXJlc3VsdC5yZW1vdmVkLmFkZChvbmVbaV0pOwotCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdHdvLmxlbmd0aDsgaisrKSB7Ci0JCQkvLyBUT0RPCi0JCQlpZiAodHdvW2pdICE9IG51bGwgJiYgIVBMQVRGT1JNX0JBU0UuZXF1YWxzKHR3b1tqXS5nZXRVcmwoKSkpCi0JCQkJcmVzdWx0LmFkZGVkLmFkZCh0d29bal0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBzaXRlcyB0aGF0IHdlcmUgYWRkZWQuIE1heSByZXR1cm4gYW4gZW1wdHkgbGlzdAotCSAqIGJ1dCBuZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIFNpdGVbXSBhZGRlZCgpIHsKLQkJcmV0dXJuIChTaXRlW10pIGFkZGVkLnRvQXJyYXkobmV3IFNpdGVbYWRkZWQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBzaXRlcyB0aGF0IHdlcmUgcmVtb3ZlZC4gTWF5IHJldHVybiBhbiBlbXB0eSBsaXN0Ci0JICogYnV0IG5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU2l0ZVtdIHJlbW92ZWQoKSB7Ci0JCXJldHVybiAoU2l0ZVtdKSByZW1vdmVkLnRvQXJyYXkobmV3IFNpdGVbcmVtb3ZlZC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHNpdGUgY2hhbmdlcyB0aGF0IHdlcmUgY2hhbmdlZC4gTWF5IHJldHVybiBhbiBlbXB0eSBsaXN0Ci0JICogYnV0IG5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gY2hhbmdlZCgpIHsKLQkJcmV0dXJuIChDaGFuZ2VbXSkgY2hhbmdlZC50b0FycmF5KG5ldyBDaGFuZ2VbY2hhbmdlZC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYW55Ci0JICogY2hhbmdlcyBpbiB0aGlzIGRlbHRhLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBhZGRlZC5zaXplKCkgPT0gMCAmJiByZW1vdmVkLnNpemUoKSA9PSAwICYmIGNoYW5nZWQuc2l6ZSgpID09IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1NpdGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTE4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlLlNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci0KLS8qCi0gKiBJbnRlcm5hbCBjbGFzcyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3YXRjaGVycyBhbmQgc2l0ZXMuIFVzZWQgZm9yIGNhY2hpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlSW5mbyB7Ci0JcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0JcHJpdmF0ZSBTaXRlIHNpdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0JcHVibGljIFNpdGVJbmZvKFNpdGUgc2l0ZSwgSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCXRoaXMudXJsID0gc2l0ZS5nZXRVcmwoKTsKLQkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgU2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdXJsLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBTaXRlSW5mbykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNpdGVJbmZvIG90aGVyID0gKFNpdGVJbmZvKSBvYmo7Ci0JCS8vIHRoaXMgaXMgb2sgYmVjYXVzZSB0aGV5IGFyZSBzdHJpbmdzIGFuZCBub3QgcmVhbCBVUkxzCi0JCXJldHVybiB1cmwuZXF1YWxzKG90aGVyLmdldFVybCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxOWU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3JQcm9jZXNzaW5nQ29uZmc9RXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbi4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNjYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWJkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGluczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDEwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNTYXQgT2N0IDI3IDE0OjE5OjI0IFBEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJjYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0ZjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGlucy5BY3RpdmF0b3IKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIsCi0gb3JnLnhtbC5zYXgKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZTtidW5kbGUtdmVyc2lvbj0iMC4xLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjNjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGFlMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IERyb3BpbiBSZWNvbmNpbGVyIFBsdWctaW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjMmM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICBpZD0iZXh0ZW5zaW9uUmVwb3NpdG9yeSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkubWV0YWRhdGFSZXBvc2l0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uLkV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8ZmlsdGVyCi0gICAgICAgICAgICBzdWZmaXg9ImVjbGlwc2UiPgotICAgICAgPC9maWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuYXJ0aWZhY3RSZXBvc2l0b3JpZXMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uLkV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSI+Ci0gICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBzdWZmaXg9ImVjbGlwc2UiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vQnVuZGxlUG9vbEZpbHRlcmVkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0J1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzMxMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vQnVuZGxlUG9vbEZpbHRlcmVkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JRmlsZUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVQb29sRmlsdGVyZWRMaXN0ZW5lciBleHRlbmRzIERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgZGVsZWdhdGU7Ci0JcHJpdmF0ZSBTZXQgYnVuZGxlUG9vbEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBCdW5kbGVQb29sRmlsdGVyZWRMaXN0ZW5lcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWRlbGVnYXRlID0gbGlzdGVuZXI7Ci0JCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGJ1bmRsZVBvb2wgPSBVdGlsLmdldEJ1bmRsZVBvb2xSZXBvc2l0b3J5KEFjdGl2YXRvci5nZXRDdXJyZW50UHJvZmlsZShjb250ZXh0KSk7Ci0JCUlBcnRpZmFjdEtleVtdIGtleXMgPSBidW5kbGVQb29sLmdldEFydGlmYWN0S2V5cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgYXJ0aWZhY3RGaWxlID0gYnVuZGxlUG9vbC5nZXRBcnRpZmFjdEZpbGUoa2V5c1tpXSk7Ci0JCQlpZiAoYXJ0aWZhY3RGaWxlICE9IG51bGwpCi0JCQkJYnVuZGxlUG9vbEZpbGVzLmFkZChhcnRpZmFjdEZpbGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5hZGRlZChmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZGVsZWdhdGUuY2hhbmdlZChmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgTG9uZyBnZXRTZWVuRmlsZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGRlbGVnYXRlLmdldFNlZW5GaWxlKGZpbGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJlc3RlZChGaWxlIGZpbGUpIHsKLQkJaWYgKGJ1bmRsZVBvb2xGaWxlcy5jb250YWlucyhmaWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZGVsZWdhdGUuaXNJbnRlcmVzdGVkKGZpbGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5yZW1vdmVkKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0UG9sbCgpIHsKLQkJZGVsZWdhdGUuc3RhcnRQb2xsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0JCWRlbGVnYXRlLnN0b3BQb2xsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnkuQWJzdHJhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9PTEVEID0gIi5wb29sZWQiOyAvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9FWFRFTlNJT04gPSAicHJvZmlsZS5leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0UgPSAiZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRVMgPSAiZmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTlMgPSAicGx1Z2lucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0JcHVibGljIEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIoIkV4dGVuc2lvbjogIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCksIG51bGwsIG51bGwsIGxvY2F0aW9uLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgYmFzZSA9IGdldEJhc2VEaXJlY3RvcnkobG9jYXRpb24pOwotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShiYXNlLCBQTFVHSU5TKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGJhc2UsIEZFQVRVUkVTKTsKLQotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlTdHJpbmcgc3RhdGVEaXJOYW1lID0gSW50ZWdlci50b1N0cmluZyhsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLmhhc2hDb2RlKCkpOwotCQlGaWxlIGJ1bmRsZURhdGEgPSBjb250ZXh0LmdldERhdGFGaWxlKG51bGwpOwotCQlGaWxlIHN0YXRlRGlyID0gbmV3IEZpbGUoYnVuZGxlRGF0YSwgc3RhdGVEaXJOYW1lKTsKLQkJVVJMIGxvY2FsUmVwb3NpdG9yeVVSTDsKLQkJdHJ5IHsKLQkJCWxvY2FsUmVwb3NpdG9yeVVSTCA9IHN0YXRlRGlyLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmV4cGVjdGVkCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRmFpbGVkIHRvIGNyZWF0ZSBsb2NhbCByZXBvc2l0b3J5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhcnRpZmFjdFJlcG9zaXRvcnkgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGluaXRpYWxpemVBcnRpZmFjdFJlcG9zaXRvcnkobG9jYWxSZXBvc2l0b3J5VVJMLCAiZXh0ZW5zaW9uIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIC0gIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRGlyZWN0b3J5V2F0Y2hlciB3YXRjaGVyID0gbmV3IERpcmVjdG9yeVdhdGNoZXIobmV3IEZpbGVbXSB7cGx1Z2lucywgZmVhdHVyZXN9KTsKLQkJRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUmVwb3NpdG9yeUxpc3RlbmVyKGNvbnRleHQsIG51bGwsIGFydGlmYWN0UmVwb3NpdG9yeSk7Ci0JCWlmIChsb2NhdGlvbi5nZXRQYXRoKCkuZW5kc1dpdGgoUE9PTEVEKSkKLQkJCWxpc3RlbmVyID0gbmV3IEJ1bmRsZVBvb2xGaWx0ZXJlZExpc3RlbmVyKGNvbnRleHQsIGxpc3RlbmVyKTsKLQotCQl3YXRjaGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd2F0Y2hlci5wb2xsKCk7Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGluaXRpYWxpemVBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIHN0YXRlRGlyVVJMLCBTdHJpbmcgcmVwb3NpdG9yeU5hbWUpIHsKLQkJU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBmYWN0b3J5LmxvYWQoc3RhdGVEaXJVUkwsIG51bGwpOwotCi0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBmYWN0b3J5LmNyZWF0ZShzdGF0ZURpclVSTCwgcmVwb3NpdG9yeU5hbWUsIG51bGwpOwotCQkvL3JlcG9zaXRvcnkuc2V0UHJvcGVydHkoUFJPRklMRV9FWFRFTlNJT04sICJ0cnVlIik7Ci0JCXJldHVybiByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWdldEJhc2VEaXJlY3RvcnkobG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KFVSTCB1cmwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoIUZJTEUuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG11c3QgdXNlIGZpbGUgcHJvdG9jb2wiLCBudWxsKSk7Ci0KLQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0UGF0aCgpOwotCQlGaWxlIGJhc2UgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoUE9PTEVEKSkgewotCQkJYmFzZSA9IGJhc2UuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJaWYgKCFiYXNlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBub3QgYSBkaXJlY3RvcnkiLCBudWxsKSk7Ci0KLQkJaWYgKGlzQmFzZURpcmVjdG9yeShiYXNlKSkKLQkJCXJldHVybiBiYXNlOwotCi0JCUZpbGUgZWNsaXBzZUJhc2UgPSBuZXcgRmlsZShiYXNlLCBFQ0xJUFNFKTsKLQkJaWYgKGlzQmFzZURpcmVjdG9yeShlY2xpcHNlQmFzZSkpCi0JCQlyZXR1cm4gZWNsaXBzZUJhc2U7Ci0KLQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCAibG9jYXRpb24gaXMgbm90IGFuIGV4dGVuc2lvbiIsIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmFzZURpcmVjdG9yeShGaWxlIGJhc2UpIHsKLQkJRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoYmFzZSwgUExVR0lOUyk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShiYXNlLCBGRUFUVVJFUyk7Ci0KLQkJcmV0dXJuIHBsdWdpbnMuaXNEaXJlY3RvcnkoKSB8fCBmZWF0dXJlcy5pc0RpcmVjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3JzKElBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5jb250YWlucyhkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuY29udGFpbnMoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3QoZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0QXJ0aWZhY3RzKElBcnRpZmFjdFJlcXVlc3RbXSByZXF1ZXN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RzKHJlcXVlc3RzLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmdldE91dHB1dFN0cmVhbShkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0S2V5IGtleSkgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFydGlmYWN0RmlsZShrZXkpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjYjkyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGUoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeShsb2NhdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5LnZhbGlkYXRlKGxvY2F0aW9uLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWI1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeS5BYnN0cmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5TaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJTWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT09MRUQgPSAiLnBvb2xlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRSA9ICJlY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOUyA9ICJwbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeTsKLQotCXB1YmxpYyBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCJFeHRlbnNpb246ICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBudWxsLCBudWxsLCBsb2NhdGlvbiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIGJhc2UgPSBnZXRCYXNlRGlyZWN0b3J5KGxvY2F0aW9uKTsKLQkJRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoYmFzZSwgUExVR0lOUyk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShiYXNlLCBGRUFUVVJFUyk7Ci0KLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU3RyaW5nIHN0YXRlRGlyTmFtZSA9IEludGVnZXIudG9TdHJpbmcobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKS5oYXNoQ29kZSgpKTsKLQkJRmlsZSBidW5kbGVEYXRhID0gY29udGV4dC5nZXREYXRhRmlsZShudWxsKTsKLQkJRmlsZSBzdGF0ZURpciA9IG5ldyBGaWxlKGJ1bmRsZURhdGEsIHN0YXRlRGlyTmFtZSk7Ci0JCVVSTCBsb2NhbFJlcG9zaXRvcnlVUkw7Ci0JCXRyeSB7Ci0JCQlsb2NhbFJlcG9zaXRvcnlVUkwgPSBzdGF0ZURpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdW5leHBlY3RlZAotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkZhaWxlZCB0byBjcmVhdGUgbG9jYWwgcmVwb3NpdG9yeSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJbWV0YWRhdGFSZXBvc2l0b3J5ID0gaW5pdGlhbGl6ZU1ldGFkYXRhUmVwb3NpdG9yeShsb2NhbFJlcG9zaXRvcnlVUkwsICJleHRlbnNpb24gbG9jYXRpb24gaW1wbGVtZW50YXRpb24gLSAiICsgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihuZXcgRmlsZVtdIHtwbHVnaW5zLCBmZWF0dXJlc30pOwotCQlEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBSZXBvc2l0b3J5TGlzdGVuZXIoY29udGV4dCwgbWV0YWRhdGFSZXBvc2l0b3J5LCBudWxsKTsKLQkJaWYgKGxvY2F0aW9uLmdldFBhdGgoKS5lbmRzV2l0aChQT09MRUQpKQotCQkJbGlzdGVuZXIgPSBuZXcgQnVuZGxlUG9vbEZpbHRlcmVkTGlzdGVuZXIoY29udGV4dCwgbGlzdGVuZXIpOwotCi0JCXdhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQl9Ci0KLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgaW5pdGlhbGl6ZU1ldGFkYXRhUmVwb3NpdG9yeShVUkwgc3RhdGVEaXJVUkwsIFN0cmluZyByZXBvc2l0b3J5TmFtZSkgewotCQlTaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGZhY3RvcnkubG9hZChzdGF0ZURpclVSTCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGUoc3RhdGVEaXJVUkwsIHJlcG9zaXRvcnlOYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsYWJsZVVuaXRzKElJbnN0YWxsYWJsZVVuaXRbXSBpbnN0YWxsYWJsZVVuaXRzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhRdWVyeSBxdWVyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWdldEJhc2VEaXJlY3RvcnkobG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KFVSTCB1cmwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoIUZJTEUuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgImxvY2F0aW9uIG11c3QgdXNlIGZpbGUgcHJvdG9jb2wiLCBudWxsKSk7Ci0KLQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0UGF0aCgpOwotCQlGaWxlIGJhc2UgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoUE9PTEVEKSkgewotCQkJYmFzZSA9IGJhc2UuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJaWYgKCFiYXNlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsICJsb2NhdGlvbiBub3QgYSBkaXJlY3RvcnkiLCBudWxsKSk7Ci0KLQkJaWYgKGlzQmFzZURpcmVjdG9yeShiYXNlKSkKLQkJCXJldHVybiBiYXNlOwotCi0JCUZpbGUgZWNsaXBzZUJhc2UgPSBuZXcgRmlsZShiYXNlLCBFQ0xJUFNFKTsKLQkJaWYgKGlzQmFzZURpcmVjdG9yeShlY2xpcHNlQmFzZSkpCi0JCQlyZXR1cm4gZWNsaXBzZUJhc2U7Ci0KLQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCAibG9jYXRpb24gaXMgbm90IGFuIGV4dGVuc2lvbiIsIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmFzZURpcmVjdG9yeShGaWxlIGJhc2UpIHsKLQkJRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoYmFzZSwgUExVR0lOUyk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShiYXNlLCBGRUFUVVJFUyk7Ci0KLQkJcmV0dXJuIHBsdWdpbnMuaXNEaXJlY3RvcnkoKSB8fCBmZWF0dXJlcy5pc0RpcmVjdG9yeSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeS5BYnN0cmFjdFJlcG9zaXRvcnkjZ2V0UHJvcGVydGllcygpCi0JICovCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydGllcygpOwotCQllbHNlCi0JCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9leHRlbnNpb25sb2NhdGlvbi9FeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRhMDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGxvYWQoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnkudmFsaWRhdGUobG9jYXRpb24sIG1vbml0b3IpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjA2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBpZGVhcyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlXYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUElOU19ESVJFQ1RPUlkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU0dJX0NPTkZJR1VSQVRJT05fQVJFQSA9ICJvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUElOUyA9ICJkcm9waW5zIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0VYVEVOU0lPTiA9ICJwcm9maWxlLmV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluOwotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluUmVmOwotCXByaXZhdGUgTGlzdCB3YXRjaGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBJTWV0YWRhdGFSZXBvc2l0b3J5W10gZHJvcGluUmVwb3NpdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnlbXSBjb25maWd1cmF0aW9uUmVwb3NpdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnlbXSBsaW5rc1JlcG9zaXRvcmllczsKLQlwcml2YXRlIHN0YXRpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gbG9hZCBhIG1ldGFkYXRhIHJlcG9zaXRvcnkgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGxvYWRNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIHJlcG9VUkwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpCi0JCQltYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbm90IHJlZ2lzdGVyZWQuIik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvVVJMLCBudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGxvYWQgYW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSBmcm9tIHRoZSBnaXZlbiBVUkwuCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGxvYWRBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIHJlcG9VUkwpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpCi0JCQltYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbm90IHJlZ2lzdGVyZWQuIik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvVVJMLCBudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2V0UGFja2FnZUFkbWluKChQYWNrYWdlQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpKTsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0KLQkJaWYgKCFzdGFydEVhcmx5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJaWYgKCFzdGFydEVhcmx5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCWlmICghc3RhcnRFYXJseSgib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGdldEN1cnJlbnRQcm9maWxlKGNvbnRleHQpOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGNyZWF0ZSBhIHdhdGNoZXIgZm9yIHRoZSBtYWluIHBsdWdpbnMgYW5kIGZlYXR1cmVzIGRpcmVjdG9yaWVzCi0JCXdhdGNoRWNsaXBzZVByb2R1Y3QoKTsKLQkJLy8gY3JlYXRlIHRoZSB3YXRjaGVyIGZvciB0aGUgImRyb3AtaW5zIiBmb2xkZXIKLQkJd2F0Y2hEcm9waW5zKHByb2ZpbGUpOwotCQkvLyBrZWVwIGFuIGV5ZSBvbiB0aGUgcGxhdGZvcm0ueG1sCi0JCWlmIChmYWxzZSkKLQkJCXdhdGNoQ29uZmlndXJhdGlvbigpOwotCi0JCXN5bmNocm9uaXplKG5ldyBBcnJheUxpc3QoMCksIG51bGwpOwotCi0JCS8vIHdlIHNob3VsZCBwcm9iYWJseSBiZSAgaG9sZGluZyBvbiB0byB0aGVzZSByZXBvcyBieSBVUkwKLQkJLy8gc2VlIEJ1ZyAyMjM0MjIKLQkJLy8gZm9yIG5vdyBleHBsaWNpdGx5IG51bGxpbmcgb3V0IHRoZXNlIHJlcG9zIHRvIGFsbG93IEdDIHRvIG9jY3VyCi0JCWRyb3BpblJlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXMgPSBudWxsOwotCQlsaW5rc1JlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdhdGNoRWNsaXBzZVByb2R1Y3QoKSB7Ci0KLQkJVVJMIGJhc2VVUkw7Ci0JCXRyeSB7Ci0JCQliYXNlVVJMID0gbmV3IFVSTChidW5kbGVDb250ZXh0LmdldFByb3BlcnR5KE9TR0lfQ09ORklHVVJBVElPTl9BUkVBKSk7Ci0JCQlVUkwgcG9vbGVkVVJMID0gbmV3IFVSTChiYXNlVVJMLCAiLi4vLnBvb2xlZCIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2FkQXJ0aWZhY3RSZXBvc2l0b3J5KHBvb2xlZFVSTCk7Ci0JCQllY2xpcHNlUHJvZHVjdFJlcG9zaXRvcnkgPSBsb2FkTWV0YWRhdGFSZXBvc2l0b3J5KHBvb2xlZFVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIHByb3BlciBsb2dnaW5nCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBwcm9wZXIgbG9nZ2luZwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0RWFybHkoU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJ1bmRsZS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBTeW5jaHJvbml6ZSB0aGUgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN5bmNocm9uaXplKExpc3QgZXh0cmFSZXBvc2l0b3JpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0Q3VycmVudFByb2ZpbGUoYnVuZGxlQ29udGV4dCk7Ci0JCWlmIChwcm9maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGNyZWF0ZSB0aGUgcHJvZmlsZSBzeW5jaHJvbml6ZXIgb24gYWxsIGF2YWlsYWJsZSByZXBvc2l0b3JpZXMKLQkJU2V0IHJlcG9zaXRvcmllcyA9IG5ldyBIYXNoU2V0KGV4dHJhUmVwb3NpdG9yaWVzKTsKLQkJaWYgKGRyb3BpblJlcG9zaXRvcmllcyAhPSBudWxsKQotCQkJcmVwb3NpdG9yaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRyb3BpblJlcG9zaXRvcmllcykpOwotCi0JCWlmIChjb25maWd1cmF0aW9uUmVwb3NpdG9yaWVzICE9IG51bGwpCi0JCQlyZXBvc2l0b3JpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uZmlndXJhdGlvblJlcG9zaXRvcmllcykpOwotCi0JCWlmIChsaW5rc1JlcG9zaXRvcmllcyAhPSBudWxsKQotCQkJcmVwb3NpdG9yaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGxpbmtzUmVwb3NpdG9yaWVzKSk7Ci0KLQkJaWYgKGVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeSAhPSBudWxsKQotCQkJcmVwb3NpdG9yaWVzLmFkZChlY2xpcHNlUHJvZHVjdFJlcG9zaXRvcnkpOwotCi0JCVByb2ZpbGVTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IFByb2ZpbGVTeW5jaHJvbml6ZXIocHJvZmlsZSwgcmVwb3NpdG9yaWVzKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBzeW5jaHJvbml6ZXIuc3luY2hyb25pemUobW9uaXRvcik7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQotCX0KLQotCS8qCi0JICogV2F0Y2ggdGhlIHBsYXRmb3JtLnhtbCBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCB3YXRjaENvbmZpZ3VyYXRpb24oKSB7Ci0JCUZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKCJjb25maWd1cmF0aW9uL29yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihjb25maWdGaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVhtbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFBsYXRmb3JtWG1sTGlzdGVuZXIoY29uZmlnRmlsZSk7Ci0JCQl3YXRjaGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXdhdGNoZXIucG9sbCgpOwotCQkJTGlzdCByZXBvc2l0b3JpZXMgPSBsaXN0ZW5lci5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCQkJaWYgKHJlcG9zaXRvcmllcyAhPSBudWxsKQotCQkJCWNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXMgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeVtdKSByZXBvc2l0b3JpZXMudG9BcnJheShuZXcgSU1ldGFkYXRhUmVwb3NpdG9yeVswXSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIHByb3BlciBsb2dnaW5nCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHdhdGNoZXIgd2l0aCBhIHJlcG9zaXRvcnkgbGlzdGVuZXIgb24gdGhlIGRyb3AtaW5zIGZvbGRlci4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhdGNoRHJvcGlucyhJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCUxpc3QgZGlyZWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGUgZHJvcGluc0RpcmVjdG9yeSA9IGdldERyb3BpbnNEaXJlY3RvcnkoKTsKLQkJaWYgKGRyb3BpbnNEaXJlY3RvcnkgIT0gbnVsbCkKLQkJCWRpcmVjdG9yaWVzLmFkZChkcm9waW5zRGlyZWN0b3J5KTsKLQkJRmlsZSBsaW5rc0RpcmVjdG9yeSA9IGdldExpbmtzRGlyZWN0b3J5KCk7Ci0JCWlmIChsaW5rc0RpcmVjdG9yeSAhPSBudWxsKQotCQkJZGlyZWN0b3JpZXMuYWRkKGxpbmtzRGlyZWN0b3J5KTsKLQkJaWYgKGRpcmVjdG9yaWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlEcm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERyb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgImRyb3BpbnM6IiArIGRyb3BpbnNEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkvLwkJbGlzdGVuZXIuZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkuc2V0UHJvcGVydHkoUFJPRklMRV9FWFRFTlNJT04sIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcigoRmlsZVtdKSBkaXJlY3Rvcmllcy50b0FycmF5KG5ldyBGaWxlW2RpcmVjdG9yaWVzLnNpemUoKV0pKTsKLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCi0JCWRyb3BpblJlcG9zaXRvcmllcyA9IGxpc3RlbmVyLmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2F0Y2hlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSAoRGlyZWN0b3J5V2F0Y2hlcikgaXRlci5uZXh0KCk7Ci0JCQl3YXRjaGVyLnN0b3AoKTsKLQkJfQotCQlidW5kbGVDb250ZXh0ID0gbnVsbDsKLQkJc2V0UGFja2FnZUFkbWluKG51bGwpOwotCQljb250ZXh0LnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBidW5kbGUgY29udGV4dCBmb3IgdGhpcyBidW5kbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBidW5kbGVDb250ZXh0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0TGlua3NEaXJlY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQkvL1RPRE86IGEgcHJvcGVyIGluc3RhbGwgYXJlYSB3b3VsZCBiZSBiZXR0ZXIuIG9zZ2kuaW5zdGFsbC5hcmVhIGlzIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsgamFyCi0JCQlVUkwgYmFzZVVSTCA9IG5ldyBVUkwoYnVuZGxlQ29udGV4dC5nZXRQcm9wZXJ0eShPU0dJX0NPTkZJR1VSQVRJT05fQVJFQSkpOwotCQkJVVJMIGZvbGRlclVSTCA9IG5ldyBVUkwoYmFzZVVSTCwgIi4uL2xpbmtzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgRmlsZShmb2xkZXJVUkwuZ2V0UGF0aCgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldERyb3BpbnNEaXJlY3RvcnkoKSB7Ci0JCVN0cmluZyB3YXRjaGVkRGlyZWN0b3J5UHJvcGVydHkgPSBidW5kbGVDb250ZXh0LmdldFByb3BlcnR5KERST1BJTlNfRElSRUNUT1JZKTsKLQkJaWYgKHdhdGNoZWREaXJlY3RvcnlQcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHdhdGNoZWREaXJlY3RvcnlQcm9wZXJ0eSk7Ci0JCQlyZXR1cm4gZm9sZGVyOwotCQl9Ci0JCXRyeSB7Ci0JCQkvL1RPRE86IGEgcHJvcGVyIGluc3RhbGwgYXJlYSB3b3VsZCBiZSBiZXR0ZXIuIG9zZ2kuaW5zdGFsbC5hcmVhIGlzIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsgamFyCi0JCQlVUkwgYmFzZVVSTCA9IG5ldyBVUkwoYnVuZGxlQ29udGV4dC5nZXRQcm9wZXJ0eShPU0dJX0NPTkZJR1VSQVRJT05fQVJFQSkpOwotCQkJVVJMIGZvbGRlclVSTCA9IG5ldyBVUkwoYmFzZVVSTCwgIi4uLyIgKyBEUk9QSU5TKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXJVUkwuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiBmb2xkZXI7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIERpc2FibGVkIGZvciBub3cKLQotCS8vCXByaXZhdGUgdm9pZCByZW1vdmVVbndhdGNoZWRSZXBvc2l0b3JpZXMoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBQcm9maWxlIHByb2ZpbGUsIEZpbGUgd2F0Y2hlZEZvbGRlcikgewotCS8vCQlyZW1vdmVVbndhdGNoZWRNZXRhZGF0YVJlcG9zaXRvcmllcyhjb250ZXh0LCBwcm9maWxlLCB3YXRjaGVkRm9sZGVyKTsKLQkvLwkJcmVtb3ZlVW53YXRjaGVkQXJ0aWZhY3RSZXBvc2l0b3JpZXMoY29udGV4dCwgcHJvZmlsZSwgd2F0Y2hlZEZvbGRlcik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZVVud2F0Y2hlZEFydGlmYWN0UmVwb3NpdG9yaWVzKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgUHJvZmlsZSBwcm9maWxlLCBGaWxlIHdhdGNoZWRGb2xkZXIpIHsKLQkvLwkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkvLwkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JLy8JCXRyeSB7Ci0JLy8JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5W10gcmVwb3NpdG9yaWVzID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcygpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkvLwkJCQlNYXAgcHJvcGVydGllcyA9IHJlcG9zaXRvcmllc1tpXS5nZXRQcm9wZXJ0aWVzKCk7Ci0JLy8JCQkJU3RyaW5nIHByb2ZpbGVJZCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJwcm9maWxlSWQiKTsKLQkvLwkJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJmb2xkZXIiKTsKLQkvLwotCS8vCQkJCWlmIChwcm9maWxlLmdldFByb2ZpbGVJZCgpLmVxdWFscyhwcm9maWxlSWQpICYmICF3YXRjaGVkRm9sZGVyLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhmb2xkZXJOYW1lKSkgewotCS8vCQkJCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldKTsKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0gZmluYWxseSB7Ci0JLy8JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCS8vCQl9Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZVVud2F0Y2hlZE1ldGFkYXRhUmVwb3NpdG9yaWVzKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgUHJvZmlsZSBwcm9maWxlLCBGaWxlIHdhdGNoZWRGb2xkZXIpIHsKLQkvLwkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkvLwkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JLy8JCXRyeSB7Ci0JLy8JCQlJTWV0YWRhdGFSZXBvc2l0b3J5W10gcmVwb3NpdG9yaWVzID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcygpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkvLwkJCQlNYXAgcHJvcGVydGllcyA9IHJlcG9zaXRvcmllc1tpXS5nZXRQcm9wZXJ0aWVzKCk7Ci0JLy8JCQkJU3RyaW5nIHByb2ZpbGVJZCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJwcm9maWxlSWQiKTsKLQkvLwkJCQlpZiAocHJvZmlsZS5nZXRQcm9maWxlSWQoKS5lcXVhbHMocHJvZmlsZUlkKSkgewotCS8vCQkJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJmb2xkZXIiKTsKLQkvLwkJCQkJaWYgKChmb2xkZXJOYW1lICE9IG51bGwpICYmICF3YXRjaGVkRm9sZGVyLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhmb2xkZXJOYW1lKSkgewotCS8vCQkJCQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KHJlcG9zaXRvcmllc1tpXS5nZXRMb2NhdGlvbigpKTsKLQkvLwkJCQkJfQotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfSBmaW5hbGx5IHsKLQkvLwkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JLy8JCX0KLQkvLwl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIGdldEN1cnJlbnRQcm9maWxlKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShJUHJvZmlsZVJlZ2lzdHJ5LlNFTEYpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFBhY2thZ2VBZG1pbihQYWNrYWdlQWRtaW4gc2VydmljZSkgewotCQlwYWNrYWdlQWRtaW4gPSBzZXJ2aWNlOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCWlmIChwYWNrYWdlQWRtaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBwYWNrYWdlQWRtaW4uZ2V0QnVuZGxlcyhzeW1ib2xpY05hbWUsIG51bGwpOwotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vUmV0dXJuIHRoZSBmaXJzdCBidW5kbGUgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChidW5kbGVzW2ldLmdldFN0YXRlKCkgJiAoQnVuZGxlLklOU1RBTExFRCB8IEJ1bmRsZS5VTklOU1RBTExFRCkpID09IDApIHsKLQkJCQlyZXR1cm4gYnVuZGxlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9Ecm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY5YzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9Ecm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lciBleHRlbmRzIFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTksgPSAiLmxpbmsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpJUCA9ICIuemlwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BJTl9BUlRJRkFDVF9SRVBPU0lUT1JJRVMgPSAiZHJvcGluLmFydGlmYWN0UmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QSU5fTUVUQURBVEFfUkVQT1NJVE9SSUVTID0gImRyb3Bpbi5tZXRhZGF0YVJlcG9zaXRvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQRSA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgTGlzdCBtZXRhZGF0YVJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYXJ0aWZhY3RSZXBvc2l0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5TmFtZSkgewotCQlzdXBlcihjb250ZXh0LCByZXBvc2l0b3J5TmFtZSk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmVzdGVkKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJcmV0dXJuIG5hbWUuZW5kc1dpdGgoSkFSKSB8fCBuYW1lLmVuZHNXaXRoKFpJUCkgfHwgbmFtZS5lbmRzV2l0aChMSU5LKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJaWYgKHN1cGVyLmFkZGVkKGZpbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJVVJMIHJlcG9zaXRvcnlVUkwgPSBjcmVhdGVSZXBvc2l0b3J5VVJMKGZpbGUpOwotCQlpZiAocmVwb3NpdG9yeVVSTCAhPSBudWxsKSB7Ci0JCQlsb2FkTWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9zaXRvcnlVUkwpOwotCQkJbG9hZEFydGlmYWN0UmVwb3NpdG9yeShyZXBvc2l0b3J5VVJMKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQlpZiAoc3VwZXIuY2hhbmdlZChmaWxlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCVVSTCByZXBvc2l0b3J5VVJMID0gY3JlYXRlUmVwb3NpdG9yeVVSTChmaWxlKTsKLQkJaWYgKHJlcG9zaXRvcnlVUkwgIT0gbnVsbCkgewotCQkJbG9hZE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvc2l0b3J5VVJMKTsKLQkJCWxvYWRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb3NpdG9yeVVSTCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGlua1BhdGgoRmlsZSBmaWxlKSB7Ci0JCVByb3BlcnRpZXMgbGlua3MgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJbGlua3MubG9hZChpbnB1dCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCVN0cmluZyBwYXRoID0gbGlua3MuZ2V0UHJvcGVydHkoTElOS1NfUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCS8vIGxvZwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBwYXJzZSBvdXQgbGluayBpbmZvcm1hdGlvbgotCQlpZiAocGF0aC5zdGFydHNXaXRoKCJyICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygyKS50cmltKCk7Ci0JCX0gZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKCJydyAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMykudHJpbSgpOwotCQl9IGVsc2UgewotCQkJcGF0aCA9IHBhdGgudHJpbSgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXByaXZhdGUgVVJMIGNyZWF0ZVJlcG9zaXRvcnlVUkwoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoTElOSykpIHsKLQkJCQlGaWxlIGxpbmtGaWxlID0gZmlsZTsKLQkJCQlTdHJpbmcgcGF0aCA9IGdldExpbmtQYXRoKGxpbmtGaWxlKTsKLQkJCQkvLyB0b2RvIGxvZwotCQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCS8vIGxpbmsgc3VwcG9ydCBpcyByZWxhdGl2ZSB0byB0aGUgaW5zdGFsbCByb290Ci0JCQkJCS8vIEZvciBub3cgd2Ugd2lsbCB1c2UgdGhlIHBhcmVudCBvZiBkcm9waW5zIGZvbGRlcgotCQkJCQlmaWxlID0gbmV3IEZpbGUoQWN0aXZhdG9yLmdldERyb3BpbnNEaXJlY3RvcnkoKS5nZXRQYXJlbnRGaWxlKCksIHBhdGgpOwotCQkJCX0KLQkJCX0KLQotCQkJRmlsZSBjYW5vbmljYWxGaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQlVUkwgcmVwb3NpdG9yeVVSTCA9IGNhbm9uaWNhbEZpbGUudG9VUkwoKTsKLQkJCWlmIChjYW5vbmljYWxGaWxlLmdldE5hbWUoKS5lbmRzV2l0aChaSVApIHx8IGNhbm9uaWNhbEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKEpBUikpIHsKLQkJCQlyZXBvc2l0b3J5VVJMID0gbmV3IFVSTCgiamFyOiIgKyByZXBvc2l0b3J5VVJMLnRvU3RyaW5nKCkgKyAiIS8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gcmVwb3NpdG9yeVVSTDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gdG9kbyBsb2cJCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCByZXBvVVJMKSB7Ci0JCXRyeSB7Ci0JCQltZXRhZGF0YVJlcG9zaXRvcmllcy5hZGQoQWN0aXZhdG9yLmxvYWRNZXRhZGF0YVJlcG9zaXRvcnkocmVwb1VSTCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9UT0RPOiBsb2cKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZEFydGlmYWN0UmVwb3NpdG9yeShVUkwgcmVwb1VSTCkgewotCQl0cnkgewotCQkJYXJ0aWZhY3RSZXBvc2l0b3JpZXMuYWRkKEFjdGl2YXRvci5sb2FkQXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG9VUkwpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETzogbG9nCi0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BQb2xsKCkgewotCi0JCXN5bmNocm9uaXplRHJvcGluTWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQkJc3luY2hyb25pemVEcm9waW5BcnRpZmFjdFJlcG9zaXRvcmllcygpOwotCi0JCXN1cGVyLnN0b3BQb2xsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRHJvcGluTWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgY3VycmVudFJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IG1ldGFkYXRhUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJTWV0YWRhdGFSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQljdXJyZW50UmVwb3NpdG9yaWVzLmFkZCh1cmxTdHJpbmcpOwotCQl9Ci0JCUxpc3QgcHJldmlvdXNSZXBvc2l0b3JpZXMgPSBnZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLCBEUk9QSU5fTUVUQURBVEFfUkVQT1NJVE9SSUVTKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZXZpb3VzUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFjdXJyZW50UmVwb3NpdG9yaWVzLmNvbnRhaW5zKHJlcG9zaXRvcnkpKQotCQkJCXJlbW92ZU1ldGFkYXRhUmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKLQkJfQotCQlzZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLCBEUk9QSU5fTUVUQURBVEFfUkVQT1NJVE9SSUVTLCBjdXJyZW50UmVwb3NpdG9yaWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0YWRhdGFSZXBvc2l0b3J5KFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsKLQotCQl0cnkgewotCQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KG5ldyBVUkwodXJsU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPOiBsb2cKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZURyb3BpbkFydGlmYWN0UmVwb3NpdG9yaWVzKCkgewotCQlMaXN0IGN1cnJlbnRSZXBvc2l0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBhcnRpZmFjdFJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSUFydGlmYWN0UmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9IHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpOwotCQkJY3VycmVudFJlcG9zaXRvcmllcy5hZGQodXJsU3RyaW5nKTsKLQkJfQotCQlMaXN0IHByZXZpb3VzUmVwb3NpdG9yaWVzID0gZ2V0TGlzdFJlcG9zaXRvcnlQcm9wZXJ0eShnZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSwgRFJPUElOX0FSVElGQUNUX1JFUE9TSVRPUklFUyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmV2aW91c1JlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcmVwb3NpdG9yeSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghY3VycmVudFJlcG9zaXRvcmllcy5jb250YWlucyhyZXBvc2l0b3J5KSkKLQkJCQlyZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0JCX0KLQkJc2V0TGlzdFJlcG9zaXRvcnlQcm9wZXJ0eShnZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSwgRFJPUElOX0FSVElGQUNUX1JFUE9TSVRPUklFUywgY3VycmVudFJlcG9zaXRvcmllcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQXJ0aWZhY3RSZXBvc2l0b3J5KFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsKLQotCQl0cnkgewotCQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KG5ldyBVUkwodXJsU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE86IGxvZwotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExpc3RSZXBvc2l0b3J5UHJvcGVydHkoSVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGtleSkgewotCQlMaXN0IGxpc3RQcm9wZXJ0eSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGRyb3BpblJlcG9zaXRvcmllcyA9IChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChrZXkpOwotCQlpZiAoZHJvcGluUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRyb3BpblJlcG9zaXRvcmllcywgUElQRSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJbGlzdFByb3BlcnR5LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0UHJvcGVydHk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExpc3RSZXBvc2l0b3J5UHJvcGVydHkoSVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGtleSwgTGlzdCBsaXN0UHJvcGVydHkpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3RQcm9wZXJ0eS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcmVwb3NpdG9yeVN0cmluZyA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWJ1ZmZlci5hcHBlbmQocmVwb3NpdG9yeVN0cmluZyk7Ci0JCQlpZiAoaXQuaGFzTmV4dCgpKQotCQkJCWJ1ZmZlci5hcHBlbmQoUElQRSk7Ci0JCX0KLQkJU3RyaW5nIHZhbHVlID0gKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBidWZmZXIudG9TdHJpbmcoKTsKLQkJcmVwb3NpdG9yeS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeVtdIGdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobWV0YWRhdGFSZXBvc2l0b3JpZXMpOwotCQlyZXN1bHQuYWRkKGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpKTsKLQkJcmV0dXJuIChJTWV0YWRhdGFSZXBvc2l0b3J5W10pIHJlc3VsdC50b0FycmF5KG5ldyBJTWV0YWRhdGFSZXBvc2l0b3J5WzBdKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGExNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGlucy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclByb2Nlc3NpbmdDb25mZzsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gcHJldmVudCBpbnN0YW50aWF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1BsYXRmb3JtWG1sTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9QbGF0Zm9ybVhtbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTk1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1BsYXRmb3JtWG1sTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLlNpdGVEZWx0YS5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVhtbExpc3RlbmVyIGV4dGVuZHMgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1hNTCA9ICJwbGF0Zm9ybS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQlwcml2YXRlIE1hcCBzaXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBGaWxlIHJvb3Q7Ci0JcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZCA9IC0xbDsKLQotCXB1YmxpYyBQbGF0Zm9ybVhtbExpc3RlbmVyKEZpbGUgZmlsZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCWlmICghUExBVEZPUk1fWE1MLmVxdWFscyhmaWxlLmdldE5hbWUoKSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMucm9vdCA9IGZpbGU7Ci0JCS8vIGRvbid0IG5lZWQgdG8gc2V0IHRoZSAic2l0ZXMiIHZhcmlhYmxlIHNpbmNlIHdlIHdpbGwgdHJlYXQKLQkJLy8gZXZlcnl0aGluZyBhcyAiYWRkZWQiIGluIHRoZSBkZWx0YSBpZiBpdCBpcyBudWxsCi0JCXByb2Nlc3MoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2FkZGVkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJY2hhbmdlZCA9IGNoYW5nZWQgfHwgUExBVEZPUk1fWE1MLmVxdWFscyhmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2NoYW5nZWQoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoRmlsZSBmaWxlKSB7Ci0JCWNoYW5nZWQgPSBjaGFuZ2VkIHx8IFBMQVRGT1JNX1hNTC5lcXVhbHMoZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNnZXRTZWVuRmlsZShqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIExvbmcgZ2V0U2VlbkZpbGUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBuZXcgTG9uZygwKTsKLQl9Ci0KLQkvKgotCSAqIFBhcnNlIHRoZSBwbGF0Zm9ybS54bWwgZmlsZSBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIHNpdGVzLgotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJQ29uZmlndXJhdGlvbiBjZmcgPSBDb25maWd1cmF0aW9uUGFyc2VyLnBhcnNlKHJvb3QsIChVUkwpIG51bGwpOwotCQlyZXR1cm4gY2ZnID09IG51bGwgPyBuZXcgQXJyYXlMaXN0KDApIDogY2ZnLmdldFNpdGVzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2lzSW50ZXJlc3RlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmVzdGVkKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX1hNTCkgJiYgbGFzdE1vZGlmaWVkICE9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNpdGVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2l0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTaXRlSW5mbyBpbmZvID0gKFNpdGVJbmZvKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdC5hZGQoaW5mby5nZXRTaXRlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIHJlY29uY2lsZSB0aGUgcGxhdGZvcm0ueG1sIGFuZCBidW5kbGVzLmluZm8uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJbGFzdE1vZGlmaWVkID0gcm9vdC5sYXN0TW9kaWZpZWQoKTsKLQkJU2l0ZURlbHRhIGRlbHRhID0gU2l0ZURlbHRhLmNyZWF0ZShnZXRTaXRlcygpLCBwYXJzZUNvbmZpZ3VyYXRpb24oKSk7Ci0JCWlmIChkZWx0YS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWFkZGVkKGRlbHRhLmFkZGVkKCkpOwotCQlyZW1vdmVkKGRlbHRhLnJlbW92ZWQoKSk7Ci0JCWNoYW5nZWQoZGVsdGEuY2hhbmdlZCgpKTsKLQkJLy9BY3RpdmF0b3Iuc3luY2hyb25pemUoZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSwgbnVsbCk7IC8vIFRPRE8gcHJvcGVyIHByb2dyZXNzIG1vbml0b3Jpbmc/Ci0JfQotCi0JLy8gaXRlcmF0ZSBvdmVyIHRoZSBzaXRlIGxpc3RlbmVycyBhbmQgY29sbGVjdCB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yaWVzCi0JcHVibGljIExpc3QgZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNpdGVJbmZvIGluZm8gPSAoU2l0ZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LmFkZChpbmZvLmdldFJlcG9zaXRvcnkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFRoZSBnaXZlbiBsaXN0IG9mIHNpdGVzIGhhcyBiZWVuIGFkZGVkIHNvIGFkZCBkaXJlY3RvcnkKLQkgKiB3YXRjaGVycyBmb3IgZWFjaCBvZiB0aGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRlZChTaXRlW10gYWRkZWQpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoYWRkZWQgPT0gbnVsbCB8fCBhZGRlZC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRlZC5sZW5ndGg7IGkrKykgewotCQkJU2l0ZSBzaXRlID0gYWRkZWRbaV07Ci0JCQkvLyBUT0RPIHNraXAgZm9yIG5vdwotCQkJaWYgKCJwbGF0Zm9ybTovYmFzZS8iLmVxdWFscyhzaXRlLmdldFVybCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChzaXRlLmdldFVybCgpKTsKLQkJCQl0cnkgewotCQkJCQl1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yUHJvY2Vzc2luZ0NvbmZnLCBlKTsKLQkJCQl9Ci0JCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gQWN0aXZhdG9yLmxvYWRNZXRhZGF0YVJlcG9zaXRvcnkodXJsKTsKLQkJCQlpZiAocmVwbyA9PSBudWxsKSB7Ci0JCQkJCS8vIHRvZG8KLQkJCQl9IGVsc2UKLQkJCQkJc2l0ZXMucHV0KHNpdGUuZ2V0VXJsKCksIG5ldyBTaXRlSW5mbyhzaXRlLCByZXBvKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTWVzc2FnZXMuZXJyb3JQcm9jZXNzaW5nQ29uZmcsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgZ2l2ZW4gbGlzdCBvZiBzaXRlcyBoYXMgYmVlbiByZW1vdmVkIHNvIGFjdCBhY2NvcmRpbmdseS4KLQkgKiBSZW1vdmUgYWxsIHRoZSByZWdpc3RlcmVkIGRpcmVjdG9yeSB3YXRjaGVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlZChTaXRlW10gcmVtb3ZlZCkgewotCQlpZiAocmVtb3ZlZCA9PSBudWxsIHx8IHJlbW92ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKykgewotCQkJU2l0ZSBzaXRlID0gcmVtb3ZlZFtpXTsKLQkJCVNpdGVJbmZvIGluZm8gPSAoU2l0ZUluZm8pIHNpdGVzLmdldChzaXRlLmdldFVybCgpKTsKLQkJCS8vIFRPRE8gSSB0aGluayB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcj8KLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkvLyAKLQkJCX0KLQotCQkJc2l0ZXMucmVtb3ZlKHNpdGUuZ2V0VXJsKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgZ2l2ZW4gc2V0IG9mIHNpdGVzIGhhcyBoYWQgdGhlaXIgY29udGVudHMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlZChDaGFuZ2VbXSBjaGFuZ2VzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDaGFuZ2UgY2hhbmdlID0gY2hhbmdlc1tpXTsKLQkJCWlmIChtYWpvckNoYW5nZShjaGFuZ2UpKSB7Ci0JCQkJcmVtb3ZlZChuZXcgU2l0ZVtdIHtjaGFuZ2Uub2xkU2l0ZX0pOwotCQkJCWFkZGVkKG5ldyBTaXRlW10ge2NoYW5nZS5uZXdTaXRlfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSAyIHNpdGVzIHNob3VsZCBjYXVzZQotCSAqIGEgbmV3IGxpc3RlbmVyIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1ham9yQ2hhbmdlKENoYW5nZSBjaGFuZ2UpIHsKLQkJU2l0ZSBvbmUgPSBjaGFuZ2Uub2xkU2l0ZTsKLQkJU2l0ZSB0d28gPSBjaGFuZ2UubmV3U2l0ZTsKLQkJaWYgKCFVdGlscy5lcXVhbHMob25lLmdldFBvbGljeSgpLCB0d28uZ2V0UG9saWN5KCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAhVXRpbHMuZXF1YWxzKG9uZS5nZXRMaXN0KCksIHR3by5nZXRMaXN0KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjcmVtb3ZlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlZChGaWxlIGZpbGUpIHsKLQkJY2hhbmdlZCA9IGNoYW5nZWQgfHwgUExBVEZPUk1fWE1MLmVxdWFscyhmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI3N0YXJ0UG9sbCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRQb2xsKCkgewotCQljaGFuZ2VkID0gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNzdG9wUG9sbCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0JCWlmIChjaGFuZ2VkKQotCQkJdHJ5IHsKLQkJCQlwcm9jZXNzKCk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCWNoYW5nZWQgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9Qcm9maWxlU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUHJvZmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjhiNTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9Qcm9maWxlU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIGlkZWFzIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogU3luY2hyb25pemVzIGEgcHJvZmlsZSB3aXRoIGEgc2V0IG9mIHJlcG9zaXRvcmllcy4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVTeW5jaHJvbml6ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBTX0ZJTEVfUFJFRklYID0gInRpbWVzdGFtcHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfVElNRVNUQU1QID0gIlBST0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RJTUVTVEFNUCA9ICItMSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9JVSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRyb3BpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgY2xhc3MgTGlzdENvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvciB7Ci0JCXB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGlzdCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYVEVOU0lPTlMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jYWNoZS5leHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBFID0gInwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgSVByb2ZpbGUgcHJvZmlsZTsKLQotCWZpbmFsIE1hcCByZXBvc2l0b3J5TWFwOwotCXByaXZhdGUgUHJvcGVydGllcyB0aW1lc3RhbXBzOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQcm9maWxlU3luY2hyb25pemVyKElQcm9maWxlIHByb2ZpbGUsIENvbGxlY3Rpb24gcmVwb3NpdG9yaWVzKSB7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JCXRoaXMucmVwb3NpdG9yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCXJlcG9zaXRvcnlNYXAucHV0KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpLCByZXBvc2l0b3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogU3luY2hyb25pemUgdGhlIHByb2ZpbGUgd2l0aCB0aGUgbGlzdCBvZiBtZXRhZGF0YSByZXBvc2l0b3JpZXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgc3luY2hyb25pemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJlYWRUaW1lc3RhbXBzKCk7Ci0JCWlmIChpc1VwVG9EYXRlKCkpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IHN5bmNocm9uaXplQ2FjaGVFeHRlbnNpb25zKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gY3JlYXRlUHJvZmlsZUNoYW5nZVJlcXVlc3QoY29udGV4dCk7Ci0KLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEwMCk7Ci0JCXRyeSB7Ci0JCQkvL2NyZWF0ZSB0aGUgcHJvdmlzaW9uaW5nIHBsYW4KLQkJCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IGNyZWF0ZVByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgY29udGV4dCwgc3ViLm5ld0NoaWxkKDUwKSk7Ci0KLQkJCXN0YXR1cyA9IHBsYW4uZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiB8fCBwbGFuLmdldE9wZXJhbmRzKCkubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIHN0YXR1czsKLQotCQkJLy9pbnZva2UgdGhlIGVuZ2luZSB0byBwZXJmb3JtIGluc3RhbGxzL3VuaW5zdGFsbHMKLQkJCUlTdGF0dXMgZW5naW5lUmVzdWx0ID0gZXhlY3V0ZVBsYW4ocGxhbiwgY29udGV4dCwgc3ViLm5ld0NoaWxkKDUwKSk7Ci0KLQkJCWlmICghZW5naW5lUmVzdWx0LmlzT0soKSkKLQkJCQlyZXR1cm4gZW5naW5lUmVzdWx0OwotCQkJd3JpdGVUaW1lc3RhbXBzKCk7Ci0KLQkJCWFwcGx5Q29uZmlndXJhdGlvbigpOwotCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJc3ViLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVRpbWVzdGFtcHMoKSB7Ci0JCXRpbWVzdGFtcHMuY2xlYXIoKTsKLQkJdGltZXN0YW1wcy5wdXQoUFJPRklMRV9USU1FU1RBTVAsIExvbmcudG9TdHJpbmcocHJvZmlsZS5nZXRUaW1lc3RhbXAoKSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCU1hcCBwcm9wcyA9IHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpOwotCQkJU3RyaW5nIHRpbWVzdGFtcCA9IG51bGw7Ci0JCQlpZiAocHJvcHMgIT0gbnVsbCkKLQkJCQl0aW1lc3RhbXAgPSAoU3RyaW5nKSBwcm9wcy5nZXQoSVJlcG9zaXRvcnkuUFJPUF9USU1FU1RBTVApOwotCi0JCQlpZiAodGltZXN0YW1wID09IG51bGwpCi0JCQkJdGltZXN0YW1wID0gTk9fVElNRVNUQU1QOwotCi0JCQl0aW1lc3RhbXBzLnB1dChlbnRyeS5nZXRLZXkoKSwgdGltZXN0YW1wKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFRJTUVTVEFNUFNfRklMRV9QUkVGSVggKyBwcm9maWxlLmdldFByb2ZpbGVJZCgpLmhhc2hDb2RlKCkpOwotCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJdGltZXN0YW1wcy5zYXZlKG9zLCAiVGltZXN0YW1wcyBmb3IgIiArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChvcyAhPSBudWxsKQotCQkJCQlvcy5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwVG9EYXRlKCkgewotCQlTdHJpbmcgbGFzdEtub3duUHJvZmlsZVRpbWVTdGFtcCA9IChTdHJpbmcpIHRpbWVzdGFtcHMucmVtb3ZlKFBST0ZJTEVfVElNRVNUQU1QKTsKLQkJaWYgKGxhc3RLbm93blByb2ZpbGVUaW1lU3RhbXAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFsYXN0S25vd25Qcm9maWxlVGltZVN0YW1wLmVxdWFscyhMb25nLnRvU3RyaW5nKHByb2ZpbGUuZ2V0VGltZXN0YW1wKCkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL1doZW4gd2UgZ2V0IGhlcmUgdGhlIHRpbWVzdGFtcHMgbWFwIG9ubHkgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byByZXBvcwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJTWFwIHByb3BzID0gcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlTdHJpbmcgY3VycmVudFRpbWVzdGFtcCA9IG51bGw7Ci0JCQlpZiAocHJvcHMgIT0gbnVsbCkKLQkJCQljdXJyZW50VGltZXN0YW1wID0gKFN0cmluZykgcHJvcHMuZ2V0KElSZXBvc2l0b3J5LlBST1BfVElNRVNUQU1QKTsKLQotCQkJaWYgKGN1cnJlbnRUaW1lc3RhbXAgPT0gbnVsbCkKLQkJCQljdXJyZW50VGltZXN0YW1wID0gTk9fVElNRVNUQU1QOwotCi0JCQlTdHJpbmcgbGFzdEtub3duVGltZXN0YW1wID0gKFN0cmluZykgdGltZXN0YW1wcy5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJLy9BIHJlcG8gaGFzIGJlZW4gYWRkZWQgCi0JCQlpZiAobGFzdEtub3duVGltZXN0YW1wID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFsYXN0S25vd25UaW1lc3RhbXAuZXF1YWxzKGN1cnJlbnRUaW1lc3RhbXApKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vQSByZXBvIGhhcyBiZWVuIHJlbW92ZWQKLQkJaWYgKHRpbWVzdGFtcHMuc2l6ZSgpICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRUaW1lc3RhbXBzKCkgewotCQlGaWxlIGZpbGUgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFRJTUVTVEFNUFNfRklMRV9QUkVGSVggKyBwcm9maWxlLmdldFByb2ZpbGVJZCgpLmhhc2hDb2RlKCkpOwotCQl0aW1lc3RhbXBzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQl0cnkgewotCQkJCXRpbWVzdGFtcHMubG9hZChpcyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQlpcy5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvdmlzaW9uaW5nQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlBcnJheUxpc3QgcmVwb1VSTHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXBvc2l0b3J5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJcmVwb1VSTHMuYWRkKG5ldyBVUkwoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KChVUkxbXSkgcmVwb1VSTHMudG9BcnJheShuZXcgVVJMW3JlcG9VUkxzLnNpemUoKV0pKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgc3luY2hyb25pemVDYWNoZUV4dGVuc2lvbnMoKSB7Ci0JCUxpc3QgY3VycmVudEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3J5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5SWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IEFjdGl2YXRvci5sb2FkQXJ0aWZhY3RSZXBvc2l0b3J5KG5ldyBVUkwocmVwb3NpdG9yeUlkKSk7Ci0KLQkJCQlpZiAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSB7Ci0JCQkJCWN1cnJlbnRFeHRlbnNpb25zLmFkZChyZXBvc2l0b3J5SWQpOwotCQkJCQlidWZmZXIuYXBwZW5kKHJlcG9zaXRvcnlJZCk7Ci0JCQkJCWlmIChpdC5oYXNOZXh0KCkpCi0JCQkJCQlidWZmZXIuYXBwZW5kKFBJUEUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIHVuZXhwZWN0ZWQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBjdXJyZW50RXh0ZW5zaW9uc1Byb3BlcnR5ID0gKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBidWZmZXIudG9TdHJpbmcoKTsKLQotCQlMaXN0IHByZXZpb3VzRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIHByZXZpb3VzRXh0ZW5zaW9uc1Byb3BlcnR5ID0gcHJvZmlsZS5nZXRQcm9wZXJ0eShDQUNIRV9FWFRFTlNJT05TKTsKLQkJaWYgKHByZXZpb3VzRXh0ZW5zaW9uc1Byb3BlcnR5ICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZXZpb3VzRXh0ZW5zaW9uc1Byb3BlcnR5LCBQSVBFKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJcHJldmlvdXNFeHRlbnNpb25zLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByZXZpb3VzRXh0ZW5zaW9ucy5zaXplKCkgPT0gY3VycmVudEV4dGVuc2lvbnMuc2l6ZSgpICYmIHByZXZpb3VzRXh0ZW5zaW9ucy5jb250YWluc0FsbChjdXJyZW50RXh0ZW5zaW9ucykpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlPcGVyYW5kIG9wZXJhbmQgPSBuZXcgUHJvcGVydHlPcGVyYW5kKENBQ0hFX0VYVEVOU0lPTlMsIHByZXZpb3VzRXh0ZW5zaW9uc1Byb3BlcnR5LCBjdXJyZW50RXh0ZW5zaW9uc1Byb3BlcnR5KTsKLQotCQlyZXR1cm4gZXhlY3V0ZU9wZXJhbmRzKG5ldyBQcm92aXNpb25pbmdDb250ZXh0KG5ldyBVUkxbMF0pLCBuZXcgT3BlcmFuZFtdIHtvcGVyYW5kfSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZVJvb3RJVShMaXN0IGNoaWxkcmVuKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRJZChTVVBFUl9JVSk7Ci0JCWl1LnNldFZlcnNpb24obmV3IFZlcnNpb24oIjEuMC4wLnYiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLQkJTGlzdCByZXF1aXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IG5leHQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlci5uZXh0KCk7Ci0JCQlyZXF1aXJlZC5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbmV4dC5nZXRJZCgpLCBudWxsLCBudWxsLCBmYWxzZSAvKiBvcHRpb25hbCAqLywgZmFsc2UsIHRydWUpKTsKLQkJfQotCQlpZiAocmVxdWlyZWQuc2l6ZSgpID4gMCkKLQkJCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgcmVxdWlyZWQudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXVpcmVkLnNpemUoKV0pKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCXByaXZhdGUgUHJvZmlsZUNoYW5nZVJlcXVlc3QgY3JlYXRlUHJvZmlsZUNoYW5nZVJlcXVlc3QoUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCUxpc3QgdG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZGVmYXVsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ29sbGVjdG9yIGFsbElVcyA9IGdldEFsbElVc0Zyb21SZXBvcygpOwotCi0JCS8vTm90aGluZyBoYXMgY2hhbmdlZAotCQlJSW5zdGFsbGFibGVVbml0IHByZXZpb3VzID0gZ2V0SVUoU1VQRVJfSVUpOwotCQkvL0VtcHR5IHJlcG8KLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlpZiAoYWxsSVVzLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAocHJldmlvdXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJLy9SZXF1ZXN0IHRoZSByZW1vdmFsIG9mIHRoZSBzdXBlciBJVQotCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3ByZXZpb3VzfSk7Ci0JCQlyZXR1cm4gcmVxdWVzdDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlkZWZhdWx0cy5hZGQoY3JlYXRlRGVmYXVsdElVKGl1KSk7Ci0JCQl0b0FkZC5hZGQoY3JlYXRlSW5jbHVkZWRJVShpdSkpOwotCQkJaWYgKEJvb2xlYW4udmFsdWVPZihpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9HUk9VUCkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCXJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1LCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPRklMRV9ST09UX0lVLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlMaXN0IGV4dHJhID0gbmV3IEFycmF5TGlzdCgpOwotCQlleHRyYS5hZGRBbGwoZGVmYXVsdHMpOwotCQlleHRyYS5hZGRBbGwodG9BZGQpOwotCQljb250ZXh0LnNldEV4dHJhSVVzKGV4dHJhKTsKLQotCQkvLyBvbmx5IGFkZCBvbmUgSVUgdG8gdGhlIHJlcXVlc3QuIGl0IHdpbGwgY29udGFpbiBhbGwgdGhlIG90aGVyIElVcyB3ZSB3YW50IHRvIGluc3RhbGwKLQkJSUluc3RhbGxhYmxlVW5pdCByb290SVUgPSBjcmVhdGVSb290SVUodG9BZGQpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cm9vdElVfSk7Ci0KLQkJLy9SZXF1ZXN0IHRoZSByZW1vdmFsIG9mIHRoZSBwcmV2aW91cyBzdXBlciBJVQotCQlpZiAocHJldmlvdXMgIT0gbnVsbCkKLQkJCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtwcmV2aW91c30pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3RvciBnZXRBbGxJVXNGcm9tUmVwb3MoKSB7Ci0JCUNvbGxlY3RvciBhbGxSZXBvcyA9IG5ldyBDb2xsZWN0b3IoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcnlNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlyZXBvc2l0b3J5LnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgYWxsUmVwb3MsIG51bGwpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGFsbFJlcG9zOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJbmNsdWRlZElVKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXVkID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdWQuc2V0SWQoaXUuZ2V0SWQoKSk7Ci0JCWl1ZC5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDAsIDAsIDAsIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSl9OwotCQlpdWQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxcyk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1ZCk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZURlZmF1bHRJVShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ZCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXVkLnNldElkKGl1LmdldElkKCkpOwotCQlpdWQuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigwLCAwLCAwKSk7Ci0JCWl1ZC5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBpdS5nZXRJZCgpLCBuZXcgVmVyc2lvbigwLCAwLCAwKSl9KTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXVkKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZ2V0SVUoU3RyaW5nIGl1SWQpIHsKLQkJTGlzdENvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTGlzdENvbGxlY3RvcigpOwotCQlwcm9maWxlLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpdUlkKSwgY29sbGVjdG9yLCBudWxsKTsKLQkJaWYgKGNvbGxlY3Rvci5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBjb2xsZWN0b3IuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUHJvdmlzaW9uaW5nUGxhbiBjcmVhdGVQcm92aXNpb25pbmdQbGFuKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QsIFByb3Zpc2lvbmluZ0NvbnRleHQgcHJvdmlzaW9uaW5nQ29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlQbGFubmVyIHBsYW5uZXIgPSAoSVBsYW5uZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcXVlc3QsIHByb3Zpc2lvbmluZ0NvbnRleHQsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBleGVjdXRlUGxhbihQcm92aXNpb25pbmdQbGFuIHBsYW4sIFByb3Zpc2lvbmluZ0NvbnRleHQgcHJvdmlzaW9uaW5nQ29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU9wZXJhbmRbXSBvcGVyYW5kcyA9IHBsYW4uZ2V0T3BlcmFuZHMoKTsKLQkJcmV0dXJuIGV4ZWN1dGVPcGVyYW5kcyhwcm92aXNpb25pbmdDb250ZXh0LCBvcGVyYW5kcywgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGV4ZWN1dGVPcGVyYW5kcyhQcm92aXNpb25pbmdDb250ZXh0IHByb3Zpc2lvbmluZ0NvbnRleHQsIE9wZXJhbmRbXSBvcGVyYW5kcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElFbmdpbmUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSUVuZ2luZSBlbmdpbmUgPSAoSUVuZ2luZSkgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXRyeSB7Ci0JCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBEZWZhdWx0UGhhc2VTZXQoKTsKLQkJCUlTdGF0dXMgZW5naW5lUmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBwcm92aXNpb25pbmdDb250ZXh0LCBtb25pdG9yKTsKLQkJCXJldHVybiBlbmdpbmVSZXN1bHQ7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBXcml0ZSBvdXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwbHlDb25maWd1cmF0aW9uKCkgewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChDb25maWd1cmF0b3IpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl0cnkgewotCQkJY29uZmlndXJhdG9yLmFwcGx5Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiVW5leHBlY3RlZCBmYWlsdXJlIGFwcGx5aW5nIGNvbmZpZ3VyYXRpb24iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZURlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvU2l0ZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDJhZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1NpdGVEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGUuU2l0ZTsKLQotLyoKLSAqIFJlcHJlc2VudHMgdGhlIGNoYW5nZXMgYmV0d2VlbiAyIGxpc3RzIG9mIHNpdGVzLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZURlbHRhIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9CQVNFID0gInBsYXRmb3JtOi9iYXNlLyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBjbGFzcyBDaGFuZ2UgewotCQlTaXRlIG9sZFNpdGU7Ci0JCVNpdGUgbmV3U2l0ZTsKLQotCQlDaGFuZ2UoU2l0ZSBvbGRTaXRlLCBTaXRlIG5ld1NpdGUpIHsKLQkJCXRoaXMub2xkU2l0ZSA9IG9sZFNpdGU7Ci0JCQl0aGlzLm5ld1NpdGUgPSBuZXdTaXRlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGFkZGVkID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCByZW1vdmVkID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBjaGFuZ2VkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBkZWx0YSBvYmplY3QgYmFzZWQgb24gdGhlIHR3byBnaXZlbiBsaXN0cyBvZgotCSAqIHNpdGUgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNpdGVEZWx0YSBjcmVhdGUoTGlzdCBvbmVMaXN0LCBMaXN0IHR3b0xpc3QpIHsKLQkJU2l0ZVtdIG9uZSA9IChTaXRlW10pIG9uZUxpc3QudG9BcnJheShuZXcgU2l0ZVtvbmVMaXN0LnNpemUoKV0pOwotCQlTaXRlW10gdHdvID0gKFNpdGVbXSkgdHdvTGlzdC50b0FycmF5KG5ldyBTaXRlW3R3b0xpc3Quc2l6ZSgpXSk7Ci0JCVNpdGVEZWx0YSByZXN1bHQgPSBuZXcgU2l0ZURlbHRhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBvbmUgPT0gbnVsbCB8fCBpIDwgb25lLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCB0d28ubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAodHdvW2pdICE9IG51bGwgJiYgb25lW2ldLmdldFVybCgpLmVxdWFscyh0d29bal0uZ2V0VXJsKCkpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJLy8gVE9ETwotCQkJCQlpZiAoIW9uZVtpXS5nZXRVcmwoKS5lcXVhbHMoUExBVEZPUk1fQkFTRSkgJiYgIW9uZVtpXS5lcXVhbHModHdvW2pdKSkKLQkJCQkJCXJlc3VsdC5jaGFuZ2VkLmFkZChuZXcgQ2hhbmdlKG9uZVtpXSwgdHdvW2pdKSk7Ci0JCQkJCW9uZVtpXSA9IG51bGw7Ci0JCQkJCXR3b1tqXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy8gVE9ETwotCQkJaWYgKCFmb3VuZCAmJiAhUExBVEZPUk1fQkFTRS5lcXVhbHMob25lW2ldLmdldFVybCgpKSkKLQkJCQlyZXN1bHQucmVtb3ZlZC5hZGQob25lW2ldKTsKLQkJfQotCQlmb3IgKGludCBqID0gMDsgaiA8IHR3by5sZW5ndGg7IGorKykgewotCQkJLy8gVE9ETwotCQkJaWYgKHR3b1tqXSAhPSBudWxsICYmICFQTEFURk9STV9CQVNFLmVxdWFscyh0d29bal0uZ2V0VXJsKCkpKQotCQkJCXJlc3VsdC5hZGRlZC5hZGQodHdvW2pdKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgc2l0ZXMgdGhhdCB3ZXJlIGFkZGVkLiBNYXkgcmV0dXJuIGFuIGVtcHR5IGxpc3QKLQkgKiBidXQgbmV2ZXIgcmV0dXJucyBudWxsLgotCSAqLwotCXB1YmxpYyBTaXRlW10gYWRkZWQoKSB7Ci0JCXJldHVybiAoU2l0ZVtdKSBhZGRlZC50b0FycmF5KG5ldyBTaXRlW2FkZGVkLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgc2l0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuIE1heSByZXR1cm4gYW4gZW1wdHkgbGlzdAotCSAqIGJ1dCBuZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIFNpdGVbXSByZW1vdmVkKCkgewotCQlyZXR1cm4gKFNpdGVbXSkgcmVtb3ZlZC50b0FycmF5KG5ldyBTaXRlW3JlbW92ZWQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBzaXRlIGNoYW5nZXMgdGhhdCB3ZXJlIGNoYW5nZWQuIE1heSByZXR1cm4gYW4gZW1wdHkgbGlzdAotCSAqIGJ1dCBuZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIENoYW5nZVtdIGNoYW5nZWQoKSB7Ci0JCXJldHVybiAoQ2hhbmdlW10pIGNoYW5nZWQudG9BcnJheShuZXcgQ2hhbmdlW2NoYW5nZWQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGFueQotCSAqIGNoYW5nZXMgaW4gdGhpcyBkZWx0YS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gYWRkZWQuc2l6ZSgpID09IDAgJiYgcmVtb3ZlZC5zaXplKCkgPT0gMCAmJiBjaGFuZ2VkLnNpemUoKSA9PSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9TaXRlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1NpdGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTE4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1NpdGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS5TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKgotICogSW50ZXJuYWwgY2xhc3MgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2F0Y2hlcnMgYW5kIHNpdGVzLiBVc2VkIGZvciBjYWNoaW5nLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUluZm8gewotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCXByaXZhdGUgU2l0ZSBzaXRlOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCXB1YmxpYyBTaXRlSW5mbyhTaXRlIHNpdGUsIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNpdGUgPSBzaXRlOwotCQl0aGlzLnVybCA9IHNpdGUuZ2V0VXJsKCk7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIFNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHVybC5oYXNoQ29kZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2l0ZUluZm8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTaXRlSW5mbyBvdGhlciA9IChTaXRlSW5mbykgb2JqOwotCQkvLyB0aGlzIGlzIG9rIGJlY2F1c2UgdGhleSBhcmUgc3RyaW5ncyBhbmQgbm90IHJlYWwgVVJMcwotCQlyZXR1cm4gdXJsLmVxdWFscyhvdGhlci5nZXRVcmwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxOWU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yUHJvY2Vzc2luZ0NvbmZnPUV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmI3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2NzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQ5YjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjEwOjEwIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiY2MzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogU2FyIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMS4wCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQwYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhNjMzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogVGhlIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBkaXNjbG9zZXMgaXRzIGd1dHMgKGludGVybmFsIGJ5dGUgYnVmZmVyIGFuZAotICogYnl0ZSBidWZmZXIgbGVuZ3RoKSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uIG9mIGJ5dGUgYXJyYXlzIHVzdWFsbHkKLSAqIGludm9sdmVkIHdpdGggdG9CeXRlQXJyYXkoKS4KLSAqLwotcHVibGljIGNsYXNzIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRpcmVjdCBieXRlIGFycmF5IG91dHB1dCBzdHJlYW0uIFRoZSBidWZmZXIgY2FwYWNpdHkgaXMKLQkgKiBpbml0aWFsbHkgYXMgZGVmaW5lZCBieSBzdXBlciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtLCB3aXRoIGEgYnVmZmVyIGNhcGFjaXR5IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzaXplLCBpbiBieXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHNpemUgaXMgbmVnYXRpdmUuCi0JICovCi0JcHVibGljIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbShpbnQgc2l6ZSkgewotCQlzdXBlcihzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdHVhbCBpbnRlcm5hbCBieXRlIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGludGVybmFsIGJ5dGUgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBzdXBlci5idWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBpbnRlcm5hbCBieXRlIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0QnVmZmVyTGVuZ3RoKCkgewotCQlyZXR1cm4gc3VwZXIuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBjb250YWluaW5nIGFsbCB0aGUgKHNoYXJlZCkgYnl0ZXMgdGhpcyBvdXRwdXQKLQkgKiBzdHJlYW0gaGFzIGFscmVhZHkgY29uc3VtZWQuCi0JICogCi0JICogQHJldHVybiBCeXRlQXJyYXlJbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdXBlci5idWYsIDAsIHN1cGVyLmNvdW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNiYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi0vKioKLSAqIFNhciBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBTYXJDb25zdGFudHMgewotCi0JLyoqIDxjb2RlPlNBUkZJTEVfTUFSS0VSPC9jb2RlPiAqLwotCVN0cmluZyBTQVJGSUxFX01BUktFUiA9ICJTYXJGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIDxjb2RlPlNBUkZJTEVfVkVSU0lPTjwvY29kZT4gKi8KLQlpbnQgU0FSRklMRV9WRVJTSU9OID0gMjsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPkRFRkFVTFRfRU5DT0RJTkc8L2NvZGU+Ci0JICovCi0JU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWJ1ZwotCSAqLwotCWJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTJmMjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotCi0vKioKLSAqIEEgU2FyRW50cnkgaXMgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgYW4gZW50cnkgd2l0aGluIGEKLSAqIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIHN0cmVhbS48YnI+Ci0gKiA8Yj5Ob3RlOiA8L2I+VGhlIHNldFRpbWUoKSBhbmQgZ2V0VGltZSgpIG1ldGhvZHMgb2YgWmlwRW50cnkgKG91ciBzdXBlcgotICogY2xhc3MpIHBlcmZvcm0gdGltZSB6b25lIGRlcGVuZGVudCAoISkgY29udmVyc2lvbnMuIEZvciBvdXIgc2VyaWFsaXphdGlvbiBhbmQKLSAqIGRlc2VyaWFsaXphdGlvbiB0aGUgc3RvcmVkIHRpbWUgaGFzIHRvIGJlIHRpbWUgem9uZSBuZXV0cmFsLiBUaGVyZWZvcmUgaXQgaXMKLSAqIG5lY2Vzc2FyeSB0byBpbnZlcnQgdGhvc2UgY2FsY3VsYXRpb25zLiBUaGlzIGlzIGFsc28gdGhlIHJlYXNvbiBmb3IKLSAqIGR1cGxpY2F0aW5nIHRoZSBqYXZhVG9Eb3NUaW1lKCkgYW5kIGRvc1RvSmF2YVRpbWUoKSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgU2FyRW50cnkgZXh0ZW5kcyBaaXBFbnRyeSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFb2Y7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWmlwOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVvZiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9GX0VOVFJZX05BTUUgPSAiPGVvZi1vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcj4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gU2FyQ29uc3RhbnRzLkRFQlVHOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlb2Ygb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgZW50cnkKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoKSB7Ci0JCXN1cGVyKEVPRl9FTlRSWV9OQU1FKTsKLQkJc2V0TWV0aG9kKFppcEVudHJ5LkRFRkxBVEVEKTsKLQkJdGhpcy5pc0VvZiA9IHRydWU7Ci0JCXRoaXMuaXNaaXAgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gemlwRW50cnkKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoWmlwRW50cnkgemlwRW50cnkpIHsKLQkJc3VwZXIoemlwRW50cnkpOwotCQl0aGlzLmlzWmlwID0gZmFsc2U7Ci0JCXRoaXMuaXNFb2YgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gemlwRW50cnkKLQkgKiBAcGFyYW0gaXNaaXAKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoWmlwRW50cnkgemlwRW50cnksIGJvb2xlYW4gaXNaaXApIHsKLQkJc3VwZXIoemlwRW50cnkpOwotCQl0aGlzLmlzWmlwID0gaXNaaXA7Ci0JCXRoaXMuaXNFb2YgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FySW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhckVudHJ5KFNhcklucHV0U3RyZWFtIHNhcklucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIG5hbWUhCi0JCXN1cGVyKHNhcklucHV0U3RyZWFtLnJlYWRTdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIGNvbW1lbnQgPSBzYXJJbnB1dFN0cmVhbS5yZWFkU3RyaW5nKCk7Ci0JCWxvbmcgY29tcHJlc3NlZFNpemUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlsb25nIGNyYyA9IHNhcklucHV0U3RyZWFtLnJlYWRMb25nKCk7Ci0JCWJ5dGVbXSBleHRyYSA9IHNhcklucHV0U3RyZWFtLnJlYWRCeXRlcygpOwotCQlpbnQgbWV0aG9kID0gc2FySW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQlsb25nIHNpemUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlsb25nIGRvc1RpbWUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlib29sZWFuIGlzRW9mID0gc2FySW5wdXRTdHJlYW0ucmVhZEJvb2xlYW4oKTsKLQkJYm9vbGVhbiBpc1ppcCA9IHNhcklucHV0U3RyZWFtLnJlYWRCb29sZWFuKCk7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TmFtZSgpICsgIiwiICsgY29tbWVudCArICIsIiArIGNvbXByZXNzZWRTaXplICsgIiwiICsgY3JjICsgIiwiICsgZXh0cmEgKyAiLCIgKyBtZXRob2QgKyAiLCIgKyBzaXplICsgIiwiICsgZG9zVGltZSArICIsIiArIGlzRW9mICsgIiwiICsgaXNaaXApOwotCQl9Ci0KLQkJaWYgKG1ldGhvZCA9PSBaaXBFbnRyeS5TVE9SRUQpIHsKLQkJCXNldENvbXByZXNzZWRTaXplKGNvbXByZXNzZWRTaXplKTsKLQkJCXNldENyYyhjcmMpOwotCQkJc2V0U2l6ZShzaXplKTsKLQkJfQotCi0JCXNldENvbW1lbnQoY29tbWVudCk7Ci0JCXNldEV4dHJhKGV4dHJhKTsKLQkJc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCXNldFRpbWUoZG9zVG9KYXZhVGltZShkb3NUaW1lKSk7Ci0JCXNldEVvZihpc0VvZik7Ci0JCXNldFppcChpc1ppcCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNhck91dHB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKFNhck91dHB1dFN0cmVhbSBzYXJPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb21tZW50ID0gdGhpcy5nZXRDb21tZW50KCk7Ci0JCWxvbmcgY29tcHJlc3NlZFNpemUgPSB0aGlzLmdldENvbXByZXNzZWRTaXplKCk7Ci0JCWxvbmcgY3JjID0gdGhpcy5nZXRDcmMoKTsKLQkJYnl0ZVtdIGV4dHJhID0gdGhpcy5nZXRFeHRyYSgpOwotCQlpbnQgbWV0aG9kID0gdGhpcy5nZXRNZXRob2QoKTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJbG9uZyBzaXplID0gdGhpcy5nZXRTaXplKCk7Ci0JCWxvbmcgZG9zVGltZSA9IGphdmFUb0Rvc1RpbWUodGhpcy5nZXRUaW1lKCkpOwotCQlib29sZWFuIGlzWmlwID0gdGhpcy5pc1ppcCgpOwotCQlib29sZWFuIGlzRW9mID0gdGhpcy5pc0VvZigpOwotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiLCIgKyBjb21tZW50ICsgIiwiICsgY29tcHJlc3NlZFNpemUgKyAiLCIgKyBjcmMgKyAiLCIgKyBleHRyYSArICIsIiArIG1ldGhvZCArICIsIiArIHNpemUgKyAiLCIgKyBkb3NUaW1lICsgIiwiICsgaXNFb2YgKyAiLCIgKyBpc1ppcCk7Ci0JCX0KLQotCQlzYXJPdXRwdXRTdHJlYW0ud3JpdGVTdHJpbmcobmFtZSk7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZVN0cmluZyhjb21tZW50KTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhjb21wcmVzc2VkU2l6ZSk7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZUxvbmcoY3JjKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlQnl0ZXMoZXh0cmEpOwotCQlzYXJPdXRwdXRTdHJlYW0ud3JpdGVJbnQobWV0aG9kKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhzaXplKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhkb3NUaW1lKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlQm9vbChpc0VvZik7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZUJvb2woaXNaaXApOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgdGhlIGVvZiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBlbnRyeT8KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhbnN3ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VvZigpIHsKLQkJcmV0dXJuIGlzRW9mOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFb2YoYm9vbGVhbiBpc0VvZikgewotCQl0aGlzLmlzRW9mID0gaXNFb2Y7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNaaXAoKSB7Ci0JCXJldHVybiBpc1ppcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNaaXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0WmlwKGJvb2xlYW4gaXNaaXApIHsKLQkJdGhpcy5pc1ppcCA9IGlzWmlwOwotCX0KLQotCS8qCi0JICogQ29udmVydHMgRE9TIHRpbWUgdG8gSmF2YSB0aW1lIChudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoKS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgZG9zVG9KYXZhVGltZShsb25nIGR0aW1lKSB7Ci0JCURhdGUgZCA9IG5ldyBEYXRlKChpbnQpICgoKGR0aW1lID4+IDI1KSAmIDB4N2YpICsgODApLCAoaW50KSAoKChkdGltZSA+PiAyMSkgJiAweDBmKSAtIDEpLCAoaW50KSAoKGR0aW1lID4+IDE2KSAmIDB4MWYpLCAoaW50KSAoKGR0aW1lID4+IDExKSAmIDB4MWYpLCAoaW50KSAoKGR0aW1lID4+IDUpICYgMHgzZiksIChpbnQpICgoZHRpbWUgPDwgMSkgJiAweDNlKSk7Ci0JCXJldHVybiBkLmdldFRpbWUoKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnRzIEphdmEgdGltZSB0byBET1MgdGltZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgamF2YVRvRG9zVGltZShsb25nIHRpbWUpIHsKLQkJRGF0ZSBkID0gbmV3IERhdGUodGltZSk7Ci0JCWludCB5ZWFyID0gZC5nZXRZZWFyKCkgKyAxOTAwOwotCQlpZiAoeWVhciA8IDE5ODApIHsKLQkJCXJldHVybiAoMSA8PCAyMSkgfCAoMSA8PCAxNik7Ci0JCX0KLQkJcmV0dXJuICh5ZWFyIC0gMTk4MCkgPDwgMjUgfCAoZC5nZXRNb250aCgpICsgMSkgPDwgMjEgfCBkLmdldERhdGUoKSA8PCAxNiB8IGQuZ2V0SG91cnMoKSA8PCAxMSB8IGQuZ2V0TWludXRlcygpIDw8IDUgfCBkLmdldFNlY29uZHMoKSA+PiAxOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FySW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhcklucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMmFiZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhlIFNhcklucHV0U3RyZWFtIHJlYWRzIGEgc3RyZWFtaW5nIGFyY2hpdmUgYXMgYW4gSW5wdXRTdHJlYW0uIE1ldGhvZHMgYXJlCi0gKiBwcm92aWRlZCB0byBwb3NpdGlvbiBhdCBlYWNoIHN1Y2Nlc3NpdmUgZW50cnkgaW4gdGhlIGFyY2hpdmUsIGFuZCB0aGUgcmVhZAotICogZWFjaCBlbnRyeSBhcyBhIG5vcm1hbCBpbnB1dCBzdHJlYW0gdXNpbmcgcmVhZCgpLgotICovCi1wdWJsaWMgY2xhc3MgU2FySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGZpbmFsIERhdGFJbnB1dFN0cmVhbSBkYXRhSW5wdXRTdHJlYW07Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbjsKLQlwcml2YXRlIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2FySW5wdXRTdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHVzZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2FySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5kYXRhSW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLQotCQkvLyBTYXJGaWxlIG1hcmtlcgotCQlTdHJpbmcgbWFya2VyID0gcmVhZFN0cmluZygpOwotCQlpZiAoIW1hcmtlci5lcXVhbHMoU2FyQ29uc3RhbnRzLlNBUkZJTEVfTUFSS0VSKSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEb2VzIG5vdCBjb250YWluIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIG1hcmtlci4iKTsKLQkJfQotCi0JCS8vIFNhckZpbGUgdmVyc2lvbgotCQl2ZXJzaW9uID0gZGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaWYgKHZlcnNpb24gIT0gU2FyQ29uc3RhbnRzLlNBUkZJTEVfVkVSU0lPTikgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoaXMgc3RyZWFtLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZGF0YUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2UgZG8gbm90IHN1cHBvcnQgbWFya2luZyBqdXN0IHlldCwgd2UgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEByZXR1cm4gRmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG1hcmtpbmcganVzdCB5ZXQsIHdlIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG1hcmtMaW1pdAotCSAqICAgICAgICAgICAgVGhlIGxpbWl0IHRvIG1hcmsuCi0JICovCi0JcHVibGljIHZvaWQgbWFyayhpbnQgbWFya0xpbWl0KSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtYXJraW5nIGp1c3QgeWV0LCB3ZSBkbyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZS4gVGhpcyB3aWxsIHNraXAKLQkgKiBvdmVyIGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY3VycmVudCBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLCBhbmQgcGxhY2UKLQkgKiB0aGUgaW5wdXQgc3RyZWFtIGF0IHRoZSBoZWFkZXIgb2YgdGhlIG5leHQgZW50cnksIGFuZCByZWFkIHRoZSBoZWFkZXIgYW5kCi0JICogaW5zdGFudGlhdGUgYSBuZXcgU2FyRW50cnkgZnJvbSB0aGUgaGVhZGVyIGJ5dGVzIGFuZCByZXR1cm4gdGhhdCBlbnRyeS4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBhcmNoaXZlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgdG8KLQkgKiBpbmRpY2F0ZSB0aGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgaGFzIGJlZW4gcmVhY2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IFNhckVudHJ5IGluIHRoZSBhcmNoaXZlLCBvciBudWxsLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyBTYXJFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTYXJFbnRyeSBzYXJFbnRyeSA9IG5ldyBTYXJFbnRyeSh0aGlzKTsKLQkJaWYgKHNhckVudHJ5LmlzRW9mKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlieXRlW10gY29udGVudCA9IHJlYWRCeXRlcygpOwotCQljb250ZW50U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCQlyZXR1cm4gc2FyRW50cnk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgZW50cnkuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnl0ZXMgPSByZWFkQnl0ZXMoKTsKLQkJaWYgKGJ5dGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gbmV3IFN0cmluZyhieXRlcywgU2FyQ29uc3RhbnRzLkRFRkFVTFRfRU5DT0RJTkcpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCWJ5dGVbXSByZWFkQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaWYgKGxlbmd0aCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07Ci0JCWRhdGFJbnB1dFN0cmVhbS5yZWFkRnVsbHkoYnl0ZXMsIDAsIGxlbmd0aCk7Ci0JCXJldHVybiBieXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBkYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRhdGFJbnB1dFN0cmVhbS5yZWFkQm9vbGVhbigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbG9uZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRhdGFJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBjdXJyZW50IHRhciBhcmNoaXZlIGVudHJ5LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHNpbXBseSBjYWxscyByZWFkKCBieXRlW10sIGludCwgaW50ICkuCi0JICogCi0JICogQHJldHVybiBUaGUgYnl0ZSByZWFkLCBvciAtMSBhdCBFT0YuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9uIGVycm9yCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnRlbnRTdHJlYW0ucmVhZCgpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgYXdhcmUgb2YgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlCi0JICogYXJjaGl2ZSBhbmQgd2lsbCBkZWFsIHdpdGggdGhlbSBhcyBpZiB0aGV5IHdlcmUgdGhpcyBzdHJlYW0ncyBzdGFydCBhbmQKLQkgKiBFT0YuCi0JICogCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqICAgICAgICAgICAgVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRvIHBsYWNlIGJ5dGVzIHJlYWQuCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgVGhlIG9mZnNldCBhdCB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgotCSAqIEBwYXJhbSBudW1Ub1JlYWQKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgYXQgRU9GLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbnVtVG9SZWFkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY29udGVudFN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBudW1Ub1JlYWQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1Nhck91dHB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FyT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTE2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FyT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoZSBTYXJPdXRwdXRTdHJlYW0gd3JpdGVzIGEgc3RyZWFtIGFyY2hpdmUgYXMgYW4gT3V0cHV0U3RyZWFtLiBNZXRob2RzIGFyZQotICogcHJvdmlkZWQgdG8gcHV0IGVudHJpZXMsIGFuZCB0aGVuIHdyaXRlIHRoZWlyIGNvbnRlbnRzIGJ5IHdyaXRpbmcgdG8gdGhpcwotICogc3RyZWFtIHVzaW5nIHdyaXRlKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOwotCXByaXZhdGUgZmluYWwgRGF0YU91dHB1dFN0cmVhbSBkYXRhT3V0cHV0U3RyZWFtOwotCXByaXZhdGUgZmluYWwgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVudHJ5Q29udGVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkYXRhT3V0cHV0U3RyZWFtID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLQkJZW50cnlDb250ZW50ID0gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNiAqIDEwMjQpOwotCQl3cml0ZVN0cmluZyhTYXJDb25zdGFudHMuU0FSRklMRV9NQVJLRVIpOwotCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlSW50KFNhckNvbnN0YW50cy5TQVJGSUxFX1ZFUlNJT04pOwotCQlmaW5pc2hlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEVuZHMgdGhlIFNBUiBhcmNoaXZlIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgotCSAqIAotCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCS8vIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluaXNoKCk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRmluaXNoIHRoaXMgU0FSIGFyY2hpdmUgYnV0IGRvZXMgbm90IGNsb3NlIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaW5pc2hlZCkKLQkJCXJldHVybjsKLQotCQl3cml0ZUVPRlJlY29yZCgpOwotCQlmaW5pc2hlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogUHV0IGFuIGVudHJ5IG9uIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGlzIHdyaXRlcyB0aGUgZW50cnkncyBoZWFkZXIgcmVjb3JkCi0JICogYW5kIHBvc2l0aW9ucyB0aGUgb3V0cHV0IHN0cmVhbSBmb3Igd3JpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGVudHJ5LgotCSAqIE9uY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RyZWFtIGlzIHJlYWR5IGZvciBjYWxscyB0byB3cml0ZSgpIHRvCi0JICogd3JpdGUgdGhlIGVudHJ5J3MgY29udGVudHMuIE9uY2UgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuLCBjbG9zZUVudHJ5KCkKLQkgKiA8Qj5NVVNUIDwvQj4gYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBidWZmZXJlZCBkYXRhIGlzIGNvbXBsZXRlbHkKLQkgKiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqICAgICAgICAgICAgdGhlIFNhckVudHJ5IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGFyY2hpdmUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHB1dE5leHRFbnRyeShTYXJFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW50cnkud3JpdGVUbyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbiBlbnRyeS4gVGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgZm9yIGFsbCBmaWxlIGVudHJpZXMgdGhhdAotCSAqIGNvbnRhaW4gZGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIG11c3QgYnVmZmVyIGRhdGEgd3JpdHRlbiB0byB0aGUKLQkgKiBzdHJlYW0gaW4gb3JkZXIgdG8gc2F0aXNmeSB0aGUgYnVmZmVyJ3MgcmVjb3JkIGJhc2VkIHdyaXRlcy4gVGh1cywgdGhlcmUKLQkgKiBtYXkgYmUgZGF0YSBmcmFnbWVudHMgc3RpbGwgYmVpbmcgYXNzZW1ibGVkIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHRoZQotCSAqIG91dHB1dCBzdHJlYW0gYmVmb3JlIHRoaXMgZW50cnkgaXMgY2xvc2VkIGFuZCB0aGUgbmV4dCBlbnRyeSB3cml0dGVuLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGVCeXRlcyhlbnRyeUNvbnRlbnQuZ2V0QnVmZmVyKCksIGVudHJ5Q29udGVudC5nZXRCdWZmZXJMZW5ndGgoKSk7Ci0JCWVudHJ5Q29udGVudC5yZXNldCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBieXRlcyA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlieXRlcyA9IHMuZ2V0Qnl0ZXMoU2FyQ29uc3RhbnRzLkRFRkFVTFRfRU5DT0RJTkcpOwotCi0JCXdyaXRlQnl0ZXMoYnl0ZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBieXRlcwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZUJ5dGVzKGJ5dGVzLCBieXRlcyAhPSBudWxsID8gYnl0ZXMubGVuZ3RoIDogLTEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBieXRlcwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotCQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZUludChsZW5ndGgpOwotCQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZShieXRlcywgMCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWRhdGFPdXRwdXRTdHJlYW0ud3JpdGVJbnQoLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHYKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0Jdm9pZCB3cml0ZUludChpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZUludCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYm9vbAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBib29sKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlQm9vbGVhbihib29sKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlTG9uZyhsb25nIHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWRhdGFPdXRwdXRTdHJlYW0ud3JpdGVMb25nKHYpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyBhIGJ5dGUgdG8gdGhlIGN1cnJlbnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZSBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdGhlIGJ5dGUgd3JpdHRlbi4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzFdOwotCQlieXRlc1swXSA9IChieXRlKSBiOwotCQllbnRyeUNvbnRlbnQud3JpdGUoYnl0ZXMpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyBieXRlcyB0byB0aGUgY3VycmVudCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBhcmNoaXZlIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBieXRlcwotCSAqICAgICAgICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSB0byB0aGUgYXJjaGl2ZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnRyeUNvbnRlbnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGJ5dGVzIHRvIHRoZSBjdXJyZW50IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIGFyY2hpdmUgZW50cnkuCi0JICogCi0JICogQHBhcmFtIGJ5dGVzCi0JICogICAgICAgICAgICBUaGUgYnVmZmVyIHRvIHdyaXRlIHRvIHRoZSBhcmNoaXZlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIGdldCBieXRlcy4KLQkgKiBAcGFyYW0gbnVtVG9Xcml0ZQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IG51bVRvV3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVudHJ5Q29udGVudC53cml0ZShieXRlcywgb2Zmc2V0LCBudW1Ub1dyaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhbiBFT0YgKGVuZCBvZiBhcmNoaXZlKSBlbnRyeSB0byB0aGUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRU9GUmVjb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU2FyRW50cnkgZW9mRW50cnkgPSBuZXcgU2FyRW50cnkoKTsKLQkJZW9mRW50cnkud3JpdGVUbyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNTRlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgWmlwcy9KYXJzIHRvIFNhcnMgYW5kIHZpY2UgdmVyc2EuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXJVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBTYXJDb25zdGFudHMuREVCVUc7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFNhclV0aWwoKSB7Ci0JCS8vIHV0aWxpdHkgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBOb3JtYWxpemUgdGhlIGdpdmVuIHppcC9qYXIuCi0JICogCi0JICogQHBhcmFtIHppcFNvdXJjZQotCSAqIEBwYXJhbSB6aXBUYXJnZXQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZShGaWxlIHppcFNvdXJjZSwgRmlsZSB6aXBUYXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcFNhciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlbXAiLCAiLnNhciIpOwotCQl0cnkgewotCQkJemlwVG9TYXIoemlwU291cmNlLCB0ZW1wU2FyKTsKLQkJCXNhclRvWmlwKHRlbXBTYXIsIHppcFRhcmdldCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZW1wU2FyLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm9ybWFsaXplIHRoZSBnaXZlbiB6aXAvamFyLgotCSAqIAotCSAqIEBwYXJhbSB6aXBTb3VyY2UKLQkgKiBAcGFyYW0gemlwVGFyZ2V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBub3JtYWxpemUoSW5wdXRTdHJlYW0gemlwU291cmNlLCBPdXRwdXRTdHJlYW0gemlwVGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdGVtcFNhciA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJemlwVG9TYXIoemlwU291cmNlLCB0ZW1wU2FyKTsKLQkJc2FyVG9aaXAodGVtcFNhci5nZXRJbnB1dFN0cmVhbSgpLCB6aXBUYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB6aXBGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihGaWxlIHppcEZpbGUsIEZpbGUgc2FyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpKTsKLQkJT3V0cHV0U3RyZWFtIHNhck91dHB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShzYXJGaWxlKSk7Ci0JCVNhclV0aWwuemlwVG9TYXIoemlwSW5wdXRTdHJlYW0sIHNhck91dHB1dFN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHppcHBlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihJbnB1dFN0cmVhbSB6aXBwZWRJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIHNhcmVkT3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl6aXBUb1Nhcih6aXBwZWRJbnB1dFN0cmVhbSwgdHJ1ZSwgc2FyZWRPdXRwdXRTdHJlYW0sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB6aXBwZWRJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZUluCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGNsb3NlT3V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihJbnB1dFN0cmVhbSB6aXBwZWRJbnB1dFN0cmVhbSwgYm9vbGVhbiBjbG9zZUluLCBPdXRwdXRTdHJlYW0gc2FyZWRPdXRwdXRTdHJlYW0sIGJvb2xlYW4gY2xvc2VPdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXppcFRvU2FyTm9DbG9zZSh6aXBwZWRJbnB1dFN0cmVhbSwgc2FyZWRPdXRwdXRTdHJlYW0pOwotCi0JCWlmIChjbG9zZUluKQotCQkJemlwcGVkSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJaWYgKGNsb3NlT3V0KQotCQkJc2FyZWRPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FyRmlsZQotCSAqIEBwYXJhbSB6aXBGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXJUb1ppcChGaWxlIHNhckZpbGUsIEZpbGUgemlwRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2FyRmlsZSkpOwotCQlPdXRwdXRTdHJlYW0gemlwcGVkT3V0cHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpKTsKLQotCQlzYXJUb1ppcChzYXJlZElucHV0U3RyZWFtLCB6aXBwZWRPdXRwdXRTdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzYXJlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHppcHBlZE91dHB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2FyVG9aaXAoSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIHppcHBlZE91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2FyVG9aaXAoc2FyZWRJbnB1dFN0cmVhbSwgdHJ1ZSwgemlwcGVkT3V0cHV0U3RyZWFtLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FyZWRJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZUluCi0JICogQHBhcmFtIHppcHBlZE91dHB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZU91dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2FyVG9aaXAoSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSwgYm9vbGVhbiBjbG9zZUluLCBPdXRwdXRTdHJlYW0gemlwcGVkT3V0cHV0U3RyZWFtLCBib29sZWFuIGNsb3NlT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzYXJUb1ppcE5vQ2xvc2Uoc2FyZWRJbnB1dFN0cmVhbSwgemlwcGVkT3V0cHV0U3RyZWFtKTsKLQotCQlpZiAoY2xvc2VJbikKLQkJCXNhcmVkSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJaWYgKGNsb3NlT3V0KQotCQkJemlwcGVkT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHppcHBlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgemlwVG9TYXJOb0Nsb3NlKElucHV0U3RyZWFtIHppcHBlZElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0gc2FyZWRPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJWmlwSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oemlwcGVkSW5wdXRTdHJlYW0pOwotCQlTYXJPdXRwdXRTdHJlYW0gc2FyT3V0cHV0U3RyZWFtID0gbmV3IFNhck91dHB1dFN0cmVhbShzYXJlZE91dHB1dFN0cmVhbSk7Ci0KLQkJWmlwRW50cnkgemlwRW50cnk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JCXdoaWxlICgoemlwRW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBpc1ppcCA9IGlzWmlwKHppcEVudHJ5KTsKLQkJCVNhckVudHJ5IHNhckVudHJ5ID0gbmV3IFNhckVudHJ5KHppcEVudHJ5LCBpc1ppcCk7Ci0JCQlzYXJPdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KHNhckVudHJ5KTsKLQkJCWlmIChpc1ppcCkgewotCQkJCXppcFRvU2FyTm9DbG9zZSh6aXBJbnB1dFN0cmVhbSwgc2FyT3V0cHV0U3RyZWFtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHJlYWQ7Ci0JCQkJd2hpbGUgKChyZWFkID0gemlwSW5wdXRTdHJlYW0ucmVhZChidWYpKSAhPSAtMSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudDogIiArIG5ldyBTdHJpbmcoYnVmLCAwLCByZWFkKSk7Ci0JCQkJCX0KLQkJCQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0JCQkJfQotCQkJfQotCQkJemlwSW5wdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCQkJc2FyT3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCQlzYXJPdXRwdXRTdHJlYW0uZmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNhcmVkSW5wdXRTdHJlYW0KLQkgKiBAcGFyYW0gemlwcGVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2FyVG9aaXBOb0Nsb3NlKElucHV0U3RyZWFtIHNhcmVkSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSB6aXBwZWRPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU2FySW5wdXRTdHJlYW0gc2FySW5wdXRTdHJlYW0gPSBuZXcgU2FySW5wdXRTdHJlYW0oc2FyZWRJbnB1dFN0cmVhbSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBPdXRwdXRTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKHppcHBlZE91dHB1dFN0cmVhbSk7Ci0KLQkJU2FyRW50cnkgc2FyRW50cnk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JCXdoaWxlICgoc2FyRW50cnkgPSBzYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotCQkJWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoc2FyRW50cnkpOwotCQkJemlwT3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeSh6aXBFbnRyeSk7Ci0JCQlpZiAoc2FyRW50cnkuaXNaaXAoKSkgewotCQkJCXNhclRvWmlwTm9DbG9zZShzYXJJbnB1dFN0cmVhbSwgemlwT3V0cHV0U3RyZWFtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHJlYWQ7Ci0JCQkJd2hpbGUgKChyZWFkID0gc2FySW5wdXRTdHJlYW0ucmVhZChidWYpKSAhPSAtMSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudDogIiArIG5ldyBTdHJpbmcoYnVmLCAwLCByZWFkKSk7Ci0JCQkJCX0KLQkJCQkJemlwT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0JCQkJfQotCQkJfQotCQkJc2FySW5wdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCQkJemlwT3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCi0JCXppcE91dHB1dFN0cmVhbS5maW5pc2goKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWmlwKFppcEVudHJ5IHppcEVudHJ5KSB7Ci0JCVN0cmluZyBuYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBuYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgbmFtZS5lbmRzV2l0aCgiLmphciIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzdjZTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzY5YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0jVHVlIE5vdiAxMyAxMjowMjoxMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmM5ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVHVlIE5vdiAxMyAxMjowMjoxMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMzMTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaHUgQXVnIDIzIDE0OjU5OjAwIENFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz10cnVlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkN2UyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IGllLndvbWJhdC5qYmRpZmYsCi0ganVuaXQuZnJhbWV3b3JrO3ZlcnNpb249IjMuOC4yIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmYsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDAsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmphcmRlbHRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmYsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnBhY2syMDAsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnZlcmlmaWVyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlcjt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnVybGNvbnZlcnNpb247dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4zIiwKLSBvcmcueG1sLnNheAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUVjbGlwc2UtUmVnaXN0ZXJCdWRkeTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3Qub3B0aW1pemVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvcnl3YXRjaGVyLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZG93bmxvYWQsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbWJlZGRlZGVxdWlub3gsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5mdWxsLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZ2VuZXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2FyLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2ltcGxlY29uZmlndXJhdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBDRFQubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgQ0RULmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNDlmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBDRFQubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3Nsb2ciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvcGRlLWp1bml0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLi4vanVuaXQtd29ya3NwYWNlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcHJvdi90ZXN0L0RpcmVjdG9yVGVzdC5qYXZhIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3IuRGlyZWN0b3JUZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1vcyAke3RhcmdldC5vc30gLXdzICR7dGFyZ2V0LndzfSAtYXJjaCAke3RhcmdldC5hcmNofSAtbmwgJHt0YXJnZXQubmx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3QiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItRGVjbGlwc2UucDIuZGF0YS5hcmVhPWM6L3RlbXAvZXF1aW5veC5wMi9hZ2VudC8mIzEzOyYjMTA7LURlY2xpcHNlLnAyLm1ldGFkYXRhUmVwb3NpdG9yeT1maWxlOmM6L3RlbXAvZXF1aW5veC5wMi9zZXJ2ZXJzL0NEVG1ldGFkYXRhUmVwb3NpdG9yeS8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hcnRpZmFjdFJlcG9zaXRvcnk9ZmlsZTpjOi90ZW1wL2VxdWlub3gucDIvc2VydmVycy9hcnRpZmFjdFJlcG9zaXRvcnkvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5pbnN0YWxsRm9sZGVyPWM6L3RlbXAvZXF1aW5veC5wMi9lY2xpcHNlSW5zdGFsbC8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5jb25maWd1cmF0aW9uRmxhdm9yPXRvb2xpbmcmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmF1dG9JbnN0YWxsPWNkdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmlkZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWluc3RhbGwiIHZhbHVlPSJqZGsiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFNESy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBTREsubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGU2NWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFNESy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL3BkZS1qdW5pdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJkZXNlbGVjdGVkX3dvcmtzcGFjZV9wbHVnaW5zIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly4uL2p1bml0LXdvcmtzcGFjZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3Byb3YvdGVzdHMvZGlyZWN0b3IvRGlyZWN0b3JUZXN0LmphdmEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0NCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvci5EaXJlY3RvclRlc3QiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0gLWNvbnNvbGUgLW5vRXhpdCAtY29uc29sZUxvZyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLURlY2xpcHNlLnAyLmRhdGEuYXJlYT1kOi90bXAvZXF1aW5veC5wMi9hZ2VudC8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5tZXRhZGF0YVJlcG9zaXRvcnk9ZmlsZTpkOi90bXAvZXF1aW5veC5wMi9zZXJ2ZXJzL21ldGFkYXRhUmVwb3NpdG9yeS8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hcnRpZmFjdFJlcG9zaXRvcnk9ZmlsZTpkOi90bXAvZXF1aW5veC5wMi9zZXJ2ZXJzL2FydGlmYWN0UmVwb3NpdG9yeS8mIzEzOyYjMTA7LURlY2xpcHNlLnAyLmluc3RhbGxGb2xkZXI9ZDovdG1wL2VxdWlub3gucDIvZWNsaXBzZUluc3RhbGwvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvcj10b29saW5nJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hdXRvSW5zdGFsbD1zZGsiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZF90YXJnZXRfcGx1Z2lucyIgdmFsdWU9ImNvbS5pYm0uaWN1LGNvbS5pYm0uaWN1LnNvdXJjZSxjb20uamNyYWZ0LmpzY2gsamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0LmpzcCxqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UsamF2YXguc2VydmxldC5zb3VyY2Usb3JnLmFwYWNoZS5hbnQsb3JnLmFwYWNoZS5hbnQuc291cmNlLG9yZy5hcGFjaGUuY29tbW9ucy5lbCxvcmcuYXBhY2hlLmNvbW1vbnMuZWwuc291cmNlLG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSxvcmcuYXBhY2hlLmphc3BlcixvcmcuYXBhY2hlLmphc3Blci5zb3VyY2Usb3JnLmFwYWNoZS5sdWNlbmUsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc291cmNlLG9yZy5hcGFjaGUubHVjZW5lLnNvdXJjZSxvcmcuZWNsaXBzZS5hbnQuY29yZSxvcmcuZWNsaXBzZS5hbnQudWksb3JnLmVjbGlwc2UuY29tcGFyZSxvcmcuZWNsaXBzZS5jb3JlLmJvb3Qsb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcsb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucyxvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMsb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS53aW4zMi54ODYsb3JnLmVjbGlwc2UuY29yZS5qb2JzLG9yZy5lY2xpcHNlLmNvcmUubmV0LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHksb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnksb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMsb3JnLmVjbGlwc2UuY3ZzLG9yZy5lY2xpcHNlLmN2cy5zb3VyY2Usb3JnLmVjbGlwc2UuZGVidWcuY29yZSxvcmcuZWNsaXBzZS5kZWJ1Zy51aSxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbixvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHksb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5LG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LG9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3BlcixvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnksb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcixvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NixvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzLG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnksb3JnLmVjbGlwc2UuaGVscCxvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcixvcmcuZWNsaXBzZS5oZWxwLmJhc2Usb3JnLmVjbGlwc2UuaGVscC51aSxvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCxvcmcuZWNsaXBzZS5qZHQsb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLG9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUsb3JnLmVjbGlwc2UuamR0LmFwdC51aSxvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIuYXB0LG9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sLG9yZy5lY2xpcHNlLmpkdC5jb3JlLG9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbixvcmcuZWNsaXBzZS5qZHQuZGVidWcsb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLG9yZy5lY2xpcHNlLmpkdC5kb2MuaXN2LG9yZy5lY2xpcHNlLmpkdC5kb2MudXNlcixvcmcuZWNsaXBzZS5qZHQuanVuaXQsb3JnLmVjbGlwc2UuamR0Lmp1bml0LnJ1bnRpbWUsb3JnLmVjbGlwc2UuamR0Lmp1bml0NC5ydW50aW1lLG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsb3JnLmVjbGlwc2UuamR0LnNvdXJjZSxvcmcuZWNsaXBzZS5qZHQudWksb3JnLmVjbGlwc2UuamZhY2Usb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcsb3JnLmVjbGlwc2UuamZhY2UudGV4dCxvcmcuZWNsaXBzZS5qc2NoLmNvcmUsb3JnLmVjbGlwc2UuanNjaC51aSxvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZyxvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmcsb3JnLmVjbGlwc2Uub3NnaSxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLG9yZy5lY2xpcHNlLm9zZ2kudXRpbCxvcmcuZWNsaXBzZS5wZGUsb3JnLmVjbGlwc2UucGRlLmJ1aWxkLG9yZy5lY2xpcHNlLnBkZS5jb3JlLG9yZy5lY2xpcHNlLnBkZS5kb2MudXNlcixvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZSxvcmcuZWNsaXBzZS5wZGUucnVudGltZSxvcmcuZWNsaXBzZS5wZGUuc291cmNlLG9yZy5lY2xpcHNlLnBkZS51aSxvcmcuZWNsaXBzZS5wZGUudWkudGVtcGxhdGVzLG9yZy5lY2xpcHNlLnBsYXRmb3JtLG9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3Ysb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIsb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLG9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS53aW4zMi53aW4zMi54ODYsb3JnLmVjbGlwc2UucmNwLG9yZy5lY2xpcHNlLnJjcC5zb3VyY2Usb3JnLmVjbGlwc2UucmNwLnNvdXJjZS53aW4zMi53aW4zMi54ODYsb3JnLmVjbGlwc2Uuc2RrLG9yZy5lY2xpcHNlLnNlYXJjaCxvcmcuZWNsaXBzZS5zd3Qsb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NixvcmcuZWNsaXBzZS50ZWFtLmNvcmUsb3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSxvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gsb3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMixvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSxvcmcuZWNsaXBzZS50ZWFtLnVpLG9yZy5lY2xpcHNlLnRleHQsb3JnLmVjbGlwc2UudG9tY2F0LG9yZy5lY2xpcHNlLnVpLG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMsb3JnLmVjbGlwc2UudWkuY29uc29sZSxvcmcuZWNsaXBzZS51aS5lZGl0b3JzLG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMsb3JnLmVjbGlwc2UudWkuZm9ybXMsb3JnLmVjbGlwc2UudWkuaWRlLG9yZy5lY2xpcHNlLnVpLmlkZS5hcHBsaWNhdGlvbixvcmcuZWNsaXBzZS51aS5pbnRybyxvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwsb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMsb3JnLmVjbGlwc2UudWkubmV0LG9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxLG9yZy5lY2xpcHNlLnVpLnZpZXdzLG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLG9yZy5lY2xpcHNlLnVpLndpbjMyLG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eSxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcixvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLG9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIsb3JnLmVjbGlwc2UudXBkYXRlLnVpLG9yZy5qdW5pdCxvcmcuanVuaXQuc291cmNlLG9yZy5qdW5pdDQsb3JnLm1vcnRiYXkuamV0dHksb3JnLm1vcnRiYXkuamV0dHkuc291cmNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRfd29ya3NwYWNlX3BsdWdpbnMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2Ysb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdCxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlcixvcmcuYXBhY2hlLnhlcmNlcyxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHksb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Isb3JnLm1vemlsbGEucmhpbm8sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LGNvbS50aG91Z2h0d29ya3MueHN0cmVhbSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3Rpbmcsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iaWJtMS41c3IxIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgQ0RULmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFVuaW5zdGFsbCBDRFQubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlmNDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFVuaW5zdGFsbCBDRFQubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3Nsb2ciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvcGRlLWp1bml0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLi4vanVuaXQtd29ya3NwYWNlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcHJvdi90ZXN0cy9kaXJlY3Rvci9EaXJlY3RvclRlc3QuamF2YSIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIxIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQ0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yLkRpcmVjdG9yVGVzdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLURlY2xpcHNlLnAyLmRhdGEuYXJlYT1jOi90ZW1wL2VxdWlub3gucDIvYWdlbnQvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5tZXRhZGF0YVJlcG9zaXRvcnk9ZmlsZTpjOi90ZW1wL2VxdWlub3gucDIvc2VydmVycy9DRFRtZXRhZGF0YVJlcG9zaXRvcnkvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXJ0aWZhY3RSZXBvc2l0b3J5PWZpbGU6YzovdGVtcC9lcXVpbm94LnAyL3NlcnZlcnMvYXJ0aWZhY3RSZXBvc2l0b3J5LyYjMTM7JiMxMDstRGVjbGlwc2UucDIuaW5zdGFsbEZvbGRlcj1jOi90ZW1wL2VxdWlub3gucDIvZWNsaXBzZUluc3RhbGwvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvcj10b29saW5nJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hdXRvSW5zdGFsbD1jZHQmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmRvVW5pbnN0YWxsPXRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iamRrIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgU0RLLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFVuaW5zdGFsbCBTREsubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGE2OThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIFVuaW5zdGFsbCBTREsubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9UZXN0IERpcmVjdG9yIFVuaW5zdGFsbCBTREsiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLVhtczQwbSYjMTM7JiMxMDstWG14NzY4bSYjMTM7JiMxMDstRGVjbGlwc2UucDIuZGF0YS5hcmVhPWM6L3RlbXAvZXF1aW5veC5wMi9hZ2VudC8mIzEzOyYjMTA7LURlY2xpcHNlLnAyLm1ldGFkYXRhUmVwb3NpdG9yeT1maWxlOmM6L3RlbXAvZXF1aW5veC5wMi9zZXJ2ZXJzL21ldGFkYXRhUmVwb3NpdG9yeS8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hcnRpZmFjdFJlcG9zaXRvcnk9ZmlsZTpjOi90ZW1wL2VxdWlub3gucDIvc2VydmVycy9hcnRpZmFjdFJlcG9zaXRvcnkvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5pbnN0YWxsRm9sZGVyPWM6L3RlbXAvZXF1aW5veC5wMi9lY2xpcHNlSW5zdGFsbC8gJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5jb25maWd1cmF0aW9uRmxhdm9yPXRvb2xpbmcmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmF1dG9JbnN0YWxsPXNkayYjMTM7JiMxMDstRGVjbGlwc2UucDIuZG9Vbmluc3RhbGw9dHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5qb2JzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2lAOixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuanVuaXRAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iSlJFMS40LjIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9ImNvbS50aG91Z2h0d29ya3MueHN0cmVhbUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3JAMTp0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjFjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3REYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbAotY3VzdG9tQ2FsbEJhY2s9Zm9vLnhtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ3MTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgVGVzdHMgKEluY3ViYXRpb24pCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkNDljZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5CeXRlU2hpZnRlciI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5CeXRlU2hpZnRlciIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkFkZGVyIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLkFkZGVyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuTXVsdGlwbGllciI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5NdWx0aXBsaWVyIi8+Ci0JPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIGlkPSJwaGFzZVRlc3QiCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLnRvdWNocG9pbnRzIj4KLSAgICA8dG91Y2hwb2ludAotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZS5Ub3VjaHBvaW50VGVzdCRQaGFzZVRlc3RUb3VjaHBvaW50IgotICAgICAgICAgIHR5cGU9InBoYXNlVGVzdCIKLSAgICAgICAgICB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgPC90b3VjaHBvaW50PgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBpZD0ib3BlcmFuZFRlc3QiCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLnRvdWNocG9pbnRzIj4KLSAgICA8dG91Y2hwb2ludAotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZS5Ub3VjaHBvaW50VGVzdCRPcGVyYW5kVGVzdFRvdWNocG9pbnQiCi0gICAgICAgICAgdHlwZT0ib3BlcmFuZFRlc3QiCi0gICAgICAgICAgdmVyc2lvbj0iMS4wLjAiPgotICAgIDwvdG91Y2hwb2ludD4KLSA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YS9UZXN0IERhdGEgR2VuZXJhdG9yLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL1Rlc3QgRGF0YSBHZW5lcmF0b3IubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDlhNmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL1Rlc3QgRGF0YSBHZW5lcmF0b3IubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5FcXVpbm94TGF1bmNoZXIiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvVGVzdCBEYXRhIEdlbmVyYXRvciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iZXhlY0Vudmlyb25tZW50IiB2YWx1ZT0iSjJTRS0xLjUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VHZW5lcmF0b3ImIzEzOyYjMTA7LW1ldGFkYXRhUmVwb3NpdG9yeSBmaWxlOiR7d29ya3NwYWNlX2xvYzpvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG99JiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZToke3dvcmtzcGFjZV9sb2M6b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9lbmdpbmVyZXBvfSAmIzEzOyYjMTA7LWJhc2UgJHt3b3Jrc3BhY2VfbG9jOm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YX0mIzEzOyYjMTA7LWJ1bmRsZXMgJHt3b3Jrc3BhY2VfbG9jOm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YX0mIzEzOyYjMTA7LWZlYXR1cmVzICR7d29ya3NwYWNlX2xvYzpvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGF9JiMxMzsmIzEwOy1wdWJsaXNoQXJ0aWZhY3RzICYjMTM7JiMxMDstcGFyJiMxMzsmIzEwOy1ub0RlZmF1bHRJVXMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaUA6LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3JAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9ImlibTEuNXNyMSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvZW5naW5lcmVwby5qYXJkZXNjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvZW5naW5lcmVwby5qYXJkZXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODBhOTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL2VuZ2luZXJlcG8uamFyZGVzYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldJTkRPV1MtMTI1MiI/PgotPGphcmRlc2M+Ci0gICAgPGphciBwYXRoPSJEOi93b3Jrc3BhY2VzL3Byb3Yuc2VsZmhvc3Qvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9lbmdpbmVyZXBvLmphciIvPgotICAgIDxvcHRpb25zIGJ1aWxkSWZOZWVkZWQ9InRydWUiIGNvbXByZXNzPSJ0cnVlIiBkZXNjcmlwdGlvbkxvY2F0aW9uPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL2VuZ2luZXJlcG8uamFyZGVzYyIgZXhwb3J0RXJyb3JzPSJ0cnVlIiBleHBvcnRXYXJuaW5ncz0idHJ1ZSIgaW5jbHVkZURpcmVjdG9yeUVudHJpZXM9ImZhbHNlIiBvdmVyd3JpdGU9ImZhbHNlIiBzYXZlRGVzY3JpcHRpb249InRydWUiIHN0b3JlUmVmYWN0b3JpbmdzPSJmYWxzZSIgdXNlU291cmNlRm9sZGVycz0iZmFsc2UiLz4KLSAgICA8c3RvcmVkUmVmYWN0b3JpbmdzIGRlcHJlY2F0aW9uSW5mbz0idHJ1ZSIgc3RydWN0dXJhbE9ubHk9ImZhbHNlIi8+Ci0gICAgPHNlbGVjdGVkUHJvamVjdHMvPgotICAgIDxtYW5pZmVzdCBnZW5lcmF0ZU1hbmlmZXN0PSJ0cnVlIiBtYW5pZmVzdExvY2F0aW9uPSIiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIiByZXVzZU1hbmlmZXN0PSJmYWxzZSIgc2F2ZU1hbmlmZXN0PSJmYWxzZSIgdXNlc01hbmlmZXN0PSJ0cnVlIj4KLSAgICAgICAgPHNlYWxpbmcgc2VhbEphcj0iZmFsc2UiPgotICAgICAgICAgICAgPHBhY2thZ2VzVG9TZWFsLz4KLSAgICAgICAgICAgIDxwYWNrYWdlc1RvVW5TZWFsLz4KLSAgICAgICAgPC9zZWFsaW5nPgotICAgIDwvbWFuaWZlc3Q+Ci0gICAgPHNlbGVjdGVkRWxlbWVudHMgZXhwb3J0Q2xhc3NGaWxlcz0idHJ1ZSIgZXhwb3J0SmF2YUZpbGVzPSJmYWxzZSIgZXhwb3J0T3V0cHV0Rm9sZGVyPSJmYWxzZSI+Ci0gICAgICAgIDxmb2xkZXIgcGF0aD0iL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZW5naW5lcmVwbyIvPgotICAgIDwvc2VsZWN0ZWRFbGVtZW50cz4KLTwvamFyZGVzYz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL29yZy5lY2xpcHNlLmVxdWlub3gucHJvdi5lbmdpbmVfMC4xLjAuMjAwNzA5MjQxNjMxLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL29yZy5lY2xpcHNlLmVxdWlub3gucHJvdi5lbmdpbmVfMC4xLjAuMjAwNzA5MjQxNjMxLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzZmYwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YS9vcmcuZWNsaXBzZS5lcXVpbm94LnByb3YuZW5naW5lXzAuMS4wLjIwMDcwOTI0MTYzMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NGZjMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL0Fic3RyYWN0UHJvdmlzaW9uaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHByb3Zpc2lvbmluZyB0ZXN0cyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgdXNlZCBieSBtdWx0aXBsZSB0ZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmVyc2lvblJhbmdlIEFOWV9WRVJTSU9OID0gbmV3IFZlcnNpb25SYW5nZShWZXJzaW9uLmVtcHR5VmVyc2lvbiwgdHJ1ZSwgbmV3IFZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSksIHRydWUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eVtdIEJVTkRMRV9DQVBBQklMSVRZID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJlY2xpcHNlLnRvdWNocG9pbnQiLCAiYnVuZGxlIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIEJVTkRMRV9SRVFVSVJFTUVOVCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiZWNsaXBzZS50b3VjaHBvaW50IiwgImJ1bmRsZSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgdHJ1ZSl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWZXJzaW9uIERFRkFVTFRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG91Y2hwb2ludFR5cGUgVE9VQ0hQT0lOVF9PU0dJID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2kiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBOT19QUk9QRVJUSUVTID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5W10gTk9fUFJPVklERVMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5WzBdOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVxdWlyZWRDYXBhYmlsaXR5W10gTk9fUkVRVUlSRVMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50RGF0YSBOT19UUF9EQVRBID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG5ldyBIYXNoTWFwKCkpOwotCi0JLyoqCi0JICogVHJhY2tzIHRoZSBtZXRhZGF0YSByZXBvc2l0b3JpZXMgY3JlYXRlZCBieSB0aGlzIHRlc3QgaW5zdGFuY2UuIFRoZSByZXBvc2l0b3JpZXMKLQkgKiB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0LgotCSAqLwotCXByaXZhdGUgTGlzdCBtZXRhZGF0YVJlcG9zID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKgotCSAqIFRyYWNrcyB0aGUgcHJvZmlsZXMgY3JlYXRlZCBieSB0aGlzIHRlc3QgaW5zdGFuY2UuIFRoZSBwcm9maWxlcwotCSAqIHdpbGwgYmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QuCi0JICovCi0JcHJpdmF0ZSBMaXN0IHByb2ZpbGVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RW1wdHlQcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHByb2ZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgcHJvZmlsZSk7Ci0JCWlmIChnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpLmhhc05leHQoKSkKLQkJCWZhaWwoIlRoZSBwcm9maWxlIHNob3VsZCBiZSBlbXB0eSxwcm9maWxlSWQ9IiArIHByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnROb3RJVXMoSUluc3RhbGxhYmxlVW5pdFtdIGl1cywgSXRlcmF0b3IgaW5zdGFsbGFibGVVbml0cykgewotCQlTZXQgbm90ZXhwZWN0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlub3RleHBlY3RlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChpdXMpKTsKLQotCQl3aGlsZSAoaW5zdGFsbGFibGVVbml0cy5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgbmV4dCA9IChJSW5zdGFsbGFibGVVbml0KSBpbnN0YWxsYWJsZVVuaXRzLm5leHQoKTsKLQkJCWlmIChub3RleHBlY3RlZC5jb250YWlucyhuZXh0KSkgewotCQkJCWZhaWwoIm5vdCBleHBlY3RlZCBbIiArIG5leHQgKyAiXSIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc2VydE5vdE9LKElTdGF0dXMgcmVzdWx0KSB7Ci0JCWFzc2VydFRydWUoIlRoZSBzdGF0dXMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gT0siLCAhcmVzdWx0LmlzT0soKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc2VydE9LKElTdGF0dXMgcmVzdWx0KSB7Ci0JCWlmIChyZXN1bHQuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBNdWx0aVN0YXR1cykgewotCQkJTXVsdGlTdGF0dXMgbXMgPSAoTXVsdGlTdGF0dXMpIHJlc3VsdDsKLQkJCUlTdGF0dXMgY2hpbGRyZW5bXSA9IG1zLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCi0JCVRocm93YWJsZSB0ID0gcmVzdWx0LmdldEV4Y2VwdGlvbigpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQotCQlmYWlsKHJlc3VsdC50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb2ZpbGUgY29udGFpbnMgKm9ubHkqIHRoZSBnaXZlbiBJVXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc2VydFByb2ZpbGVDb250YWlucyhTdHJpbmcgbWVzc2FnZSwgSVByb2ZpbGUgcHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdFtdIGV4cGVjdGVkVW5pdHMpIHsKLQkJSGFzaFNldCBleHBlY3RlZCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRVbml0cykpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBhY3R1YWwgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJaWYgKCFleHBlY3RlZC5yZW1vdmUoYWN0dWFsKSkKLQkJCQlmYWlsKG1lc3NhZ2UgKyAiIHByb2ZpbGUgIiArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkgKyAiIGNvbnRhaW5lZCBhbiB1bmV4cGVjdGVkIHVuaXQ6ICIgKyBhY3R1YWwpOwotCQl9Ci0JCWlmICghZXhwZWN0ZWQuaXNFbXB0eSgpKQotCQkJZmFpbChtZXNzYWdlICsgIiBwcm9maWxlICIgKyBwcm9maWxlLmdldFByb2ZpbGVJZCgpICsgIiBkaWQgbm90IGNvbnRhaW4gZXhwZWN0ZWQgdW5pdHM6ICIgKyBleHBlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwcm9maWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2l2ZW4gSVVzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoU3RyaW5nIG1lc3NhZ2UsIElQcm9maWxlIHByb2ZpbGUyLCBJSW5zdGFsbGFibGVVbml0W10gZXhwZWN0ZWRVbml0cykgewotCQlIYXNoU2V0IGV4cGVjdGVkID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChleHBlY3RlZFVuaXRzKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUyKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBhY3R1YWwgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJZXhwZWN0ZWQucmVtb3ZlKGFjdHVhbCk7Ci0JCX0KLQkJaWYgKCFleHBlY3RlZC5pc0VtcHR5KCkpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIHByb2ZpbGUgIiArIHByb2ZpbGUyLmdldFByb2ZpbGVJZCgpICsgIiBkaWQgbm90IGNvbnRhaW4gZXhwZWN0ZWQgdW5pdHM6ICIgKyBleHBlY3RlZCk7Ci0JfQotCi0JLyoKLQkgKiBDb3B5Ci0JICogLSBpZiB3ZSBoYXZlIGEgZmlsZSwgdGhlbiBjb3B5IHRoZSBmaWxlCi0JICogLSBpZiB3ZSBoYXZlIGEgZGlyZWN0b3J5IHRoZW4gbWVyZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShTdHJpbmcgbWVzc2FnZSwgRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCWlmICghc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmICh0YXJnZXQuZXhpc3RzKCkgJiYgdGFyZ2V0LmlzRmlsZSgpKQotCQkJCXRhcmdldC5kZWxldGUoKTsKLQkJCWlmICghdGFyZ2V0LmV4aXN0cygpKQotCQkJCXRhcmdldC5ta2RpcnMoKTsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IHNvdXJjZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJY29weShtZXNzYWdlLCBjaGlsZHJlbltpXSwgbmV3IEZpbGUodGFyZ2V0LCBjaGlsZHJlbltpXS5nZXROYW1lKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSkpOwotCQkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCkpOwotCi0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQlpbnQgYnl0ZXNSZWFkID0gMDsKLQkJCXdoaWxlICgoYnl0ZXNSZWFkID0gaW5wdXQucmVhZChidWZmZXIpKSAhPSAtMSkKLQkJCQlvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKG1lc3NhZ2UsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGNsb3NlIGlucHV0IHN0cmVhbSBvbjogIiArIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gY2xvc2Ugb3V0cHV0IHN0cmVhbSBvbjogIiArIHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBlY2xpcHNlIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBpcyBob3N0ZWQKLQkgKiAgYnkgYW55IGJ1bmRsZS4gVGhlIGZyYWdtZW50IGhhcyB0aGUgZGVmYXVsdCB2ZXJzaW9uLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBhbmQKLQkgKiAgZnJhZ21lbnQgcHJvdmlkZWQgY2FwYWJpbGl0aWVzIGFyZSBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgY3JlYXRlQnVuZGxlRnJhZ21lbnQoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBmcmFnbWVudCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWZyYWdtZW50LnNldElkKG5hbWUpOwotCQlmcmFnbWVudC5zZXRWZXJzaW9uKERFRkFVTFRfVkVSU0lPTik7Ci0JCWZyYWdtZW50LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWZyYWdtZW50LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfT1NHSSk7Ci0JCWZyYWdtZW50LmFkZFRvdWNocG9pbnREYXRhKE5PX1RQX0RBVEEpOwotCQlmcmFnbWVudC5zZXRIb3N0KEJVTkRMRV9SRVFVSVJFTUVOVCk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0RnJhZ21lbnQoZnJhZ21lbnQpOwotCi0JCS8vCQlyZXR1cm4gY3JlYXRlSVVGcmFnbWVudChudWxsLCBuYW1lLCBERUZBVUxUX1ZFUlNJT04sIEJVTkRMRV9SRVFVSVJFTUVOVCwgVE9VQ0hQT0lOVF9PU0dJLCBOT19UUF9EQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGFuIGVjbGlwc2UgSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmVyc2lvbgotCSAqICB0aGF0IGlzIGhvc3RlZCBieSBhbnkgYnVuZGxlLiBUaGUgZGVmYXVsdCBzZWxmIGFuZCBmcmFnbWVudCBwcm92aWRlZCBjYXBhYmlsaXRpZXMKLQkgKiAgYXJlIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVCdW5kbGVGcmFnbWVudChTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBUb3VjaHBvaW50RGF0YSB0cERhdGEpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVRnJhZ21lbnQobnVsbCwgbmFtZSwgdmVyc2lvbiwgQlVORExFX1JFUVVJUkVNRU5ULCBUT1VDSFBPSU5UX09TR0ksIHRwRGF0YSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGlyZWN0b3IgY3JlYXRlRGlyZWN0b3IoKSB7Ci0JCXJldHVybiAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYW4gRWNsaXBzZSBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUVjbGlwc2VJVShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWNsaXBzZUlVKG5hbWUsIERFRkFVTFRfVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBFY2xpcHNlIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRWNsaXBzZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIE5PX1JFUVVJUkVTLCBCVU5ETEVfQ0FQQUJJTElUWSwgTk9fUFJPUEVSVElFUywgVE9VQ0hQT0lOVF9PU0dJLCBOT19UUF9EQVRBLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBFY2xpcHNlIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRWNsaXBzZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzLCBUb3VjaHBvaW50RGF0YSB0b3VjaHBvaW50RGF0YSkgewotCQlyZXR1cm4gY3JlYXRlSVUobmFtZSwgdmVyc2lvbiwgbnVsbCwgcmVxdWlyZXMsIEJVTkRMRV9DQVBBQklMSVRZLCBOT19QUk9QRVJUSUVTLCBUT1VDSFBPSU5UX09TR0ksIHRvdWNocG9pbnREYXRhLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRW5naW5lIGNyZWF0ZUVuZ2luZSgpIHsKLQkJcmV0dXJuIChJRW5naW5lKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBMREFQIGZpbHRlciB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNyZWF0ZUZpbHRlcihTdHJpbmcgZmlsdGVyS2V5LCBTdHJpbmcgZmlsdGVyVmFsdWUpIHsKLQkJcmV0dXJuICIoIiArIGZpbHRlcktleSArICc9JyArIGZpbHRlclZhbHVlICsgJyknOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04pOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIERFRkFVTFRfVkVSU0lPTiwgbnVsbCwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcykgewotCQlyZXR1cm4gY3JlYXRlSVUobmFtZSwgREVGQVVMVF9WRVJTSU9OLCBudWxsLCByZXF1aXJlcywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMsIGJvb2xlYW4gc2luZ2xldG9uKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04sIG51bGwsIHJlcXVpcmVzLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgc2luZ2xldG9uKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04sIGZpbHRlciwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIGJvb2xlYW4gc2luZ2xldG9uKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCB2ZXJzaW9uLCBudWxsLCBOT19SRVFVSVJFUywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIHNpbmdsZXRvbik7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbiwgUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCB2ZXJzaW9uLCBudWxsLCBOT19SRVFVSVJFUywgYWRkaXRpb25hbFByb3ZpZGVzLCBOT19QUk9QRVJUSUVTLCBUb3VjaHBvaW50VHlwZS5OT05FLCBOT19UUF9EQVRBLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbiwgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIHJlcXVpcmVkLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBNYXAgcHJvcGVydGllcywgYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIHJlcXVpcmVkLCBOT19QUk9WSURFUywgcHJvcGVydGllcywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgc2luZ2xldG9uKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgZmlsdGVyLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIGZpbHRlciwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBmaWx0ZXIsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMsIE1hcCBwcm9wZXJ0aWVzLCBUb3VjaHBvaW50VHlwZSB0cFR5cGUsIFRvdWNocG9pbnREYXRhIHRwRGF0YSwgYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIGZpbHRlciwgcmVxdWlyZWQsIGFkZGl0aW9uYWxQcm92aWRlcywgcHJvcGVydGllcywgdHBUeXBlLCB0cERhdGEsIHNpbmdsZXRvbiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBmaWx0ZXIsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMsIE1hcCBwcm9wZXJ0aWVzLCBUb3VjaHBvaW50VHlwZSB0cFR5cGUsIFRvdWNocG9pbnREYXRhIHRwRGF0YSwgYm9vbGVhbiBzaW5nbGV0b24sIElVcGRhdGVEZXNjcmlwdG9yIHVwZGF0ZSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0SWQobmFtZSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWl1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbYWRkaXRpb25hbFByb3ZpZGVzLmxlbmd0aCArIDFdOwotCQlwcm92aWRlc1swXSA9IGdldFNlbGZDYXBhYmlsaXR5KG5hbWUsIHZlcnNpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxQcm92aWRlcy5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXNbaSArIDFdID0gYWRkaXRpb25hbFByb3ZpZGVzW2ldOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmV4dEtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5leHRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5leHRLZXkpOwotCQkJaXUuc2V0UHJvcGVydHkobmV4dEtleSwgbmV4dFZhbHVlKTsKLQkJfQotCQlpdS5zZXRDYXBhYmlsaXRpZXMocHJvdmlkZXMpOwotCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKHRwVHlwZSk7Ci0JCWlmICh0cERhdGEgIT0gbnVsbCkKLQkJCWl1LmFkZFRvdWNocG9pbnREYXRhKHRwRGF0YSk7Ci0JCWl1LnNldFNpbmdsZXRvbihzaW5nbGV0b24pOwotCQlpdS5zZXRVcGRhdGVEZXNjcmlwdG9yKHVwZGF0ZSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gCi0JICogVGhlIHNlbGYgYW5kIGZyYWdtZW50IHByb3ZpZGVkIGNhcGFiaWxpdGllcyBhcmUgYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGNyZWF0ZUlVRnJhZ21lbnQoSUluc3RhbGxhYmxlVW5pdCBob3N0LCBTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXJldHVybiBjcmVhdGVJVUZyYWdtZW50KGhvc3QsIG5hbWUsIHZlcnNpb24sIE5PX1JFUVVJUkVTLCBUb3VjaHBvaW50VHlwZS5OT05FLCBOT19UUF9EQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gCi0JICogVGhlIHNlbGYgYW5kIGZyYWdtZW50IHByb3ZpZGVkIGNhcGFiaWxpdGllcyBhcmUgYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGNyZWF0ZUlVRnJhZ21lbnQoSUluc3RhbGxhYmxlVW5pdCBob3N0LCBTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCwgVG91Y2hwb2ludFR5cGUgdHBUeXBlLCBUb3VjaHBvaW50RGF0YSB0cERhdGEpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBmcmFnbWVudCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWZyYWdtZW50LnNldElkKG5hbWUpOwotCQlmcmFnbWVudC5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlmcmFnbWVudC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQlmcmFnbWVudC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCWZyYWdtZW50LnNldFRvdWNocG9pbnRUeXBlKHRwVHlwZSk7Ci0JCWlmICh0cERhdGEgIT0gbnVsbCkKLQkJCWZyYWdtZW50LmFkZFRvdWNocG9pbnREYXRhKHRwRGF0YSk7Ci0JCWlmIChob3N0ICE9IG51bGwpIHsKLQkJCVZlcnNpb25SYW5nZSBob3N0UmFuZ2UgPSBuZXcgVmVyc2lvblJhbmdlKGhvc3QuZ2V0VmVyc2lvbigpLCB0cnVlLCBob3N0LmdldFZlcnNpb24oKSwgdHJ1ZSk7Ci0JCQlmcmFnbWVudC5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaG9zdC5nZXRJZCgpLCBob3N0UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJfQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KGZyYWdtZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQbGFubmVyIGNyZWF0ZVBsYW5uZXIoKSB7Ci0JCXJldHVybiAoSVBsYW5uZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSB3aXRoIHRoZSBwcm92aWRlZCBhdHRyaWJ1dGVzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXIpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKG5hbWVzcGFjZSwgbmFtZSwgQU5ZX1ZFUlNJT04sIGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgd2l0aCB0aGUgcHJvdmlkZWQgYXR0cmlidXRlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFN0cmluZyBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShuYW1lc3BhY2UsIG5hbWUsIHJhbmdlLCBmaWx0ZXIsIGZhbHNlLCBmYWxzZSl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGUoRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlkZWxldGUoY2hpbGRyZW5baV0pOwotCQl9Ci0JCXJldHVybiBmaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIAlDb21wYXJlIHR3byAyLWRpbWVuc2lvbmFsIGFycmF5cyBvZiBzdHJpbmdzIGZvciBlcXVhbGl0eQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBlcXVhbChTdHJpbmdbXVtdIHR1cGxlczAsIFN0cmluZ1tdW10gdHVwbGVzMSkgewotCQlpZiAodHVwbGVzMC5sZW5ndGggIT0gdHVwbGVzMS5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHVwbGVzMC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gdHVwbGUwID0gdHVwbGVzMFtpXTsKLQkJCVN0cmluZ1tdIHR1cGxlMSA9IHR1cGxlczFbaV07Ci0JCQlpZiAodHVwbGUwLmxlbmd0aCAhPSB0dXBsZTEubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdHVwbGUwLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCF0dXBsZTBbal0uZXF1YWxzKHR1cGxlMVtqXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBGYWlscyB0aGUgdGVzdCBkdWUgdG8gdGhlIGdpdmVuIHRocm93YWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIG11bHRpc3RhdHVzCi0JCS8vIHRoZW4gcHJpbnQgb3V0IHRoZSBtdWx0aXN0YXR1cyBzbyB3ZSBjYW4gc2VlIGFsbCB0aGUgaW5mby4KLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCQkvL2lmIHRoZSBzdGF0dXMgZG9lcyBub3QgaGF2ZSBhbiBleGNlcHRpb24sIHByaW50IHRoZSBzdGFjayBmb3IgdGhpcyBvbmUKLQkJCWlmIChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJd3JpdGUoc3RhdHVzLCAwKTsKLQkJfSBlbHNlCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlmYWlsKG1lc3NhZ2UgKyAiOiAiICsgZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRJbnN0YWxsYWJsZVVuaXRzKElQcm9maWxlIHByb2ZpbGUyKSB7Ci0JCXJldHVybiBwcm9maWxlMi5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAJR2V0IHRoZSAnc2VsZicgY2FwYWJpbGl0eSBmb3IgdGhlIGdpdmVuIGluc3RhbGxhYmxlIHVuaXQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgZ2V0U2VsZkNhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlyZXR1cm4gZ2V0U2VsZkNhcGFiaWxpdHkoaXUuZ2V0SWQoKSwgaXUuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiAJR2V0IHRoZSAnc2VsZicgY2FwYWJpbGl0eSBmb3IgYW4gaW5zdGFsbGFibGUgdW5pdCB3aXRoIHRoZSBnaXZlIGlkIGFuZCB2ZXJzaW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3ZpZGVkQ2FwYWJpbGl0eSBnZXRTZWxmQ2FwYWJpbGl0eShTdHJpbmcgaW5zdGFsbGFibGVVbml0SWQsIFZlcnNpb24gaW5zdGFsbGFibGVVbml0VmVyc2lvbikgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5kZW50KE91dHB1dFN0cmVhbSBvdXRwdXQsIGludCBpbmRlbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0LndyaXRlKCJcdCIuZ2V0Qnl0ZXMoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50UHJvZmlsZShJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNJVSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQljb250YWluc0lVID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWNvbnRhaW5zSVUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGl1Iik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZShJU3RhdHVzIHN0YXR1cywgaW50IGluZGVudCkgewotCQlQcmludFN0cmVhbSBvdXRwdXQgPSBTeXN0ZW0ub3V0OwotCQlpbmRlbnQob3V0cHV0LCBpbmRlbnQpOwotCQlvdXRwdXQucHJpbnRsbigiU2V2ZXJpdHk6ICIgKyBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIlBsdWdpbiBJRDogIiArIHN0YXR1cy5nZXRQbHVnaW4oKSk7Ci0KLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIkNvZGU6ICIgKyBzdGF0dXMuZ2V0Q29kZSgpKTsKLQotCQlpbmRlbnQob3V0cHV0LCBpbmRlbnQpOwotCQlvdXRwdXQucHJpbnRsbigiTWVzc2FnZTogIiArIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCi0JCWlmIChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJCW91dHB1dC5wcmludCgiRXhjZXB0aW9uOiAiKTsKLQkJCXN0YXR1cy5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uob3V0cHV0KTsKLQkJfQotCi0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJd3JpdGUoY2hpbGRyZW5baV0sIGluZGVudCArIDEpOwotCQl9Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChleHBlY3RlZCA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlICsgIiBleHBlY3RlZCBudWxsIGJ1dCB3YXM6ICIgKyBhY3R1YWwpOwotCQlpZiAoYWN0dWFsID09IG51bGwpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIik7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggIT0gYWN0dWFsLmxlbmd0aCkKLQkJCWZhaWwobWVzc2FnZSArICIgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoOjwiICsgZXhwZWN0ZWQubGVuZ3RoICsgIj4gYnV0IHdhczo8IiArIGFjdHVhbC5sZW5ndGggKyAiPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKQotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGFycmF5cyBkaWZmZXIgYXQgcG9zaXRpb246PCIgKyBpICsgIj4iLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChleHBlY3RlZCA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlICsgIiBleHBlY3RlZCBudWxsIGJ1dCB3YXM6ICIgKyBhY3R1YWwpOwotCQlpZiAoYWN0dWFsID09IG51bGwpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIik7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggIT0gYWN0dWFsLmxlbmd0aCkKLQkJCWZhaWwobWVzc2FnZSArICIgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoOjwiICsgZXhwZWN0ZWQubGVuZ3RoICsgIj4gYnV0IHdhczo8IiArIGFjdHVhbC5sZW5ndGggKyAiPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKQotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGFycmF5cyBkaWZmZXIgYXQgcG9zaXRpb246PCIgKyBpICsgIj4iLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBFbnN1cmVzIHRoYXQgbm8gc3VjaCBwcm9maWxlCi0JICogYWxyZWFkeSBleGlzdHMuICBUaGUgcmV0dXJuZWQgcHJvZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseQotCSAqIGluIHRoZSB0ZWFyRG93biBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIElQcm9maWxlIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZVByb2ZpbGUobmFtZSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRW5zdXJlcyB0aGF0IG5vIHN1Y2ggcHJvZmlsZQotCSAqIGFscmVhZHkgZXhpc3RzLiAgVGhlIHJldHVybmVkIHByb2ZpbGUgd2lsbCBiZSByZW1vdmVkIGF1dG9tYXRpY2FsbHkKLQkgKiBpbiB0aGUgdGVhckRvd24gbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBJUHJvZmlsZSBjcmVhdGVQcm9maWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50SWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVByb2ZpbGUobmFtZSwgcGFyZW50SWQsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvZmlsZSBjcmVhdGVQcm9maWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50SWQsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCS8vcmVtb3ZlIGFueSBleGlzdGluZyBwcm9maWxlIHdpdGggdGhlIHNhbWUgbmFtZQotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHJvZmlsZVJlZ2lzdHJ5LnJlbW92ZVByb2ZpbGUobmFtZSk7Ci0JCS8vY3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgcHJvZmlsZQotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmFkZFByb2ZpbGUobmFtZSwgcHJvcGVydGllcywgcGFyZW50SWQpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldE1vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvZmlsZSBnZXRQcm9maWxlKFN0cmluZyBwcm9maWxlSWQpIHsKLQkJLy9yZW1vdmUgYW55IGV4aXN0aW5nIHByb2ZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVzb2x2ZWQgSVUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSVUsIHdpdGggbm8gYXR0YWNoZWQgZnJhZ21lbnRzLgotCSAqLwotCXByb3RlY3RlZCBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZVJlc29sdmVkSVUoSUluc3RhbGxhYmxlVW5pdCB1bml0KSB7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQodW5pdCwgbmV3IElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFswXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRlc3QgbWV0YWRhdGEgcmVwb3NpdG9yeSB0byB0aGUgc3lzdGVtIHRoYXQgcHJvdmlkZXMgdGhlIGdpdmVuIHVuaXRzLiAKLQkgKiBUaGUgcmVwb3NpdG9yeSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBpbiB0aGUgdGVhckRvd24gbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShJSW5zdGFsbGFibGVVbml0W10gdW5pdHMpIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbmV3IFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkodW5pdHMpOwotCQlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW4gPSAoTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlcG9NYW4pOwotCQlyZXBvTWFuLmFkZFJlcG9zaXRvcnkocmVwbyk7Ci0JCW1ldGFkYXRhUmVwb3MuYWRkKHJlcG8pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZVN0cmluZygpIHsKLQkJcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi0iICsgTWF0aC5yYW5kb20oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVtcEZvbGRlcigpIHsKLQkJU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUodGVtcERpciwgZ2V0VW5pcXVlU3RyaW5nKCkpOwotCQlkZWxldGUoZm9sZGVyKTsKLQkJZm9sZGVyLm1rZGlycygpOwotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJLy9yZW1vdmUgYWxsIG1ldGFkYXRhIHJlcG9zaXRvcmllcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdAotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmICghbWV0YWRhdGFSZXBvcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBtZXRhZGF0YVJlcG9zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJCXJlcG9NYW4ucmVtb3ZlUmVwb3NpdG9yeShyZXBvLmdldExvY2F0aW9uKCkpOwotCQkJfQotCQkJbWV0YWRhdGFSZXBvcy5jbGVhcigpOwotCQl9Ci0JCS8vcmVtb3ZlIGFsbCBwcm9maWxlcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdAotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2ZpbGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSVByb2ZpbGUgdG9SZW1vdmUgPSAoSVByb2ZpbGUpIGl0Lm5leHQoKTsKLQkJCXByb2ZpbGVSZWdpc3RyeS5yZW1vdmVQcm9maWxlKHRvUmVtb3ZlLmdldFByb2ZpbGVJZCgpKTsKLQkJfQotCQlwcm9maWxlc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCS8vU2VlIGJ1ZyAyMDkwNjkgLSBjdXJyZW50bHkgbm8gd2F5IHRvIHBlcnNpc3QgaW5zdGFsbCByZWdpc3RyeSBjaGFuZ2VzIG9yIGNsZWFyIHRoZSBtZXRhZGF0YSBjYWNoZQotCQkvLwkJSU1ldGFkYXRhUmVwb3NpdG9yeSBjYWNoZSA9IE1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGVJbnN0YW5jZSgoTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgcmVwb01hbik7Ci0JCS8vCQljYWNoZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKgotCSAqIExvb2sgdXAgYW5kIHJldHVybiBhIGZpbGUgaGFuZGxlIHRvIHRoZSBnaXZlbiBlbnRyeSBpbiB0aGUgYnVuZGxlLgotCSAqLwotCXByb3RlY3RlZCBGaWxlIGdldFRlc3REYXRhKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIGVudHJ5IGlzIG51bGwuIik7Ci0JCVVSTCBiYXNlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoZW50cnkpOwotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlICsgIiBlbnRyeSBub3QgZm91bmQgaW4gYnVuZGxlOiAiICsgZW50cnkpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBGaWxlKEZpbGVMb2NhdG9yLnRvRmlsZVVSTChiYXNlKS5nZXRQYXRoKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKG1lc3NhZ2UsIGUpOwotCQl9Ci0JCS8vIGF2b2lkIGNvbXBpbGUgZXJyb3IuLi4gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgY29kZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJbnN0YWxsT3BlcmFuZChQcm92aXNpb25pbmdQbGFuIHBsYW4sIElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJT3BlcmFuZFtdIG9wcyA9IHBsYW4uZ2V0T3BlcmFuZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcHNbaV0gaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSB7Ci0JCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIG9wc1tpXTsKLQkJCQlpZiAoaXVPcC5zZWNvbmQoKS5lcXVhbHMoaXUpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZmFpbCgiQ2FuJ3QgZmluZCAiICsgaXUgKyAiIGluIHRoZSBwbGFuIik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Tm9PcGVyYW5kKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlPcGVyYW5kW10gb3BzID0gcGxhbi5nZXRPcGVyYW5kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9wc1tpXSBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3AgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgb3BzW2ldOwotCQkJCWlmIChpdU9wLnNlY29uZCgpICE9IG51bGwgJiYgaXVPcC5zZWNvbmQoKS5lcXVhbHMoaXUpKQotCQkJCQlmYWlsKGl1ICsgIiBzaG91bGQgbm90IGJlIHByZXNlbnQgaW4gdGhpcyBwbGFuLiIpOwotCQkJCWlmIChpdU9wLmZpcnN0KCkgIT0gbnVsbCAmJiBpdU9wLmZpcnN0KCkuZXF1YWxzKGl1KSkKLQkJCQkJZmFpbChpdSArICIgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGluIHRoaXMgcGxhbi4iKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbiA9IChNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVVSTFtdIHJlcG9zID0gcmVwb01hbi5nZXRLbm93blJlcG9zaXRvcmllcyhNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXBvTWFuLnJlbW92ZVJlcG9zaXRvcnkocmVwb3NbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL0F1dG9tYXRlZFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvQXV0b21hdGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwMjMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvQXV0b21hdGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFzdGVyIHRlc3Qgc3VpdGUgZm9yIGFsbCBhdXRvbWF0ZWQgcHJvdmlzaW9uaW5nIHRlc3RzLiBJdCBydW5zIGV2ZXJ5IHRlc3QKLSAqIHRoYXQgaXMgc3VpdGFibGUgZm9yIHJ1bm5pbmcgaW4gYW4gYXV0b21hdGVkIGZhc2hpb24gYXMgcGFydCBvZiBhIGJ1aWxkLiBTb21lCi0gKiB0ZXN0cyBtYXkgYmUgZXhjbHVkZWQgaWYgdGhleSByZXF1aXJlIHNwZWNpYWwgc2V0dXAgKHN1Y2ggYXMgZ2VuZXJhdGluZyBtZXRhZGF0YSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQXV0b21hdGVkVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnMuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZG93bmxvYWQuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmUuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5nZW5lcmF0b3IuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhLnJlcG9zaXRvcnkuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2FyLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlci5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNpbXBsZWNvbmZpZ3VyYXRvci5TaW1wbGVDb25maWd1cmF0b3JUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnVwZGF0ZXNpdGUuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9NYW51YWxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL01hbnVhbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2ViMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL01hbnVhbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBtYXN0ZXIgdGVzdCBzdWl0ZSBmb3IgYWxsIGF1dG9tYXRlZCBwcm92aXNpb25pbmcgdGVzdHMgdGhhdCByZXF1aXJlIHNvbWUKLSAqIG1hbnVhbCBzZXQuIFRoZXNlIHRlc3RzIGNhbid0IGJlIHJ1biBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgYSBidWlsZC4KLSAqLwotcHVibGljIGNsYXNzIE1hbnVhbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBdXRvbWF0ZWRUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5mdWxsLkRpcmVjdG9yVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdEFjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0M2VlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdEFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9QUk9WX1RFU1RTID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdCI7Ci0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBzdGF0aWMgUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWYgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RBY3RpdmF0b3IuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcGFja2FnZUFkbWluID0gKFBhY2thZ2VBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0KLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIHRoZSBqdW5pdCBwbHVnaW4gbGF1bmNoIGNvbmZpZyBkbyBub3QgYWxsb3cgdG8gc3RhcnQgYnVuZGxlcwotCQlnZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiKS5zdGFydCgpOwotCQlnZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIpLnN0YXJ0KCk7Ci0JCWdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiKS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9SZXR1cm4gdGhlIGZpcnN0IGJ1bmRsZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb3IgdW5pbnN0YWxsZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewotCQkJCXJldHVybiBidW5kbGVzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RBcnRpZmFjdFJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0QXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjk0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5SZXBvc2l0b3J5Q3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeTsKLQotLyoqCi0gKiBBIHNpbXBsZSBhcnRpZmFjdCByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0gKiBBbGwgYXJ0aWZhY3RzIGFyZSBrZXB0IGluIG1lbW9yeS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJ0ZXN0YXJ0aWZhY3RyZXBvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBVGVzdEFydGlmYWN0UmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0ZXN0YXJ0aWZhY3RyZXBvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSID0gIm9yZy5lY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJBIFRlc3QgQXJ0aWZhY3QgUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE1hcCBvZiBJQXJ0aWZhY3RLZXkgLT4gU3RyaW5nIChsb2NhdGlvbikKLQkgKi8KLQlNYXAga2V5c1RvTG9jYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBNYXAgb2YgU3RyaW5nIChsb2NhdGlvbikgLT4gYnl0ZVtdIChjb250ZW50cykKLQkgKi8KLQlNYXAgbG9jYXRpb25zVG9Db250ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiAJU2V0IG9mIGFydGlmYWN0IGRlc2NyaXB0b3JzCi0JICovCi0JU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JVHJhbnNwb3J0IHRlc3RoYW5kbGVyID0gbmV3IFRyYW5zcG9ydCgpIHsKLQkJcHVibGljIElTdGF0dXMgZG93bmxvYWQoU3RyaW5nIHRvRG93bmxvYWQsIE91dHB1dFN0cmVhbSB0YXJnZXQsIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCWJ5dGVbXSBjb250ZW50cyA9IChieXRlW10pIGxvY2F0aW9uc1RvQ29udGVudHMuZ2V0KHRvRG93bmxvYWQpOwotCQkJaWYgKGNvbnRlbnRzID09IG51bGwpCi0JCQkJQXNzZXJ0LmZhaWwoIkF0dGVtcHQgdG8gZG93bmxvYWQgbWlzc2luZyBhcnRpZmFjdCBpbiBUZXN0QXJ0aWZhY3RSZXBvc2l0b3J5OiAiICsgdG9Eb3dubG9hZCk7Ci0JCQl0cnkgewotCQkJCXRhcmdldC53cml0ZShjb250ZW50cyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlBc3NlcnQuZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gVGVzdEFydGlmYWN0UmVwb3NpdG9yeSIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX07Ci0KLQlwdWJsaWMgVGVzdEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJc3VwZXIoTkFNRSwgVFlQRSwgVkVSU0lPTiwgbnVsbCwgREVTQ1JJUFRJT04sIFBST1ZJREVSKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdChJQXJ0aWZhY3RLZXkga2V5LCBieXRlW10gY29udGVudHMpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0ga2V5LnRvU3RyaW5nKCk7Ci0JCWtleXNUb0xvY2F0aW9ucy5wdXQoa2V5LCBsb2NhdGlvbik7Ci0JCWxvY2F0aW9uc1RvQ29udGVudHMucHV0KGxvY2F0aW9uLCBjb250ZW50cyk7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRBcnRpZmFjdChJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpIGtleXNUb0xvY2F0aW9ucy5nZXQoa2V5KTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJJKFNDSEVNRSwgbG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoIkludmFsaWQgVVJJIGluIFRlc3RBcnRpZmFjdFJlcG9zaXRvcnk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKSB7Ci0JCXJldHVybiAoSUFydGlmYWN0S2V5W10pIGtleXNUb0xvY2F0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBJQXJ0aWZhY3RLZXlba2V5c1RvTG9jYXRpb25zLmtleVNldCgpLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRBcnRpZmFjdChBcnRpZmFjdFJlcXVlc3QgcmVxdWVzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJlcXVlc3Quc2V0U291cmNlUmVwb3NpdG9yeSh0aGlzKTsKLQkJcmVxdWVzdC5wZXJmb3JtKG1vbml0b3IpOwotCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzdWJNb25pdG9yID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHJlcXVlc3RzLmxlbmd0aCk7Ci0JCXRyeSB7Ci0JCQlNdWx0aVN0YXR1cyBvdmVyYWxsU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFRlc3RBY3RpdmF0b3IuUElfUFJPVl9URVNUUywgSVN0YXR1cy5PSywgbnVsbCwgbnVsbCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb3ZlcmFsbFN0YXR1cy5hZGQoZ2V0QXJ0aWZhY3QoKEFydGlmYWN0UmVxdWVzdCkgcmVxdWVzdHNbaV0sIHN1Yk1vbml0b3IubmV3Q2hpbGQoMSkpKTsKLQkJCX0KLQkJCXJldHVybiAobW9uaXRvci5pc0NhbmNlbGVkKCkgPyBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyA6IG92ZXJhbGxTdGF0dXMpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFVSTCByZXBvVVJMLCBJbnB1dFN0cmVhbSBkZXNjcmlwdG9yRmlsZSkgdGhyb3dzIFJlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvY2F0aW9uID0gcmVwb1VSTDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIGtleXNUb0xvY2F0aW9ucy5nZXQoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGtleXNUb0xvY2F0aW9ucy5nZXQoa2V5KSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKCk7Ci0JCWRlc3RpbmF0aW9uID0gaGFuZGxlci5jcmVhdGVBbmRMaW5rKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCksIG51bGwsIGRlc3RpbmF0aW9uLCBtb25pdG9yKTsKLQkJdGVzdGhhbmRsZXIuZG93bmxvYWQoKFN0cmluZykga2V5c1RvTG9jYXRpb25zLmdldChkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWlmICghY29udGFpbnMoa2V5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IElBcnRpZmFjdERlc2NyaXB0b3JbXSB7bmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkoKEFydGlmYWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuc2V0UmVwb3NpdG9yeSh0aGlzKTsKLQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCWtleXNUb0xvY2F0aW9ucy5wdXQoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZW1vdmVEZXNjcmlwdG9yKGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0RGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yIG5leHREZXNjcmlwdG9yID0gKElBcnRpZmFjdERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGtleS5lcXVhbHMobmV4dERlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSkpIHsKLQkJCQlhcnRpZmFjdERlc2NyaXB0b3JzLnJlbW92ZShuZXh0RGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtleXNUb0xvY2F0aW9ucy5jb250YWluc0tleShrZXkpKSB7Ci0JCQlTdHJpbmcgdGhlTG9jYXRpb24gPSAoU3RyaW5nKSBrZXlzVG9Mb2NhdGlvbnMuZ2V0KGtleSk7Ci0JCQlsb2NhdGlvbnNUb0NvbnRlbnRzLnJlbW92ZSh0aGVMb2NhdGlvbik7Ci0JCQlrZXlzVG9Mb2NhdGlvbnMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWFydGlmYWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJa2V5c1RvTG9jYXRpb25zLmNsZWFyKCk7Ci0JCWxvY2F0aW9uc1RvQ29udGVudHMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0RGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3REYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDFkODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBSZWQgSGF0LCBJbmMuIChBbmRyZXcgT3ZlcmhvbHQpIC0gYWRkIGdldEZpbGUgbWV0aG9kCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotCi0vKioKLSAqIDxjb2RlPlRlc3REYXRhPC9jb2RlPiBoZWxwcyB3aXRoIGhhbmRsaW5nIG9mIHRlc3QgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3REYXRhIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RBVEFfUk9PVF9GT0xERVIgPSAidGVzdERhdGEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfU0VQRVJBVE9SID0gIn4iOwotCi0JLyoqCi0JICogR2V0IGFuIGlucHV0IHN0cmVhbSBmcm9tIHRoZSByZXNvdXJjZSB0ZXN0RGF0YU5hbWUgd2l0aGluIHRoZSBmb2xkZXIgCi0JICogdGVzdERhdGFGb2xkZXIgb2YgdGhlIHRlc3REYXRhIGZvbGRlciBvZiB0aGlzIHByb2plY3QuCi0JICogQHBhcmFtIHRlc3REYXRhRm9sZGVyCi0JICogQHBhcmFtIHRlc3REYXRhTmFtZQotCSAqIEByZXR1cm4gaW5wdXQgc3RyZWFtIGZvciB0aGUgdGVzdCBkYXRhCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0KFN0cmluZyB0ZXN0RGF0YUZvbGRlciwgU3RyaW5nIHRlc3REYXRhTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KFRFU1RfREFUQV9ST09UX0ZPTERFUiArICIvIiArIHRlc3REYXRhRm9sZGVyICsgIi8iICsgdGVzdERhdGFOYW1lKS5vcGVuU3RyZWFtKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIEZpbGUgZnJvbSB0aGUgcmVzb3VyY2UgdGVzdERhdGFOYW1lIHdpdGhpbiB0aGUgZm9sZGVyIAotCSAqIHRlc3REYXRhRm9sZGVyIG9mIHRoZSB0ZXN0RGF0YSBmb2xkZXIgb2YgdGhpcyBwcm9qZWN0LgotCSAqIEBwYXJhbSB0ZXN0RGF0YUZvbGRlcgotCSAqIEByZXR1cm4gdGVzdCBkYXRhIEZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEZpbGUoU3RyaW5nIHRlc3REYXRhRm9sZGVyLCBTdHJpbmcgdGVzdERhdGFOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KFRFU1RfREFUQV9ST09UX0ZPTERFUiArICIvIiArIHRlc3REYXRhRm9sZGVyICsgIi8iICsgdGVzdERhdGFOYW1lKSkuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBmb3IgdGhlIHRlc3QgZGF0YS4gVGhlIHRlbXBvcmFyeSBmaWxlIHdpbGwgYmUgZGVsZXRlZCAKLQkgKiB3aGVuIHRoZSBqdm0gZXhpc3RzLiBJZiB0ZXN0RGF0YU5hbWUgY29udGFpbnMgYW4gZXh0ZW5zaW9uIHRoaXMgZXh0ZW5zaW9uIHdpbGwKLQkgKiBiZSB1c2VkIGFzIHN1ZmZpeCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlLgotCSAqIEBwYXJhbSB0ZXN0RGF0YUZvbGRlcgotCSAqIEBwYXJhbSB0ZXN0RGF0YU5hbWUKLQkgKiBAcmV0dXJuIHRlbXBvcmFyeSBmaWxlIHdpdGggdGVzdCBkYXRhCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZW1wRmlsZShTdHJpbmcgdGVzdERhdGFGb2xkZXIsIFN0cmluZyB0ZXN0RGF0YU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcCA9IGNyZWF0ZVRlbXBGaWxlKHRlc3REYXRhTmFtZSk7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oZ2V0KHRlc3REYXRhRm9sZGVyLCB0ZXN0RGF0YU5hbWUpLCB0cnVlLCBvdXQsIHRydWUpOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZS4gVGhpcyBmaWxlIHdpbGwgYmUgZGVsZXRlZCBpZiB0aGUganZtIGV4aXRzLiAKLQkgKiBJZiB0ZXN0RGF0YU5hbWUgY29udGFpbnMgYW4gZXh0ZW5zaW9uIHRoaXMgZXh0ZW5zaW9uIHdpbGwgYmUgdXNlZCBhcyAKLQkgKiBzdWZmaXggZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZS4KLQkgKiBAcGFyYW0gdGVzdERhdGFOYW1lCi0JICogQHJldHVybiB0ZW1wb3JhcnkgZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHRlc3REYXRhTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGkgPSB0ZXN0RGF0YU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJRmlsZSB0ZW1wID0gKGkgPT0gLTEpID8gRmlsZS5jcmVhdGVUZW1wRmlsZSh0ZXN0RGF0YU5hbWUgKyBQUkVGSVhfU0VQRVJBVE9SLCAiLnRtcCIpIDogRmlsZS5jcmVhdGVUZW1wRmlsZSh0ZXN0RGF0YU5hbWUuc3Vic3RyaW5nKDAsIGkpICsgUFJFRklYX1NFUEVSQVRPUiwgdGVzdERhdGFOYW1lLnN1YnN0cmluZyhpKSk7Ci0JCXRlbXAuZGVsZXRlT25FeGl0KCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIEFzc2VydCBlcXVhbGl0eSBvZiBmaWxlcy4KLQkgKiBAcGFyYW0gZXhwZWN0ZWQKLQkgKiBAcGFyYW0gYWN0dWFsCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoRmlsZSBleHBlY3RlZCwgRmlsZSBhY3R1YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkZpbGVzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIiwgZXhwZWN0ZWQubGVuZ3RoKCksIGFjdHVhbC5sZW5ndGgoKSk7Ci0JCVRlc3REYXRhLmFzc2VydEVxdWFscyhuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGV4cGVjdGVkKSksIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oYWN0dWFsKSkpOwotCX0KLQotCS8qKgotCSAqIEFzc2VydCBlcXVhbGl0eSBvZiBpbnB1dCBzdHJlYW1zLgotCSAqIEBwYXJhbSBleHBlY3RlZAotCSAqIEBwYXJhbSBhY3R1YWwKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhJbnB1dFN0cmVhbSBleHBlY3RlZCwgSW5wdXRTdHJlYW0gYWN0dWFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaW50IHJlYWRFeHBlY3RlZCA9IDA7Ci0JCQlpbnQgcmVhZEFjdHVhbCA9IDA7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJd2hpbGUgKHJlYWRBY3R1YWwgIT0gLTEgJiYgcmVhZEV4cGVjdGVkICE9IC0xKSB7Ci0JCQkJcmVhZEFjdHVhbCA9IGFjdHVhbC5yZWFkKCk7Ci0JCQkJcmVhZEV4cGVjdGVkID0gZXhwZWN0ZWQucmVhZCgpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIkRpZmZlcmVudCBieXRlcyBhdCAiICsgY291bnQsIHJlYWRFeHBlY3RlZCwgcmVhZEFjdHVhbCk7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChleHBlY3RlZCAhPSBudWxsKQotCQkJCWV4cGVjdGVkLmNsb3NlKCk7Ci0JCQlpZiAoYWN0dWFsICE9IG51bGwpCi0JCQkJYWN0dWFsLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnQgZXF1YWxpdHkgb2YgemlwIGlucHV0IHN0cmVhbXMuCi0JICogQHBhcmFtIGlucHV0MQotCSAqIEBwYXJhbSBpbnB1dDIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhaaXBJbnB1dFN0cmVhbSBpbnB1dDEsIFppcElucHV0U3RyZWFtIGlucHV0MikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTWFwIGphcjEgPSBnZXRFbnRyaWVzKGlucHV0MSk7Ci0JCU1hcCBqYXIyID0gZ2V0RW50cmllcyhpbnB1dDIpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBqYXIxLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCU9iamVjdFtdIGZpbGUxID0gKE9iamVjdFtdKSBqYXIxLmdldChuYW1lKTsKLQkJCU9iamVjdFtdIGZpbGUyID0gKE9iamVjdFtdKSBqYXIyLnJlbW92ZShuYW1lKTsKLQkJCUFzc2VydC5hc3NlcnROb3ROdWxsKGZpbGUyKTsKLQotCQkJWmlwRW50cnkgZW50cnkxID0gKFppcEVudHJ5KSBmaWxlMVswXTsKLQkJCVppcEVudHJ5IGVudHJ5MiA9IChaaXBFbnRyeSkgZmlsZTJbMF07Ci0JCQkvLyBjb21wYXJlIHRoZSBlbnRyaWVzCi0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeTIuZ2V0TmFtZSgpKSk7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0U2l6ZSgpID09IGVudHJ5Mi5nZXRTaXplKCkpOwotCQkJLy8JVE9ETyBmb3Igbm93IHNraXAgb3ZlciB0aGUgdGltZXN0YW1wIGFzIHRoZXkgc2VlbSB0byBiZSBkaWZmZXJlbnQKLQkJCS8vIGFzc2VydFRydWUoZW50cnkxLmdldFRpbWUoKSA9PSBlbnRyeTIuZ2V0VGltZSgpKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5pc0RpcmVjdG9yeSgpID09IGVudHJ5Mi5pc0RpcmVjdG9yeSgpKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5nZXRDcmMoKSA9PSBlbnRyeTIuZ2V0Q3JjKCkpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoZW50cnkxLmdldE1ldGhvZCgpID09IGVudHJ5Mi5nZXRNZXRob2QoKSk7Ci0KLQkJCS8vIGNoZWNrIHRoZSBjb250ZW50IG9mIHRoZSBlbnRyaWVzCi0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKChieXRlW10pIGZpbGUxWzFdLCAoYnl0ZVtdKSBmaWxlMlsxXSkpOwotCQl9Ci0KLQkJLy8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBjb25zdW1lZCBhbGwgb2YgdGhlIGVudHJpZXMgaW4gdGhlIHNlY29uZCBKQVIKLQkJQXNzZXJ0LmFzc2VydFRydWUoamFyMi5zaXplKCkgPT0gMCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldEVudHJpZXMoWmlwSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJWmlwRW50cnkgZW50cnkgPSBpbnB1dC5nZXROZXh0RW50cnkoKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb250ZW50ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXQsIGZhbHNlLCBjb250ZW50LCB0cnVlKTsKLQkJCWlucHV0LmNsb3NlRW50cnkoKTsKLQkJCXJlc3VsdC5wdXQoZW50cnkuZ2V0TmFtZSgpLCBuZXcgT2JqZWN0W10ge2VudHJ5LCBjb250ZW50LnRvQnl0ZUFycmF5KCl9KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0TWV0YWRhdGFSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTkwMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0TWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogQSBzaW1wbGUgbWV0YWRhdGEgcmVwb3NpdG9yeSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAgQWxsIG1ldGFkYXRhCi0gKiBpcyBrZXB0IGluIG1lbW9yeS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiQSBUZXN0IE1ldGFkYXRhIFJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiQVRlc3RNZXRhZGF0YVJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSID0gIm9yZy5lY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInRlc3RtZXRhZGF0YXJlcG8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIExpc3QgdW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkwgY3JlYXRlTG9jYXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQkvL0p1c3QgbmVlZCBhIHVuaXF1ZSBVUkwgLSB3ZSBkb24ndCBuZWVkIHRvIHJlYWQvd3JpdGUgdGhpcyBsb2NhdGlvbgotCQkJcmV0dXJuIG5ldyBVUkwoImh0dHA6Ly9UZXN0TWV0YWRhdGFSZXBvc2l0b3J5LmNvbS8iICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXN0TWV0YWRhdGFSZXBvc2l0b3J5KElJbnN0YWxsYWJsZVVuaXRbXSBpdXMpIHsKLQkJc3VwZXIoTkFNRSwgVFlQRSwgVkVSU0lPTiwgY3JlYXRlTG9jYXRpb24oKSwgREVTQ1JJUFRJT04sIFBST1ZJREVSKTsKLQkJdW5pdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoaXVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gdG9BZGQpIHsKLQkJdW5pdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QodG9BZGQpKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBmaW5kKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb25TdHJpbmcpIHsKLQkJSXRlcmF0b3IgcmVzdWx0ID0gcXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSAocmVzdWx0Lmhhc05leHQoKSA/IHJlc3VsdC5uZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBUZXN0TWV0YWRhdGFSZXBvc2l0b3J5LmNsYXNzIHx8IGFkYXB0ZXIgPT0gSU1ldGFkYXRhUmVwb3NpdG9yeS5jbGFzcyB8fCBhZGFwdGVyID09IElSZXBvc2l0b3J5LmNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHF1ZXJ5LnBlcmZvcm0odW5pdHMuaXRlcmF0b3IoKSwgY29sbGVjdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXVuaXRzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gdG9SZW1vdmUpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7Ci0JCQltb2RpZmllZCB8PSB1bml0cy5yZW1vdmUodG9SZW1vdmVbaV0pOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFJlcG9zaXRvcnlTdGF0ZSBzdGF0ZSkgewotCQl0aGlzLm5hbWUgPSBzdGF0ZS5OYW1lOwotCQl0aGlzLnR5cGUgPSBzdGF0ZS5UeXBlOwotCQl0aGlzLnZlcnNpb24gPSBzdGF0ZS5WZXJzaW9uLnRvU3RyaW5nKCk7Ci0JCXRoaXMucHJvdmlkZXIgPSBzdGF0ZS5Qcm92aWRlcjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IHN0YXRlLkRlc2NyaXB0aW9uOwotCQl0aGlzLmxvY2F0aW9uID0gc3RhdGUuTG9jYXRpb247Ci0JCXRoaXMucHJvcGVydGllcyA9IHN0YXRlLlByb3BlcnRpZXM7Ci0JCXRoaXMudW5pdHMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuVW5pdHMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0YmU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkaXJlY3RvciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKQkRpZmZTdGVwVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKQkRpZmZaaXBTdGVwVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYWNrMjAwT3B0aW1pemVyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXJEZWx0YU9wdGltaXplclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVnMjA5MjMzVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9CdWcyMDkyMzNUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9CdWcyMDkyMzNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmFjMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvQnVnMjA5MjMzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBpZS53b21iYXQuamJkaWZmLkpCRGlmZjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdERhdGE7Ci0KLS8qKgotICogLi4uIDxjb2RlPkJ1ZzIwOTIzM1Rlc3Q8L2NvZGU+IC4uLgotICovCi1wdWJsaWMgY2xhc3MgQnVnMjA5MjMzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlc3REYXRhRGlmZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUZpbGUgcHJlZGVjZXNzb3IgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIiKTsKLQkvLwkJRmlsZSBjdXJyZW50ID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyIik7Ci0JLy8JCUZpbGUgZGlmZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMH4iLCAiLmpiZGlmZiIpOwotCS8vCQlKQkRpZmYuYnNkaWZmKHByZWRlY2Vzc29yLCBjdXJyZW50LCBkaWZmKTsKLQkvLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkpkdDMyU2FyVG9KZHQzM1NhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gY3VycmVudCA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGN1cnJlbnRCUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oY3VycmVudCwgdHJ1ZSwgY3VycmVudEJTLCB0cnVlKTsKLQkJYnl0ZVtdIGN1cnJlbnRCeXRlcyA9IGN1cnJlbnRCUy50b0J5dGVBcnJheSgpOwotCi0JCUlucHV0U3RyZWFtIHByZWRlY2Vzc29yID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhciIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJlZGVjZXNzb3JCUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0ocHJlZGVjZXNzb3IsIHRydWUsIHByZWRlY2Vzc29yQlMsIHRydWUpOwotCQlieXRlW10gcHJlZGVjZXNzb3JCeXRlcyA9IHByZWRlY2Vzc29yQlMudG9CeXRlQXJyYXkoKTsKLQotCQlieXRlW10gYWN0dWFsQnl0ZXMgPSBKQkRpZmYuYnNkaWZmKHByZWRlY2Vzc29yQnl0ZXMsIHByZWRlY2Vzc29yQnl0ZXMubGVuZ3RoLCBjdXJyZW50Qnl0ZXMsIGN1cnJlbnRCeXRlcy5sZW5ndGgpOwotCi0JCUlucHV0U3RyZWFtIGV4cGVjdGVkID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkQlMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGV4cGVjdGVkLCB0cnVlLCBleHBlY3RlZEJTLCB0cnVlKTsKLQkJYnl0ZVtdIGV4cGVjdGVkQnl0ZXMgPSBleHBlY3RlZEJTLnRvQnl0ZUFycmF5KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJEaWZmZXJlbnQgbGVuZ3Rocy4iLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCwgYWN0dWFsQnl0ZXMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGJ5dGVzLiIsIEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRCeXRlcywgYWN0dWFsQnl0ZXMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9KQkRpZmZTdGVwVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvSkJEaWZmU3RlcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzY3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9KQkRpZmZTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLkFydGlmYWN0UmVwb3NpdG9yeU1vY2s7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdCB0aGUgPGNvZGU+SkJEaWZmU3RlcFRlc3Q8L2NvZGU+IHByb2Nlc3Npbmcgc3RlcC4KLSAqLwotcHVibGljIGNsYXNzIEpCRGlmZlN0ZXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLy8JcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlVGVzdERhdGFFeGUzMlRvMzMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vCQlGaWxlIGV4ZTMyID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoIm9wdGltaXplcnMiLCAiZWNsaXBzZS0zLjIuZXhlIik7Ci0JLy8JCUZpbGUgZXhlMzMgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgib3B0aW1pemVycyIsICJlY2xpcHNlLTMuMy5leGUiKTsKLQkvLwkJRmlsZSBkaWZmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWNsaXBzZS0zLjItMy4zfiIsICIuamJkaWZmIik7Ci0JLy8JCUpCRGlmZi5ic2RpZmYoZXhlMzIsIGV4ZTMzLCBkaWZmKTsKLQkvLwl9Ci0KLQkvKioKLQkgKiBUZXN0IGRpZmZpbmcgdGhlIGxhdW5jaGVyLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVjbGlwc2VFeGUzMnRvMzMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlIik7Ci0JCU1vY2thYmxlSkJEaWZmU3RlcCBkaWZmZXIgPSBuZXcgTW9ja2FibGVKQkRpZmZTdGVwKHJlcG9Nb2NrKTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIHN0ZXBEZXNjcmlwdG9yID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigiaWQiLCAibnMsY2wsaWQxLDEuMCIsIHRydWUpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJjbCIsICJpZDEiLCBuZXcgVmVyc2lvbigiMS4xIikpOwotCQlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkJZGlmZmVyLmluaXRpYWxpemUoc3RlcERlc2NyaXB0b3IsIGRlc2NyaXB0b3IpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZGlmZmVyLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgImVjbGlwc2UtMy4zLmV4ZSIpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZGlmZmVyLCB0cnVlKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJlY2xpcHNlLTMuMi0zLjMuamJkaWZmIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCksIGRlc3RpbmF0aW9uLnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKQkRpZmZTdGVwIGV4dGVuZHMgSkJEaWZmU3RlcCB7Ci0JCXB1YmxpYyBNb2NrYWJsZUpCRGlmZlN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlcihyZXBvc2l0b3J5KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvSkJEaWZmWmlwU3RlcFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0pCRGlmZlppcFN0ZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDQyNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvSkJEaWZmWmlwU3RlcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZaaXBTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLkFydGlmYWN0UmVwb3NpdG9yeU1vY2s7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdCB0aGUgPGNvZGU+SkJEaWZmWmlwVGVzdDwvY29kZT4gcHJvY2Vzc2luZyBzdGVwLgotICovCi1wdWJsaWMgY2xhc3MgSkJEaWZmWmlwU3RlcFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JLyoqCi0JICogVGVzdCBkaWZmaW5nIHRoZSA8Yj5ub3JtYWxpemVkPC9iPiBqYXJzLiBUaGlzIGlzIGluZGljYXRlZCBieSB0aGUgZXh0ZW5zaW9uICIubmphciIuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REaWZmSmR0MzJ0bzMzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvTW9jayA9IEFydGlmYWN0UmVwb3NpdG9yeU1vY2suZ2V0TW9jaygidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphciIpOwotCQlNb2NrYWJsZUpCRGlmZlppcFN0ZXAgZGlmZmVyID0gbmV3IE1vY2thYmxlSkJEaWZmWmlwU3RlcChyZXBvTW9jayk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBzdGVwRGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAiLCB0cnVlKTsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiY2wiLCAiaWQxIiwgbmV3IFZlcnNpb24oIjEuMSIpKTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCWRpZmZlci5pbml0aWFsaXplKHN0ZXBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yKTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWRpZmZlci5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphciIpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZGlmZmVyLCB0cnVlKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAtMy4zLjAuamJkaWZmIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQotCQlhc3NlcnRUcnVlKCJEaWZmZXJlbnQgZGlmZiBieXRlcy4iLCBBcnJheXMuZXF1YWxzKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCksIGRlc3RpbmF0aW9uLnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKQkRpZmZaaXBTdGVwIGV4dGVuZHMgSkJEaWZmWmlwU3RlcCB7Ci0JCXB1YmxpYyBNb2NrYWJsZUpCRGlmZlppcFN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlcihyZXBvc2l0b3J5KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0phckRlbHRhT3B0aW1pemVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvSmFyRGVsdGFPcHRpbWl6ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWQ1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvSmFyRGVsdGFPcHRpbWl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhLkphckRlbHRhT3B0aW1pemVyU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29ycy5BcnRpZmFjdFJlcG9zaXRvcnlNb2NrOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgdGhlIDxjb2RlPkphckRlbHRhPC9jb2RlPiBwcm9jZXNzaW5nIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJEZWx0YU9wdGltaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLwlwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIiKTsKLQkvLwkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBNb2NrYWJsZUphckRlbHRhT3B0aW1pemVyU3RlcChyZXBvTW9jayk7Ci0JLy8JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBzdGVwRGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAuMC4xIiwgdHJ1ZSk7Ci0JLy8JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoIm5zIiwgImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjAuMC4yIikpOwotCS8vCQlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkvLwkJc3RlcC5pbml0aWFsaXplKHN0ZXBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yKTsKLQkvLwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCS8vCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCS8vCi0JLy8JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMi5qYXIiKS5vcGVuU3RyZWFtKCk7Ci0JLy8JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkvLwkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkvLwotCS8vCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKTsKLQkvLwkJRmlsZU91dHB1dFN0cmVhbSBmaWxlID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oImQ6L2phcmRlbHRhLmphciIpOwotCS8vCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZmlsZSwgdHJ1ZSk7Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wdGltaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIiKTsKLQkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBNb2NrYWJsZUphckRlbHRhT3B0aW1pemVyU3RlcChyZXBvTW9jayk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBzdGVwRGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAuMC4xIiwgdHJ1ZSk7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjAuMC4yIikpOwotCQlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkJc3RlcC5pbml0aWFsaXplKHN0ZXBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgInRlc3RkYXRhXzEuMC4wLjIuamFyIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4xLTIuamFyIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQotCQlaaXBJbnB1dFN0cmVhbSBleHBlY3RlZEphciA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSkpOwotCQlaaXBJbnB1dFN0cmVhbSB0ZXN0SmFyID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKSk7Ci0JCVRlc3REYXRhLmFzc2VydEVxdWFscyhleHBlY3RlZEphciwgdGVzdEphcik7Ci0JCWV4cGVjdGVkSmFyLmNsb3NlKCk7Ci0JCXRlc3RKYXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKYXJEZWx0YU9wdGltaXplclN0ZXAgZXh0ZW5kcyBKYXJEZWx0YU9wdGltaXplclN0ZXAgewotCQlwdWJsaWMgTW9ja2FibGVKYXJEZWx0YU9wdGltaXplclN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlcihyZXBvc2l0b3J5KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL1BhY2syMDBPcHRpbWl6ZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9QYWNrMjAwT3B0aW1pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGZiZjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL1BhY2syMDBPcHRpbWl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwLlBhY2syMDBPcHRpbWl6ZXJTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFBhY2syMDBPcHRpbWl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBhY2syMDBPcHRpbWl6ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBQYWNrMjAwT3B0aW1pemVyVGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCS8vCXB1YmxpYyB2b2lkIHRlc3RQcmVwYXJlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLwkJLy8gU2V0dXAgdGhlIHN0ZXAKLQkvLwkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBQYWNrMjAwT3B0aW1pemVyU3RlcCgpOwotCS8vCQlGaWxlT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oImM6L3BhY2tlZC5wYWNrLmd6Iik7Ci0JLy8JCXN0ZXAubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JLy8KLQkvLwkJLy8gZHJpdmUgdGhlIHNvdXJjZSBkYXRhIHRocm91Z2ggdGhlIHN0ZXAKLQkvLwkJQnVuZGxlIGJ1bmRsZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpOwotCS8vCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGJ1bmRsZS5nZXRFbnRyeSgidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIiKS5vcGVuU3RyZWFtKCk7Ci0JLy8JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkvLwotCS8vCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2V0dXAgdGhlIHN0ZXAKLQkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBQYWNrMjAwT3B0aW1pemVyU3RlcCgpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXN0ZXAubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJLy8gZHJpdmUgdGhlIHNvdXJjZSBkYXRhIHRocm91Z2ggdGhlIHN0ZXAKLQkJQnVuZGxlIGJ1bmRsZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGJ1bmRsZS5nZXRFbnRyeSgidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIiKS5vcGVuU3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQotCQkvLyBHZXQgdGhlIHRlc3QgZGF0YS4gVGhlIFN1biAxLjYuMF8wMSBKUkUgcHJvZHVjZXMgYSBkaWZmZXJlbnQgcGFja2VkIGZpbGUKLQkJLy8gdGhlbiB0aGUgSUJNIFY1IEpSRSwgc28gYm90aCB2ZXJzaW9ucyBvZiB0aGUgdGVzdCBkYXRhIGFyZSBtYWludGFpbmVkLgotCQkvLyBUT0RPOiBpbnZlc3RpZ2F0ZSB0aGlzPyBJcyB0aGUgZGlmZmVyZW5jZSBzcHVyaW91cz8gQXJlIHRoZXJlIGRpZmZlcmVuY2VzCi0JCS8vCQkgaW4gdGhlIHBhY2syMDAgcmVzdWx0cyBmb3Igb3RoZXIgSlJFcz8gRG8gd2UgbmVlZCBhIG1vcmUgZ2VuZXJhbAotCQkvLwkJIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtPwotCQlTdHJpbmcgamF2YVZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOwotCQlib29sZWFuIGlzMV82ID0gKGphdmFWZXJzaW9uLmNvbXBhcmVUbygiMS42IikgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpZiAoIWlzMV82KSB7Ci0JCQlpbnB1dFN0cmVhbSA9IGJ1bmRsZS5nZXRFbnRyeSgidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiIpLm9wZW5TdHJlYW0oKTsKLQkJfSBlbHNlIHsKLQkJCWlucHV0U3RyZWFtID0gYnVuZGxlLmdldEVudHJ5KCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiIpLm9wZW5TdHJlYW0oKTsKLQkJfQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJLy8gQ29tcGFyZQotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjZkNWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkJQYXRjaFN0ZXBUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpCUGF0Y2haaXBTdGVwVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXJEZWx0YVByb2Nlc3NvclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFjazIwMFByb2Nlc3NvclRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Yzg1YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi0vKioKLSAqIE1vY2sgdGhlIGdldEFydGlmYWN0KCkgbmVlZGVkIHRvIGxvY2F0ZSB0aGUgcHJlZGVjZXNzb3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RSZXNvdXJjZTsKLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRNb2NrKFN0cmluZyBhcnRpZmFjdFJlc291cmNlKSB7Ci0JCXJldHVybiAoSUFydGlmYWN0UmVwb3NpdG9yeSkgUHJveHkubmV3UHJveHlJbnN0YW5jZShJQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tdIHtJQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzfSwgbmV3IEFydGlmYWN0UmVwb3NpdG9yeU1vY2soYXJ0aWZhY3RSZXNvdXJjZSkpOwotCX0KLQotCXByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5TW9jayhTdHJpbmcgYXJ0aWZhY3RSZXNvdXJjZSkgewotCQl0aGlzLmFydGlmYWN0UmVzb3VyY2UgPSBhcnRpZmFjdFJlc291cmNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWlmICghbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldEFydGlmYWN0IikpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB1c2FnZSEiKTsKLQotCQlyZXR1cm4gZ2V0QXJ0aWZhY3QoKElBcnRpZmFjdERlc2NyaXB0b3IpIGFyZ3NbMF0sIChPdXRwdXRTdHJlYW0pIGFyZ3NbMV0sIChJUHJvZ3Jlc3NNb25pdG9yKSBhcmdzWzJdKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgZ2V0QXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoYXJ0aWZhY3RSZXNvdXJjZSkub3BlblN0cmVhbSgpOwotCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGRlc3RpbmF0aW9uLCB0cnVlKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUZXN0QWN0aXZhdG9yLlBJX1BST1ZfVEVTVFMsICI6LSgiLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KQlBhdGNoU3RlcFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2hTdGVwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhmMjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2hTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgdGhlIDxjb2RlPkpCUGF0Y2hTdGVwPC9jb2RlPgotICoKLSAqLwotcHVibGljIGNsYXNzIEpCUGF0Y2hTdGVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RQYXRjaEVjbGlwc2VFeGUzMnRvMzMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9Nb2NrID0gQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5nZXRNb2NrKCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4yLmV4ZSIpOwotCQlQcm9jZXNzaW5nU3RlcCBwYXRjaGVyID0gbmV3IE1vY2thYmxlSkJQYXRjaFN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAiLCB0cnVlKTsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiY2wiLCAiaWQxIiwgbmV3IFZlcnNpb24oIjEuMSIpKTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCXBhdGNoZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXBhdGNoZXIubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAiZWNsaXBzZS0zLjItMy4zLmpiZGlmZiIpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgcGF0Y2hlciwgdHJ1ZSk7Ci0KLQkJaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAiZWNsaXBzZS0zLjMuZXhlIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCksIGRlc3RpbmF0aW9uLnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKQlBhdGNoU3RlcCBleHRlbmRzIEpCUGF0Y2hTdGVwIHsKLQkJcHVibGljIE1vY2thYmxlSkJQYXRjaFN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlci5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvSkJQYXRjaFppcFN0ZXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KQlBhdGNoWmlwU3RlcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlZmIzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KQlBhdGNoWmlwU3RlcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoWmlwU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgdGhlIDxjb2RlPkpCUGF0Y2haaXBTdGVwPC9jb2RlPiBwcm9jZXNzaW5nIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQlBhdGNoWmlwU3RlcFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JLy8JLyoqCi0JLy8JICogVGhpcyBpcyBhIGRpc2FibGVkICJ1bml0IHRlc3QiIHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRhdGEgbmVlZGVkIGZvciByZWFsIHRlc3QuCi0JLy8JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCS8vCSAqLwotCS8vCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlc3REYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLwotCS8vCQlGaWxlIHNhcjMyID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuc2FyIik7Ci0JLy8JCUZpbGUgc2FyMzMgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIiKTsKLQkvLwotCS8vCQlGaWxlIGRpZmYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJvcmcuZWNsaXBzZS5qZHRfMy4yLjAtMy4zLjAiLCAiLmpiZGlmZiIpOwotCS8vCQlKQkRpZmYuYnNkaWZmKHNhcjMyLCBzYXIzMywgZGlmZik7Ci0JLy8JfQotCi0JLyoqCi0JICogVGVzdCBwYXRjaGluZyB0aGUgPGI+bm9ybWFsaXplZDwvYj4gamFycy4gVGhpcyBpcyBpbmRpY2F0ZWQgYnkgdGhlIGV4dGVuc2lvbiAiLm5qYXIiLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hPcmdFY2xpcHNlSmR0MzJ0bzMzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9Nb2NrID0gQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5nZXRNb2NrKCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyIik7Ci0JCVByb2Nlc3NpbmdTdGVwIHBhdGNoZXIgPSBuZXcgTW9ja2FibGVKQlBhdGNoWmlwU3RlcChyZXBvTW9jayk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigiaWQiLCAibnMsY2wsaWQxLDEuMCIsIHRydWUpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJjbCIsICJpZDEiLCBuZXcgVmVyc2lvbigiMS4xIikpOwotCQlBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkJcGF0Y2hlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJcGF0Y2hlci5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAtMy4zLjAuamJkaWZmIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBwYXRjaGVyLCB0cnVlKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphciIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IHJlc3VsdGluZyBuamFyLiIsIEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gaW5qZWN0IGEgcmVwb3NpdG9yeSEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrYWJsZUpCUGF0Y2haaXBTdGVwIGV4dGVuZHMgSkJQYXRjaFppcFN0ZXAgewotCQlwdWJsaWMgTW9ja2FibGVKQlBhdGNoWmlwU3RlcChJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN1cGVyLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KYXJEZWx0YVByb2Nlc3NvclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0phckRlbHRhUHJvY2Vzc29yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWRkMjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0phckRlbHRhUHJvY2Vzc29yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmphcmRlbHRhLkphckRlbHRhUHJvY2Vzc29yU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSmFyRGVsdGFQcm9jZXNzb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEphckRlbHRhUHJvY2Vzc29yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmFyRGVsdGFQcm9jZXNzb3JUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9Nb2NrID0gQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5nZXRNb2NrKCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEuamFyIik7Ci0JCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSBuZXcgTW9ja2FibGVKYXJEZWx0YVByb2Nlc3NvclN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Igc3RlcERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJpZCIsICJucyxjbCxpZDEsMS4wLjAuMSIsIHRydWUpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJjbCIsICJpZDEiLCBuZXcgVmVyc2lvbigiMS4wLjAuMiIpKTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCXN0ZXAuaW5pdGlhbGl6ZShzdGVwRGVzY3JpcHRvciwgZGVzY3JpcHRvcik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc3RlcC5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4xLTIuamFyIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4yLmphciIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJWmlwSW5wdXRTdHJlYW0gZXhwZWN0ZWRKYXIgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCkpKTsKLQkJWmlwSW5wdXRTdHJlYW0gdGVzdEphciA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRKYXIsIHRlc3RKYXIpOwotCQlleHBlY3RlZEphci5jbG9zZSgpOwotCQl0ZXN0SmFyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBpbmplY3QgYSByZXBvc2l0b3J5IQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2thYmxlSmFyRGVsdGFQcm9jZXNzb3JTdGVwIGV4dGVuZHMgSmFyRGVsdGFQcm9jZXNzb3JTdGVwIHsKLQkJcHVibGljIE1vY2thYmxlSmFyRGVsdGFQcm9jZXNzb3JTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9QYWNrMjAwUHJvY2Vzc29yVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvUGFjazIwMFByb2Nlc3NvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxZjZiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9QYWNrMjAwUHJvY2Vzc29yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMC5QYWNrMjAwUHJvY2Vzc29yU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBQYWNrMjAwUHJvY2Vzc29yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBQYWNrMjAwUHJvY2Vzc29yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUGFjazIwMFByb2Nlc3NvclRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2V0dXAgdGhlIHByb2Nlc3NvcgotCQlQcm9jZXNzaW5nU3RlcCBzdGVwID0gbmV3IFBhY2syMDBQcm9jZXNzb3JTdGVwKCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc3RlcC5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkvLyBkcml2ZSB0aGUgc291cmNlIGRhdGEgdGhyb3VnaCB0aGUgc3RlcAotCQlCdW5kbGUgYnVuZGxlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gYnVuZGxlLmdldEVudHJ5KCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6Iikub3BlblN0cmVhbSgpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgc3RlcCwgdHJ1ZSk7Ci0KLQkJLy8gR2V0IHRoZSB0ZXN0IGRhdGEKLQkJaW5wdXRTdHJlYW0gPSBidW5kbGUuZ2V0RW50cnkoInRlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyIikub3BlblN0cmVhbSgpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJLy8gQ29tcGFyZQotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDIwNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBhcnRpZmFjdCByZXBvc2l0b3J5IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFydGlmYWN0T3V0cHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0JCS8vIERJU0FCTElORyBURVNUIFVOVElMIFdFIFVQREFURSBSRVBPU0lUT1JZIEZJTEVTCi0JCS8vc3VpdGUuYWRkVGVzdFN1aXRlKEphclVSTFJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZvbGRlcnNSZXBvc2l0b3J5VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTMzYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIElCTSAtIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuQXJ0aWZhY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFydGlmYWN0T3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHNhciA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9jZXNzaW5nU3RlcCBkZXN0aW5hdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXkgYWsgPSBudWxsOwotCXByaXZhdGUgSUFydGlmYWN0RGVzY3JpcHRvciBhZCA9IG51bGw7Ci0JcHJpdmF0ZSBBcnRpZmFjdE91dHB1dFN0cmVhbSBhb3MgPSBudWxsOwotCXByaXZhdGUgRmlsZSB0ZW1wID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgdGVtcFdyaXRhYmxlTG9jYXRpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0ZW1wV3JpdGFibGVMb2NhdGlvbiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFydGlmYWN0IiwgIi5yZXBvIik7Ci0JCXRlbXBXcml0YWJsZUxvY2F0aW9uLmRlbGV0ZSgpOwotCQl0ZW1wV3JpdGFibGVMb2NhdGlvbi5ta2RpcnMoKTsKLQkJc2FyID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSgibmFtZSIsIHRlbXBXcml0YWJsZUxvY2F0aW9uLnRvVVJMKCkpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBEZXN0aW5hdGlvbigpOwotCQlhayA9IG5ldyBBcnRpZmFjdEtleSgiY2xhc3NpZmllciIsICJpZCIsIG5ldyBWZXJzaW9uKCIxLjAiKSk7Ci0JCWFkID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihhayk7Ci0JCXRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJBcnRpZmFjdE91dHB1dFN0cmVhbVRlc3QiLCAiLnRtcCIpOwotCQl0ZW1wLmRlbGV0ZU9uRXhpdCgpOwotCQlhb3MgPSBzYXIubmV3IEFydGlmYWN0T3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uLCBhZCwgdGVtcCk7Ci0JCWFzc2VydE5vdE51bGwoYW9zKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbnVsbDsKLQkJRGVzdGluYXRpb24uYmFvcyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGVtcC5kZWxldGUoKTsKLQkJdGVtcFdyaXRhYmxlTG9jYXRpb24uZGVsZXRlKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXRlZnVsbG5lc3MoKSB7Ci0JCWFzc2VydFRydWUoYW9zIGluc3RhbmNlb2YgSVN0YXRlZnVsKTsKLQkJYXNzZXJ0VHJ1ZShhb3MgaW5zdGFuY2VvZiBBcnRpZmFjdE91dHB1dFN0cmVhbSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUNsb3NlU3RyZWFtT2tEZXN0aW5hdGlvbk9rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYW9zLndyaXRlKDIyKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsIGFkLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVDbG9zZVN0cmVhbU9rRGVzdGluYXRpb25PaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFvcy53cml0ZSgyMik7Ci0JCWFvcy5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKHRlbXAuZXhpc3RzKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEiLCBhZC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUpKTsKLQkJLy8gdGVzdHMgYnVnIDIxMjQ3NgotCQlhb3MuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Ob3RPa0Rlc3RpbmF0aW9uT2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRlbXAuZXhpc3RzKCkpOwotCQlhb3Muc2V0U3RhdHVzKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydEZhbHNlKHRlbXAuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDbG9zZVN0cmVhbU9rRGVzdGluYXRpb25Ob3RPaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldFN0YXR1cyhTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCWFvcy5jbG9zZSgpOwotCQlhc3NlcnRGYWxzZSh0ZW1wLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Pa0Rlc3RpbmF0aW9uQ2xvc2VGYWlscygpIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbmV3IElPRXhjZXB0aW9uKCJFeHBlY3RlZCIpOwotCQl0cnkgewotCQkJYW9zLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJYXNzZXJ0RmFsc2UodGVtcC5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Ob3RPa0Rlc3RpbmF0aW9uQ2xvc2VGYWlscygpIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbmV3IElPRXhjZXB0aW9uKCJFeHBlY3RlZCIpOwotCQlhb3Muc2V0U3RhdHVzKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJdHJ5IHsKLQkJCWFvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJYXNzZXJ0RmFsc2UodGVtcC5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb0Rlc3RpbmF0aW9uU3RyZWFtT2tEZXN0aW5hdGlvbk9rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGVzdGluYXRpb24uYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYW9zLndyaXRlKDIyKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsIGFkLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkpOwotCQlhb3MuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIERlc3RpbmF0aW9uLmJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMjIsIERlc3RpbmF0aW9uLmJhb3MudG9CeXRlQXJyYXkoKVswXSk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgUHJvY2Vzc2luZ1N0ZXAgewotCi0JCXN0YXRpYyBJT0V4Y2VwdGlvbiBpb2UgPSBudWxsOwotCQlzdGF0aWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBudWxsOwotCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCQlpZiAoaW9lICE9IG51bGwpIHsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWlmIChiYW9zICE9IG51bGwpCi0JCQkJYmFvcy53cml0ZShiKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0ZvbGRlcnNSZXBvc2l0b3J5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvRm9sZGVyc1JlcG9zaXRvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZGM3MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvRm9sZGVyc1JlcG9zaXRvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEZvbGRlcnNSZXBvc2l0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBtYW5hZ2VyUmVmOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlcjsKLQotCXB1YmxpYyBGb2xkZXJzUmVwb3NpdG9yeVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIEZvbGRlcnNSZXBvc2l0b3J5VGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXJSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWFuYWdlciA9IG51bGw7Ci0JCVRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShtYW5hZ2VyUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9sZGVyUmVwb3NpdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJRmlsZSB0ZXN0UmVwbyA9IG5ldyBGaWxlKHRlbXBEaXIsICJ0ZXN0UmVwbyIpOwotCQlBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuZGVsZXRlKHRlc3RSZXBvKTsKLQkJdGVzdFJlcG8ubWtkaXIoKTsKLQotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkodGVzdFJlcG8udG9VUkwoKSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeSh0ZXN0UmVwby50b1VSTCgpLCAidGVzdFJlcG8iLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCUZpbGUgcGx1Z2luc0ZvbGRlciA9IG5ldyBGaWxlKHRlc3RSZXBvLCAicGx1Z2lucyIpOwotCQlwbHVnaW5zRm9sZGVyLm1rZGlyKCk7Ci0KLQkJVVJMIHNvdXJjZUJhc2UgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxIik7Ci0JCUZpbGUgc291cmNlRm9sZGVyID0gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKHNvdXJjZUJhc2UpLmdldFBhdGgoKSk7Ci0KLQkJQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmNvcHkoIjAuOTkiLCBzb3VyY2VGb2xkZXIsIHBsdWdpbnNGb2xkZXIpOwotCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiAhcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFscygiQ1ZTIik7Ci0JCQl9Ci0JCX07Ci0JCUZpbGVbXSBmaWxlTGlzdCA9IHBsdWdpbnNGb2xkZXIubGlzdEZpbGVzKGZpbHRlcik7Ci0JCWFzc2VydEVxdWFscygyLCBmaWxlTGlzdC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlTGlzdFtpXTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpCi0JCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCVN0cmluZyBpZGVudGlmaWVyID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmluZGV4T2YoJ18nKSk7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKCdfJykgKyAxKTsKLQotCQkJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJvc2dpLmJ1bmRsZSIsIGlkZW50aWZpZXIsIG5ldyBWZXJzaW9uKHZlcnNpb24pKTsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQlkZXNjcmlwdG9yLnNldFByb3BlcnR5KCJhcnRpZmFjdC5mb2xkZXIiLCAidHJ1ZSIpOwotCi0JCQlyZXBvLmFkZERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCX0KLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHJlcG8uZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBrZXlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJcmVwby5yZW1vdmVEZXNjcmlwdG9yKGtleXNbaV0pOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCByZXBvLmdldEFydGlmYWN0S2V5cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygwLCBwbHVnaW5zRm9sZGVyLmxpc3RGaWxlcyhmaWx0ZXIpLmxlbmd0aCk7Ci0KLQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCUFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdC5kZWxldGUodGVzdFJlcG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0phclVSTFJlcG9zaXRvcnlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9KYXJVUkxSZXBvc2l0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg5ZDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0phclVSTFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXJVUkxSZXBvc2l0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBtYW5hZ2VyUmVmOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlcjsKLQotCXB1YmxpYyBKYXJVUkxSZXBvc2l0b3J5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmFyVVJMUmVwb3NpdG9yeVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQltYW5hZ2VyUmVmID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQltYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKG1hbmFnZXJSZWYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXIgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphclVSTFJlcG9zaXRvcnkoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJVVJMIGVuZ2luZUphciA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZW5naW5lcmVwby5qYXIiKTsKLQkJVVJMIGphclJlcG9VUkwgPSBudWxsOwotCQl0cnkgewotCQkJamFyUmVwb1VSTCA9IG5ldyBVUkwoImphcjoiICsgZW5naW5lSmFyLnRvU3RyaW5nKCkgKyAiIS90ZXN0RGF0YS9lbmdpbmVyZXBvL2FydGlmYWN0cy54bWwiKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkoamFyUmVwb1VSTCwgbnVsbCk7Ci0JCWFzc2VydFRydWUocmVwby5jb250YWlucyhuZXcgQXJ0aWZhY3RLZXkoIm9zZ2kuYnVuZGxlIiwgInRlc3RkYXRhIiwgbmV3IFZlcnNpb24oIjEuMC4wLjEiKSkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWYyYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGUuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0dWFsTG9jYXRpb24xKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkiKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBVUkwoYmFzZSArICIvYXJ0aWZhY3RzLnhtbCIpLCBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0dWFsTG9jYXRpb24yKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkvIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgVVJMKGJhc2UgKyAiYXJ0aWZhY3RzLnhtbCIpLCBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0dWFsTG9jYXRpb24zKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkvYXJ0aWZhY3RzLnhtbCIpOwotCQlhc3NlcnRFcXVhbHMoYmFzZSwgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGJhc2UsIGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uQ29tcHJlc3NlZDEoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIGJhc2UgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0L2FydGlmYWN0UmVwb3NpdG9yeSIpOwotCQlhc3NlcnRFcXVhbHMobmV3IFVSTChiYXNlICsgIi9hcnRpZmFjdHMuamFyIiksIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihiYXNlLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uQ29tcHJlc3NlZDIoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIGJhc2UgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0L2FydGlmYWN0UmVwb3NpdG9yeS8iKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBVUkwoYmFzZSArICJhcnRpZmFjdHMuamFyIiksIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihiYXNlLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uQ29tcHJlc3NlZDMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIGJhc2UgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0L2FydGlmYWN0UmVwb3NpdG9yeS9hcnRpZmFjdHMuamFyIik7Ci0JCWFzc2VydEVxdWFscyhiYXNlLCBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgdHJ1ZSkpOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpIHsKLQkJcmV0dXJuIChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc2VkUmVwb3NpdG9yeSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlGaWxlIHJlcG9Mb2NhdGlvbiA9IG5ldyBGaWxlKHRlbXBEaXIsICJTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0Iik7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgImFydGlmYWN0IG5hbWUiLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCXJlcG8uc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCAidHJ1ZSIpOwotCQlFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlciA9IG5ldyBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRBcnRpZmFjdFJlcG9zaXRvcnkocmVwbyk7Ci0JCXByb3ZpZGVyLmluaXRpYWxpemUocmVwb0xvY2F0aW9uKTsKLQkJcHJvdmlkZXIuc2V0Um9vdFZlcnNpb24oIjMuMyIpOwotCQlwcm92aWRlci5zZXRSb290SWQoInNkayIpOwotCQlwcm92aWRlci5zZXRGbGF2b3IoInRvb2xpbmciKTsKLQkJbmV3IEdlbmVyYXRvcihwcm92aWRlcikuZ2VuZXJhdGUoKTsKLQkJRmlsZSBmaWxlc1tdID0gcmVwb0xvY2F0aW9uLmxpc3RGaWxlcygpOwotCQlib29sZWFuIGphckZpbGVQcmVzZW50ID0gZmFsc2U7Ci0JCWJvb2xlYW4gYXJ0aWZhY3RGaWxlUHJlc2VudCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoImFydGlmYWN0cy5qYXIiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWphckZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgiYXJ0aWZhY3RzLnhtbCIuZXF1YWxzSWdub3JlQ2FzZShmaWxlc1tpXS5nZXROYW1lKCkpKSB7Ci0JCQkJYXJ0aWZhY3RGaWxlUHJlc2VudCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICghamFyRmlsZVByZXNlbnQpCi0JCQlmYWlsKCJSZXBvc2l0b3J5IHNob3VsZCBjcmVhdGUgSkFSIGZvciBhcnRpZmFjdC54bWwiKTsKLQkJaWYgKGFydGlmYWN0RmlsZVByZXNlbnQpCi0JCQlmYWlsKCJSZXBvc2l0b3J5IHNob3VsZCBub3QgY3JlYXRlIGFydGlmYWN0LnhtbCIpOwotCQlkZWxldGUocmVwb0xvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jb21wcmVzc2VkUmVwb3NpdG9yeSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlGaWxlIHJlcG9Mb2NhdGlvbiA9IG5ldyBGaWxlKHRlbXBEaXIsICJTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0Iik7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgImFydGlmYWN0IG5hbWUiLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCXJlcG8uc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCAiZmFsc2UiKTsKLQkJRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG8pOwotCQlwcm92aWRlci5pbml0aWFsaXplKHJlcG9Mb2NhdGlvbik7Ci0JCXByb3ZpZGVyLnNldFJvb3RWZXJzaW9uKCIzLjMiKTsKLQkJcHJvdmlkZXIuc2V0Um9vdElkKCJzZGsiKTsKLQkJcHJvdmlkZXIuc2V0Rmxhdm9yKCJ0b29saW5nIik7Ci0JCW5ldyBHZW5lcmF0b3IocHJvdmlkZXIpLmdlbmVyYXRlKCk7Ci0JCUZpbGUgZmlsZXNbXSA9IHJlcG9Mb2NhdGlvbi5saXN0RmlsZXMoKTsKLQkJYm9vbGVhbiBqYXJGaWxlUHJlc2VudCA9IGZhbHNlOwotCQlib29sZWFuIGFydGlmYWN0RmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJhcnRpZmFjdHMuamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVzW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlqYXJGaWxlUHJlc2VudCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoImFydGlmYWN0cy54bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWFydGlmYWN0RmlsZVByZXNlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChqYXJGaWxlUHJlc2VudCkKLQkJCWZhaWwoIlJlcG9zaXRvcnkgc2hvdWxkIG5vdCBjcmVhdGUgSkFSIGZvciBhcnRpZmFjdC54bWwiKTsKLQkJaWYgKCFhcnRpZmFjdEZpbGVQcmVzZW50KQotCQkJZmFpbCgiUmVwb3NpdG9yeSBzaG91bGQgY3JlYXRlIGFydGlmYWN0LnhtbCIpOwotCQlkZWxldGUocmVwb0xvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVsZXRlKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJZGVsZXRlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsZS5kZWxldGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FkZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FkZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjc4NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9BZGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICBJQk0gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIEFkZGVyIGV4dGVuZHMgUHJvY2Vzc2luZ1N0ZXAgewotCi0JcHJvdGVjdGVkIGludCBvcGVyYW5kOwotCi0JcHVibGljIEFkZGVyKCkgewotCQkvLyBuZWVkZWQKLQl9Ci0KLQlwdWJsaWMgQWRkZXIoaW50IG9wZXJhbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYW5kID0gb3BlcmFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQkJdHJ5IHsKLQkJCW9wZXJhbmQgPSBJbnRlZ2VyLnZhbHVlT2YoZGVzY3JpcHRvci5nZXREYXRhKCkpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkFkZGVyIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBpbnZhbGlkIiwgZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlc3RpbmF0aW9uKCkud3JpdGUoYiArIG9wZXJhbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjk0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkaXJlY3RvciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9jZXNzaW5nU3RlcEhhbmRsZXJUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2Nlc3NpbmdTdGVwVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQnl0ZVNoaWZ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQnl0ZVNoaWZ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ZTA0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0J5dGVTaGlmdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogIElCTSAtIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgQnl0ZVNoaWZ0ZXIgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgaW50IG9wZXJhbmQ7Ci0KLQlwdWJsaWMgQnl0ZVNoaWZ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVTaGlmdGVyKGludCBzaGlmdExlZnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYW5kID0gc2hpZnRMZWZ0OwotCQliYXNpY0luaXRpYWxpemUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljSW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBpZiB0aGUgc3RhdHVzIGlzIGFscmVhZHkgc2V0IHRvIHNvbWV0aGluZyB0aGF0IG5vdCBvaywgd2UndmUgYWxyZWFkeSBmb3VuZCBhIHByb2JsZW0uCi0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCWludCBjb2RlOwotCQkvLyBpZiB0aGVyZSBpcyBhIGRlc2NyaXB0b3IsIGRlY2lkZSBpZiB0aGUgImJhZCBjYXNlIiBpcyBhbiBlcnJvciBvciBpbmZvLiAgSWYgbm8gCi0JCS8vIGRlc2NyaXB0b3IgdGhlbiBkZWZhdWx0IHRvIGVycm9yLgotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJZWxzZQotCQkJY29kZSA9IElTdGF0dXMuRVJST1I7Ci0KLQkJLy8gZmluYWxseSwgY2hlY2sgdGhlIGFjdHVhbCBzZXR1cCBhbmQgc2V0IHRoZSBzdGF0dXMuCi0JCWlmIChvcGVyYW5kIDw9IDApCi0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBBY3RpdmF0b3IuSUQsICJCeXRlU2hpZnRlciBvcGVyYW5kIGludmFsaWQ6ICIgKyBvcGVyYW5kKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCXRyeSB7Ci0JCQlvcGVyYW5kID0gSW50ZWdlci52YWx1ZU9mKGRlc2NyaXB0b3IuZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaW50IGNvZGUgPSBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBBY3RpdmF0b3IuSUQsICJCeXRlU2hpZnRlciBvcGVyYW5kIHNwZWNpZmljYXRpb24gaW52YWxpZCIsIGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQliYXNpY0luaXRpYWxpemUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlc3RpbmF0aW9uKCkud3JpdGUoYiA9PSAtMSA/IGIgOiBiIDw8IG9wZXJhbmQpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Db3VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0NvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4YjA1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0NvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgQ291bnRlciBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQotCXByb3RlY3RlZCBsb25nIHNpemUgPSAtMTsKLQlsb25nIHRvdGFsID0gMDsKLQotCXB1YmxpYyBDb3VudGVyKCkgewotCQkvLyBuZWVkZWQKLQl9Ci0KLQlwdWJsaWMgQ291bnRlcihsb25nIHNpemUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQkJYmFzaWNJbml0aWFsaXplKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0luaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJLy8gaWYgdGhlIHN0YXR1cyBpcyBhbHJlYWR5IHNldCB0byBzb21ldGhpbmcgdGhhdCBub3Qgb2ssIHdlJ3ZlIGFscmVhZHkgZm91bmQgYSBwcm9ibGVtLgotCQlpZiAoIWdldFN0YXR1cygpLmlzT0soKSkKLQkJCXJldHVybjsKLQotCQlpbnQgY29kZTsKLQkJLy8gaWYgdGhlcmUgaXMgYSBkZXNjcmlwdG9yLCBkZWNpZGUgaWYgdGhlICJiYWQgY2FzZSIgaXMgYW4gZXJyb3Igb3IgaW5mby4gIElmIG5vIAotCQkvLyBkZXNjcmlwdG9yIHRoZW4gZGVmYXVsdCB0byBlcnJvci4KLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCWNvZGUgPSBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCWVsc2UKLQkJCWNvZGUgPSBJU3RhdHVzLkVSUk9SOwotCi0JCS8vIGZpbmFsbHksIGNoZWNrIHRoZSBhY3R1YWwgc2V0dXAgYW5kIHNldCB0aGUgc3RhdHVzLgotCQlpZiAoc2l6ZSAhPSAtMSkKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkNvdW50ZXIgc2l6ZSBub3Qgc2V0IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQlTdHJpbmcgZGF0YSA9IGRlc2NyaXB0b3IuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJaWYgKGRhdGEuZXF1YWxzKCJkb3dubG9hZCIpKQotCQkJCXNpemUgPSBMb25nLnBhcnNlTG9uZyhjb250ZXh0LmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkpOwotCQkJZWxzZSBpZiAoZGF0YS5lcXVhbHMoImFydGlmYWN0IikpCi0JCQkJc2l6ZSA9IExvbmcucGFyc2VMb25nKGNvbnRleHQuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9TSVpFKSk7Ci0JCQllbHNlCi0JCQkJc2l6ZSA9IExvbmcucGFyc2VMb25nKGRhdGEpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaW50IGNvZGUgPSBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBBY3RpdmF0b3IuSUQsICJDb3VudGVyIHNpemUgc3BlY2lmaWNhdGlvbiBpbnZhbGlkIiwgZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJhc2ljSW5pdGlhbGl6ZShkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdG90YWwrKzsKLQkJZ2V0RGVzdGluYXRpb24oKS53cml0ZShiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JCWlmICh0b3RhbCAhPSBzaXplKQotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCAicGx1Z2luIGlkIiwgIlNpemUgbWlzbWF0Y2guICBXYXMgIiArIHRvdGFsICsgIiBzaG91bGQgaGF2ZSBiZWVuICIgKyBzaXplKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9NdWx0aXBsaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL011bHRpcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhZTFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL011bHRpcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiAgSUJNIC0gY29udGludWluZyBkZXZlbG9wbWVudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsaWVyIGV4dGVuZHMgUHJvY2Vzc2luZ1N0ZXAgewotCi0JcHJvdGVjdGVkIGludCBvcGVyYW5kOwotCi0JcHVibGljIE11bHRpcGxpZXIoKSB7Ci0JCS8vIG5lZWRlZAotCX0KLQotCXB1YmxpYyBNdWx0aXBsaWVyKGludCBvcGVyYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3BlcmFuZCA9IG9wZXJhbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCXRyeSB7Ci0JCQlvcGVyYW5kID0gSW50ZWdlci52YWx1ZU9mKGRlc2NyaXB0b3IuZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaW50IGNvZGUgPSBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhjb2RlLCBBY3RpdmF0b3IuSUQsICJNdWx0aXBsaWVyIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBpbnZhbGlkIiwgZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlc3RpbmF0aW9uKCkud3JpdGUoYiA9PSAtMSA/IGIgOiBiICogb3BlcmFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjI1NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICBJQk0gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMC5QYWNrMjAwUHJvY2Vzc29yU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMudmVyaWZpZXIuTUQ1VmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OwotCi0JUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKCk7Ci0JSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTm9QU3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbMF07Ci0JCU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmNyZWF0ZUFuZExpbmsoZGVzY3JpcHRvcnMsIG51bGwsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUoIlRlc3QiLmdldEJ5dGVzKCkpOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIHJlc3VsdC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU9uZUJ5dGVTaGlmdGVyUFMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwW10ge25ldyBCeXRlU2hpZnRlcigxKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsyfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVR3b0J5dGVTaGlmdGVyUFNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtuZXcgQnl0ZVNoaWZ0ZXIoMSksIG5ldyBCeXRlU2hpZnRlcigyKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHs4fSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU9uZU1ENVZlcmlmaWVyUFNPaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IE1ENVZlcmlmaWVyKCIwY2JjNjYxMWY1NTQwYmQwODA5YTM4OGRjOTVhNjE1YiIpfTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIubGluayhzdGVwcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJdGVzdFN0cmVhbS53cml0ZSgiVGVzdCIuZ2V0Qnl0ZXMoKSk7Ci0JCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgcmVzdWx0LnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlT25lTUQ1VmVyaWZpZXJQU0ZhaWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtuZXcgTUQ1VmVyaWZpZXIoIjljYmM2NjExZjU1NDBiZDA4MDlhMzg4ZGM5NWE2MTViIil9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKCJUZXN0Ii5nZXRCeXRlcygpKTsKLQkJdHJ5IHsKLQkJCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJCWFzc2VydEVxdWFscygiVGVzdCIsIHJlc3VsdC50b1N0cmluZygpKTsKLQkJCWFzc2VydFRydWUoKFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyh0ZXN0U3RyZWFtKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlT25lQnl0ZVNoaWZ0ZXJBbmRPbmVNRDVWZXJpZmllclBTT2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBPcmRlciBvZiBQU3MgaXMgaW1wb3J0YW50ISEKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtuZXcgQnl0ZVNoaWZ0ZXIoMSksIG5ldyBNRDVWZXJpZmllcigiY2VlZWU1MDdlOGRiODMyOTQ2MDAyMThiNGUxOTg4OTciKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsyLCA0LCA2LCA4LCAxMH0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVPbmVCeXRlU2hpZnRlckFuZE9uZU1ENVZlcmlmaWVyUFNGYWlsV3JvbmdPcmRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIE9yZGVyIG9mIFBTcyBpcyBpbXBvcnRhbnQgLSBoZXJlIGl0IHdyb25nISEKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtuZXcgTUQ1VmVyaWZpZXIoImFmNDc2YmJhZjE1MmE0YzM5Y2E0ZTVjNDk4YTg4YWEwIiksIG5ldyBCeXRlU2hpZnRlcigxKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOwotCQl0cnkgewotCQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10gezIsIDQsIDYsIDgsIDEwfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQkJCWFzc2VydFRydWUoKFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyh0ZXN0U3RyZWFtKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3N1cmVPcmRlcmluZ09mUFNzMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IEFkZGVyKDEpLCBuZXcgTXVsdGlwbGllcigyKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHs0LCA2LCA4LCAxMCwgMTJ9LCByZXN1bHQudG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3N1cmVPcmRlcmluZ09mUFNzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IE11bHRpcGxpZXIoMiksIG5ldyBBZGRlcigxKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHszLCA1LCA3LCA5LCAxMX0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVPbmVQYWNrMjAwVW5wYWNrZXJQUygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHtuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuUGFjazIwMFVucGFja2VyIiwgbnVsbCwgdHJ1ZSl9OwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gaGFuZGxlci5jcmVhdGUoZGVzY3JpcHRvcnMsIG51bGwpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwMDApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIubGluayhzdGVwcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXModGVzdFN0cmVhbSk7Ci0JCWFzc2VydFRydWUoIlN0ZXAgaXMgbm90IHJlYWR5LiIsIHN0YXR1cy5pc09LKCkpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0RGF0YS9qYXJwcm9jZXNzb3IuamFyLnBhY2suZ3oiKS5vcGVuU3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCB0ZXN0U3RyZWFtLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDM1MDYyLCByZXN1bHQuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQnl0ZVNoaWZ0ZXJQUygpIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge25ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5CeXRlU2hpZnRlciIsICIxIiwgdHJ1ZSl9OwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gaGFuZGxlci5jcmVhdGUoZGVzY3JpcHRvcnMsIG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHN0ZXBzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHN0ZXBzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhCeXRlU2hpZnRlci5jbGFzcywgc3RlcHNbMF0uZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1ENVZlcmlmaWVyUFMoKSB7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHtuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuTUQ1VmVyaWZpZXIiLCAiMSIsIHRydWUpfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChzdGVwcyk7Ci0JCWFzc2VydEVxdWFscygxLCBzdGVwcy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoTUQ1VmVyaWZpZXIuY2xhc3MsIHN0ZXBzWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBZGRlclBTKCkgewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkFkZGVyIiwgIjEiLCB0cnVlKX07Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBoYW5kbGVyLmNyZWF0ZShkZXNjcmlwdG9ycywgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoc3RlcHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgc3RlcHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKEFkZGVyLmNsYXNzLCBzdGVwc1swXS5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTXVsdGlwbGllclBTKCkgewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLk11bHRpcGxpZXIiLCAiMiIsIHRydWUpfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChzdGVwcyk7Ci0JCWFzc2VydEVxdWFscygxLCBzdGVwcy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGlwbGllci5jbGFzcywgc3RlcHNbMF0uZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVBhY2syMDBVbnBhY2tlclBTKCkgewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChzdGVwcyk7Ci0JCWFzc2VydEVxdWFscygxLCBzdGVwcy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoUGFjazIwMFByb2Nlc3NvclN0ZXAuY2xhc3MsIHN0ZXBzWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQU3NBbmRBc3N1cmVPcmRlcmluZ09mUFNzMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBhZGRlciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5BZGRlciIsICIxIiwgdHJ1ZSk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBtdWx0aXBsaWVyID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLk11bHRpcGxpZXIiLCAiMiIsIHRydWUpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7YWRkZXIsIG11bHRpcGxpZXJ9OwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gaGFuZGxlci5jcmVhdGUoZGVzY3JpcHRvcnMsIG51bGwpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7NCwgNiwgOCwgMTAsIDEyfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUFNzQW5kQXNzdXJlT3JkZXJpbmdPZlBTczIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgYWRkZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuQWRkZXIiLCAiMSIsIHRydWUpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgbXVsdGlwbGllciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NdWx0aXBsaWVyIiwgIjIiLCB0cnVlKTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge211bHRpcGxpZXIsIGFkZGVyfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIubGluayhzdGVwcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJdGVzdFN0cmVhbS53cml0ZShuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fSk7Ci0JCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10gezMsIDUsIDcsIDksIDExfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlua1BTcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBhZGRlciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5BZGRlciIsICIxIiwgdHJ1ZSk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBtdWx0aXBsaWVyID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLk11bHRpcGxpZXIiLCAiMiIsIHRydWUpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7YWRkZXIsIG11bHRpcGxpZXJ9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5jcmVhdGVBbmRMaW5rKGRlc2NyaXB0b3JzLCBudWxsLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7NCwgNiwgOCwgMTAsIDEyfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdlMDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdTdGVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgUHJvY2Vzc2luZ1N0ZXAgcHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZsdXNoZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwKCkge307Ci0JCWZsdXNoZWQgPSBmYWxzZTsKLQkJY2xvc2VkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGF0dXMoKSB7Ci0JCWFzc2VydE5vdE51bGwocHMuZ2V0U3RhdHVzKCkpOwotCQlhc3NlcnRUcnVlKHBzLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCWFzc2VydFRydWUocHMuZ2V0U3RhdHVzKGZhbHNlKS5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHBzLmdldFN0YXR1cyh0cnVlKS5pc09LKCkpOwotCQlhc3NlcnRUcnVlKFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyhwcykuaXNPSygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVlcFN0YXR1cygpIHsKLQkJUHJvY2Vzc2luZ1N0ZXAgcHMyID0gbmV3IFByb2Nlc3NpbmdTdGVwKCkge307Ci0JCXBzLmxpbmsocHMyLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNPSygpKTsKLQotCQlwczIuc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgInBsdWdpbiBpZCIsICJtZXNzYWdlIikpOwotCQlhc3NlcnRGYWxzZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNNdWx0aVN0YXR1cygpKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBzLmdldFN0YXR1cyh0cnVlKS5nZXRTZXZlcml0eSgpKTsKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSAoTXVsdGlTdGF0dXMpIHBzLmdldFN0YXR1cyh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoKTsKLQotCQlQcm9jZXNzaW5nU3RlcCBwczMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXAoKSB7fTsKLQkJcHMyLmxpbmsocHMzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RmFsc2UocHMuZ2V0U3RhdHVzKHRydWUpLmlzT0soKSk7Ci0JCWFzc2VydFRydWUocHMuZ2V0U3RhdHVzKHRydWUpLmlzTXVsdGlTdGF0dXMoKSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwcy5nZXRTdGF0dXModHJ1ZSkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCW11bHRpID0gKE11bHRpU3RhdHVzKSBwcy5nZXRTdGF0dXModHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygzLCBtdWx0aS5nZXRDaGlsZHJlbigpLmxlbmd0aCk7Ci0KLQkJcHMzLnNldFN0YXR1cyhTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCWFzc2VydEZhbHNlKHBzLmdldFN0YXR1cyh0cnVlKS5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHBzLmdldFN0YXR1cyh0cnVlKS5pc011bHRpU3RhdHVzKCkpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5DQU5DRUwsIHBzLmdldFN0YXR1cyh0cnVlKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgT3V0cHV0U3RyZWFtKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCQkJZmx1c2hlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCXBzLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlwcy5mbHVzaCgpOwotCQlhc3NlcnRUcnVlKGZsdXNoZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9zZVNpbXBsZU91dHB1dFN0cmVhbUFzRGVzdGluYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgT3V0cHV0U3RyZWFtKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJcHMubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXBzLmNsb3NlKCk7Ci0JCWFzc2VydEZhbHNlKGNsb3NlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb3NlUHJvY2Vzc2luZ1N0ZXBBc0Rlc3RpbmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IFByb2Nlc3NpbmdTdGVwKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJcHMubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXBzLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoY2xvc2VkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjZkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXV0b21hdGVkRGlyZWN0b3JUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZzIwMzYzNy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcGVyYXRpb25HZW5lcmF0aW9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZVRlc3QyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBpY2tlclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVjb21tZW5kYXRpb25UZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlcGxhY2VQbGFuVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZXNvbHV0aW9uSGVscGVyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSb2xsYmFja1Rlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xldG9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShVbmluc3RhbGxUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFVwZGF0ZVRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQXV0b21hdGVkRGlyZWN0b3JUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQXV0b21hdGVkRGlyZWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmQ0ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0F1dG9tYXRlZERpcmVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLQotLyoqCi0gKiBWYXJpb3VzIGF1dG9tYXRlZCB0ZXN0cyBvZiB0aGUge0BsaW5rIElEaXJlY3Rvcn0gQVBJLgotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkRGlyZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvL3ByaXZhdGUgc3RhdGljIFZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShBdXRvbWF0ZWREaXJlY3RvclRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBBdXRvbWF0ZWREaXJlY3RvclRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgQXV0b21hdGVkRGlyZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYSBmaWx0ZXJlZCBkZXBlbmRlbmN5IG9uIGFub3RoZXIgSVUuIFdoZW4KLQkgKiB0aGUgZmlsdGVyIGlzIHNhdGlzZmllZCwgdGhlIGRlcGVuZGVuY3kgaXMgYWN0aXZlIGFuZCB0aGUgcmVxdWlyZWQgSVUgc2hvdWxkCi0JICogYmUgaW5zdGFsbGVkLiBXaGVuIHRoZSBmaWx0ZXIgaXMgbm90IHNhdGlzZmllZCwgdGhlIGRlcGVuZGVuY3kgaXMgaW5hY3RpdmUKLQkgKiBhbmQgdGhlIHNlY29uZCBJVSBzaG91bGQgbm90IGJlIGluc3RhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZpbHRlcmVkQ2FwYWJpbGl0eSgpIHsKLQkJLy9UaGUgSVUgdGhhdCBpcyByZXF1aXJlZAotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkSVUgPSBjcmVhdGVJVSgicmVxdWlyZWQuIiArIGdldE5hbWUoKSk7Ci0KLQkJLy8gVGhlIElVIHRvIGJlIGluc3RhbGxlZAotCQlTdHJpbmcgZmlsdGVyID0gY3JlYXRlRmlsdGVyKCJGaWx0ZXJLZXkiLCAidHJ1ZSIpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIHJlcXVpcmVkSVUuZ2V0SWQoKSwgQU5ZX1ZFUlNJT04sIGZpbHRlciwgZmFsc2UsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjYXBhYmlsaXR5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0KLQkJLy9JbnN0YWxsIGludG8gYSBwcm9maWxlIGluIHdoaWNoIHRoZSBmaWx0ZXIgaXMgc2F0aXNmaWVkCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJGaWx0ZXJLZXk9dHJ1ZSIpOwotCQlJUHJvZmlsZSBzYXRpc2ZpZWQgPSBjcmVhdGVQcm9maWxlKCJTYXRpc2ZpZWQuIiArIGdldE5hbWUoKSwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3Qoc2F0aXNmaWVkKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHNhdGlzZmllZCwgYWxsVW5pdHMpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYW4gb3B0aW9uYWwgcHJlcmVxdWlzaXRlIHRoYXQgaXMgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsT3B0aW9uYWxBdmFpbGFibGUoKSB7Ci0JCVN0cmluZyBjYXBhYmlsaXR5SWQgPSAidGVzdC4iICsgZ2V0TmFtZSgpOwotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCksIG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdC5jYXBhYmlsaXR5IiwgY2FwYWJpbGl0eUlkLCBERUZBVUxUX1ZFUlNJT04pfSk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBvcHRpb25hbGx5IHJlcXVpcmVzIHRoZSBjYXBhYmlsaXR5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgQU5ZX1ZFUlNJT04sIG51bGwsIC8qIG9wdGlvbmFsPT4gKi90cnVlLCAvKiBtdWx0aXBsZT0+ICovZmFsc2UsIC8qIGdyZWVkeT0+Ki9mYWxzZSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7cmVxdWlyZWR9KTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gYWxsVW5pdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVSwgcmVxdWlyZWRJVX07Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0b0luc3RhbGxBcnJheSA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIHRvSW5zdGFsbEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGFuIG9wdGlvbmFsIHByZXJlcXVpc2l0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxPcHRpb25hbFVuYXZhaWxhYmxlKCkgewotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJLy9ubyBJVSB3aWxsIGJlIGF2YWlsYWJsZSB0aGF0IGV4cG9ydHMgdGhpcyBjYXBhYmlsaXR5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgQU5ZX1ZFUlNJT04sIG51bGwsIHRydWUsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtyZXF1aXJlZH0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhbGxVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhhbGxVbml0cyk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYW5kIHRoZSBJVSBwcm92aWRpbmcKLQkgKiB0aGUgY2FwYWJpbGl0eSBoYXMgYSBwbGF0Zm9ybSBmaWx0ZXIgdGhhdCBpcyBub3Qgc2F0aXNmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsUGxhdGZvcm1GaWx0ZXIoKSB7Ci0JCS8vVGhlIElVIHRoYXQgZXhwb3J0cyB0aGUgY2FwYWJpbGl0eQotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgREVGQVVMVF9WRVJTSU9OKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWRJVSA9IGNyZWF0ZUlVKCJyZXF1aXJlZC4iICsgZ2V0TmFtZSgpLCBjcmVhdGVGaWx0ZXIoIm9zZ2kub3MiLCAiYmxvcnQiKSwgcHJvdmlkZXMpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5SWQsIEFOWV9WRVJTSU9OLCBudWxsKSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModG9JbnN0YWxsQXJyYXkpOwotCQlJU3RhdHVzIHJlc3VsdCA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgIXJlc3VsdC5pc09LKCkpOwotCi0JCS8vdHJ5IGFnYWluIHdpdGggdGhlIGZpbHRlciBzYXRpc2ZpZWQKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUywgIm9zZ2kub3M9YmxvcnQiKTsKLQkJSVByb2ZpbGUgcHJvZmlsZTIgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZTIuIiArIGdldE5hbWUoKSwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCXJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTIpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModG9JbnN0YWxsQXJyYXkpOwotCQlyZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIHJlc3VsdC5pc09LKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYW4gdW5zYXRpc2ZpZWQgcGxhdGZvcm0gZmlsdGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxQbGF0Zm9ybUZpbHRlclVuc2F0aXNmaWVkKCkgewotCQkvL1RoZSBJVSB0byBpbnN0YWxsCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZUZpbHRlcigib3NnaS5vcyIsICJibG9ydCIpLCBOT19QUk9WSURFUyk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhbGxVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvSW5zdGFsbEFycmF5ID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dG9JbnN0YWxsSVV9OwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkoYWxsVW5pdHMpOwotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJSURpcmVjdG9yIGRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsICFyZXN1bHQuaXNPSygpKTsKLQotCQkvL3RyeSBhZ2FpbiB3aXRoIHRoZSBmaWx0ZXIgc2F0aXNmaWVkCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPWJsb3J0Iik7Ci0JCUlQcm9maWxlIHByb2ZpbGUyID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUyLiIgKyBnZXROYW1lKCksIG51bGwsIHByb3BlcnRpZXMpOwotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCByZXN1bHQuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGVzdCBvZiBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYW5kIGVuc3VyaW5nCi0JICogdGhhdCB0aGUgSVUgcHJvdmlkaW5nIHRoZSBjYXBhYmlsaXR5IGlzIGluc3RhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW5zdGFsbFJlcXVpcmVkKCkgewotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWRJVSA9IGNyZWF0ZUlVKCJyZXF1aXJlZC4iICsgZ2V0TmFtZSgpLCBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgREVGQVVMVF9WRVJTSU9OKX0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5SWQsIEFOWV9WRVJTSU9OLCBudWxsKSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCi0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGVzdCBvZiBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYnV0IHdpdGhvdXQKLQkgKiBzcGVjaWZ5aW5nIGEgdmVyc2lvbiByYW5nZSAoYW55IHZlcnNpb24gd2lsbCBkbykuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxSZXF1aXJlZE5vVmVyc2lvbigpIHsKLQkJLy9UaGUgSVUgdGhhdCBpcyBuZWVkZWQKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcmVxdWlyZWRJVS5nZXRJZCgpLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IHRvSW5zdGFsbElVID0gY3JlYXRlSVUoInRvSW5zdGFsbC4iICsgZ2V0TmFtZSgpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2NhcGFiaWxpdHl9KTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gYWxsVW5pdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtyZXF1aXJlZElVLCB0b0luc3RhbGxJVX07Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0b0luc3RhbGxBcnJheSA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0KLQkJSURpcmVjdG9yIGRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcmVzdWx0LmlzT0soKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWlucygiMS4xIiwgcHJvZmlsZSwgYWxsVW5pdHMpOwotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB0ZXN0IG9mIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYSByZXF1aXJlZCBJVSwgYW5kIGVuc3VyaW5nCi0JICogdGhhdCB0aGUgcmVxdWlyZWQgSVUgaXMgaW5zdGFsbGVkLiBJbiBvdGhlciB3b3JkcywgdGhlIElVIHRvIGluc3RhbGwgaGFzIGEgcmVxdWlyZWQKLQkgKiBjYXBhYmlsaXR5IG9uIHRoZSBJVSBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUluc3RhbGxSZXF1aXJlZElVKCkgewotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcmVxdWlyZWRJVS5nZXRJZCgpLCBBTllfVkVSU0lPTiwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjYXBhYmlsaXR5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCi0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9CdWcyMDM2MzcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9CdWcyMDM2MzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZjk3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQnVnMjAzNjM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQnVnMjAzNjM3IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwdWJsaWMgdm9pZCB0ZXN0KCkgewotCQlJRGlyZWN0b3IgZCA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0WzBdKTsKLQkJYXNzZXJ0T0soZC5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9PcGVyYXRpb25HZW5lcmF0aW9uVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09wZXJhdGlvbkdlbmVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODFlZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09wZXJhdGlvbkdlbmVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuT3BlcmF0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbi5SZXNvbHV0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uR2VuZXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVW5pbnN0YWxsKCkgewotCQlJSW5zdGFsbGFibGVVbml0IGExID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEyID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEzID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigzLCAwLCAwKSwgZmFsc2UpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYTEpOwotCQlmcm9tLmFkZChhMik7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChhMSk7Ci0JCXRvLmFkZChhMyk7Ci0KLQkJZnJvbSA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyhmcm9tKTsKLQkJdG8gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXModG8pOwotCQluZXcgT3BlcmF0aW9uR2VuZXJhdG9yKCkuZ2VuZXJhdGVPcGVyYXRpb24oZnJvbSwgdG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlJSW5zdGFsbGFibGVVbml0IGExID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEyID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEzID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigzLCAwLCAwKSwgZmFsc2UpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYTEpOwotCQlmcm9tLmFkZChhMyk7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChhMSk7Ci0JCXRvLmFkZChhMyk7Ci0JCXRvLmFkZChhMik7Ci0KLQkJZnJvbSA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyhmcm9tKTsKLQkJdG8gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXModG8pOwotCQluZXcgT3BlcmF0aW9uR2VuZXJhdG9yKCkuZ2VuZXJhdGVPcGVyYXRpb24oZnJvbSwgdG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QyKCkgewotCQlJSW5zdGFsbGFibGVVbml0IGExID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEyID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEzID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigzLCAwLCAwKSwgZmFsc2UpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYTEpOwotCQlmcm9tLmFkZChhMik7Ci0JCWZyb20uYWRkKGEzKTsKLQotCQlDb2xsZWN0aW9uIHRvOwotCQl0byA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdG8uYWRkKGExKTsKLQkJdG8uYWRkKGEzKTsKLQotCQlmcm9tID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKGZyb20pOwotCQl0byA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyh0byk7Ci0JCW5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tLCB0byk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTMoKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgYTEgPSBjcmVhdGVJVSgiYSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCBmYWxzZSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgYTIgPSBjcmVhdGVJVSgiYSIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gYiA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJYi5zZXRJZCgiYiIpOwotCQliLnNldFZlcnNpb24obmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCQliLnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoImEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBjID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQljLnNldElkKCJjIik7Ci0JCWMuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JCWMuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigiYSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMi4zLjApIiksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYTEpOwotCQlmcm9tLmFkZChhMik7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGIpKTsKLQkJdG8uYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoYykpOwotCi0JCWZyb20gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXMoZnJvbSk7Ci0JCXRvID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKHRvKTsKLQkJbmV3IE9wZXJhdGlvbkdlbmVyYXRvcigpLmdlbmVyYXRlT3BlcmF0aW9uKGZyb20sIHRvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlMigpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMiA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBiID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQliLnNldElkKCJiIik7Ci0JCWIuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JCWIuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigiYSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMy4wLjApIiksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYTEpOwotCQlmcm9tLmFkZChhMik7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGIpKTsKLQotCQlmcm9tID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKGZyb20pOwotCQl0byA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyh0byk7Ci0JCW5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tLCB0byk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTEoKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgYSA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGZhbHNlKTsKLQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBiID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQliLnNldElkKCJiIik7Ci0JCWIuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JCWIuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigiYSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCi0JCUNvbGxlY3Rpb24gZnJvbTsKLQkJZnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZnJvbS5hZGQoYSk7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGIpKTsKLQotCQlmcm9tID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKGZyb20pOwotCQl0byA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyh0byk7Ci0JCW5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tLCB0byk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvT3JhY2xlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3NDYzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvT3JhY2xlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlJlcXVpcmVkQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgT3JhY2xlVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGEyOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlJSW5zdGFsbGFibGVVbml0IGQxOwotCUlJbnN0YWxsYWJsZVVuaXQgZDI7Ci0KLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbnVsbCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCByZXF1aXJlcywgdHJ1ZSk7Ci0KLQkJcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkQiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDMuMC4wKSIpLCBudWxsKTsKLQkJYzEgPSBjcmVhdGVJVSgiQyIsIHJlcXVpcmVzLCB0cnVlKTsKLQotCQlkMSA9IGNyZWF0ZUlVKCJEIiwgREVGQVVMVF9WRVJTSU9OLCB0cnVlKTsKLQotCQlyZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMy4wLjApIiksIG51bGwpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgcmVxdWlyZXMsIHRydWUpOwotCi0JCWQyID0gY3JlYXRlSVUoIkQiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBjMSwgZDEsIGIxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEExKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKS5nZXRTZXZlcml0eSgpKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZDJ9KTsKLQkJLy8JCWFzc2VydEVxdWFscyhuZXcgT3JhY2xlKCkuY2FuSW5zdGFsbChuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMX0sIHByb2ZpbGUsIG51bGwpLCB0cnVlKTsKLQkJcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvT3JhY2xlVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2YWFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvT3JhY2xlVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE9yYWNsZVRlc3QyIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGEyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCi0JSURpcmVjdG9yIGRpcmVjdG9yOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG51bGwpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgcmVxdWlyZXMsIHRydWUpOwotCi0JCWMxID0gY3JlYXRlSVUoIkMiLCBERUZBVUxUX1ZFUlNJT04sIHRydWUpOwotCi0JCXJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjAuMCkiKSwgbnVsbCk7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2MgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZXMpOwotCQlkZXNjLnNldElkKCJBIik7Ci0JCWRlc2Muc2V0VmVyc2lvbihuZXcgVmVyc2lvbigyLCAwLCAwKSk7Ci0JCWRlc2Muc2V0U2luZ2xldG9uKHRydWUpOwotCQlkZXNjLnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMy4wKSIpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlhMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoZGVzYyk7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQiIsIERFRkFVTFRfVkVSU0lPTiwgcmVxdWlyZXMsIE5PX1BST1BFUlRJRVMsIHRydWUpOwotCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2MyID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlkZXNjMi5zZXRJZCgiQyIpOwotCQlkZXNjMi5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDIsIDAsIDApKTsKLQkJZGVzYzIuc2V0U2luZ2xldG9uKHRydWUpOwotCQlkZXNjMi5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjMuMCkiKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0JCWMyID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChkZXNjMik7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBjMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCi0JfQotCi0JLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyB0ZXN0IHNob3VsZCBsb29rIGxpa2Ugbm93Ci0JICoKLQkgCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxBMSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGRpcmVjdG9yLmluc3RhbGwobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9LCBwcm9maWxlLCBudWxsKS5nZXRTZXZlcml0eSgpLCBJU3RhdHVzLk9LKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTIsIGMyLCBiMX0pOwotCQlDb2xsZWN0aW9uIGJyb2tlbkVudHJ5UG9pbnQgPSAoQ29sbGVjdGlvbikgbmV3IE9yYWNsZSgpLmNhbkluc3RhbGwobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9LCBwcm9maWxlLCBudWxsKTsKLQkJLy8JCWFzc2VydE5vdE51bGwoYnJva2VuRW50cnlQb2ludC5nZXRQcm9wZXJ0eSgiZW50cnlQb2ludCIpKTsKLQotCQluZXcgT3JhY2xlKCkuaGFzVXBkYXRlKGExKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBPcmFjbGUoKS5jYW5JbnN0YWxsKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSwgKElJbnN0YWxsYWJsZVVuaXRbXSkgYnJva2VuRW50cnlQb2ludC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2Jyb2tlbkVudHJ5UG9pbnQuc2l6ZSgpXSksIHByb2ZpbGUsIG51bGwpKTsKLQl9Ci0JICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEExYmlzKCkgewotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdEluc3RhbGxBMWJpcy4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGEyLCBjMSwgYzIsIGIxfSk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9QaWNrZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUGlja2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4OTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9QaWNrZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3Rpbmcgb2YgdGhlIHtAbGluayBQaWNrZXJ9IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUGlja2VyVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCB1bml0VmVyc2lvbjU7Ci0JcHJpdmF0ZSBQaWNrZXIgcGlja2VyOwotCi0JcHVibGljIFBpY2tlclRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBQaWNrZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDUsIDAsIDApOwotCi0JCS8vY3JlYXRlIHNvbWUgc2FtcGxlIElVcyB0byBiZSBhdmFpbGFibGUgZm9yIHRoZSBwaWNrZXIKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQl1bml0VmVyc2lvbjUgPSBjcmVhdGVJVSgicmVxdWlyZWQiLCB2ZXJzaW9uLCBwcm92aWRlcyk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dW5pdFZlcnNpb241fTsKLQkJcGlja2VyID0gbmV3IFBpY2tlcih1bml0cywgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBwaWNraW5nIGFuIElVIHRoYXQgcmVxdWlyZXMgYSBjYXBhYmlsaXR5LCBhbmQgdGhlIGF2YWlsYWJsZQotCSAqIHByb3ZpZGVkIGNhcGFiaWxpdHkgaXMgYWJvdmUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkncyB2ZXJzaW9uIHJhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEJlbG93VmVyc2lvblJhbmdlKCkgewotCi0JCS8vYW4gSVUgd2hvc2UgcmVxdWlyZWQgY2FwYWJpbGl0eSBmYWxscyBvdXRzaWRlIGF2YWlsYWJsZSByYW5nZQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsNS4wKSIpLCBudWxsKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W11bXSByZXN1bHQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCByZXF1aXJlZCwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHJlc3VsdFswXS5sZW5ndGggKyByZXN1bHRbMV0ubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBwaWNraW5nIGFuIElVIHRoYXQgcmVxdWlyZXMgYSBjYXBhYmlsaXR5LCBhbmQgdGhlIGF2YWlsYWJsZQotCSAqIHByb3ZpZGVkIGNhcGFiaWxpdHkgaXMgYWJvdmUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkncyB2ZXJzaW9uIHJhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZFdpdGhpblZlcnNpb25SYW5nZSgpIHsKLQotCQkvL2luIG1pZGRsZSBvZiByYW5nZQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsNi4wKSIpLCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHJlc3VsdCA9IHBpY2tlci5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIHJlcXVpcmVkLCBmYWxzZSlbMV07Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgdW5pdFZlcnNpb241LCByZXN1bHRbMF0pOwotCi0JCS8vb24gbG93ZXIgYm91bmQKLQkJcmVxdWlyZWQgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCJbNS4wLDYuMCkiKSwgbnVsbCk7Ci0JCXJlc3VsdCA9IHBpY2tlci5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIHJlcXVpcmVkLCBmYWxzZSlbMV07Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgdW5pdFZlcnNpb241LCByZXN1bHRbMF0pOwotCi0JCS8vb24gdXBwZXIgYm91bmQKLQkJcmVxdWlyZWQgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLDUuMF0iKSwgbnVsbCk7Ci0JCXJlc3VsdCA9IHBpY2tlci5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIHJlcXVpcmVkLCBmYWxzZSlbMV07Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgdW5pdFZlcnNpb241LCByZXN1bHRbMF0pOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHBpY2tpbmcgYW4gSVUgdGhhdCByZXF1aXJlcyBhIGNhcGFiaWxpdHksIGFuZCB0aGUgYXZhaWxhYmxlCi0JICogcHJvdmlkZWQgY2FwYWJpbGl0eSBpcyBhYm92ZSB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSdzIHZlcnNpb24gcmFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkQWJvdmVWZXJzaW9uUmFuZ2UoKSB7Ci0KLQkJLy9hbiBJVSB3aG9zZSByZXF1aXJlZCBjYXBhYmlsaXR5IGZhbGxzIG91dHNpZGUgYXZhaWxhYmxlIHJhbmdlCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgbmV3IFZlcnNpb25SYW5nZSgiWzUuMSw2LjApIiksIG51bGwpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXVtdIHJlc3VsdCA9IHBpY2tlci5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIHJlcXVpcmVkLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgcmVzdWx0WzBdLmxlbmd0aCArIHJlc3VsdFsxXS5sZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTM1ZmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgUmVjb21tZW5kYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvL3Rlc3QgbmFtZSBkZXBlbmRlbmN5IG92ZXIKLQkvL3Rlc3QKLQkvL2NoZWNrIHRoYXQgdGhlIHBpY2tlciBpcyByZXR1cm5pbmcgc29tZXRoaW5nIGluIHRoZSByYW5nZQotCXB1YmxpYyB2b2lkIHRlc3RSZWNvbW1lbmRhdGlvbigpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24sIG5ld1ZhbHVlOwotCQlhcHBseU9uID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIxID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24sIG5ld1ZhbHVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgZ29vZE1hdGNoID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByMS5tYXRjaGVzKGdvb2RNYXRjaCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBiYWROYW1lc3BhY2UgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJiYWROYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByMS5tYXRjaGVzKGJhZE5hbWVzcGFjZSkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBiYWROYW1lID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgImJhZE5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcjEubWF0Y2hlcyhiYWROYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBpY2tlcigpIHsKLQkJLy9UaGUgSVVzIHdlIHdpbGwgcGljayBmcm9tCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUxID0gY3JlYXRlSVUoIml1MSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTIgPSBjcmVhdGVJVSgiaXUyIiwgbmV3IFZlcnNpb24oNCwgMCwgMCkpOwotCi0JCS8vVGhlIHJlY29tbWVuZGF0aW9ucyB0byBiZSB1c2VkCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uLCBuZXdWYWx1ZTsKLQkJYXBwbHlPbiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIml1MSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJUmVjb21tZW5kYXRpb24gcjEgPSBuZXcgUmVjb21tZW5kYXRpb24oYXBwbHlPbiwgbmV3VmFsdWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uMiwgbmV3VmFsdWUyOwotCQlhcHBseU9uMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTIiLCBuZXcgVmVyc2lvblJhbmdlKCJbNC4yLCA1LjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTIiLCBuZXcgVmVyc2lvblJhbmdlKCJbNC4wLCA1LjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIyID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24yLCBuZXdWYWx1ZTIpOwotCQlTZXQgcmVjb21tZW5kYXRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJcmVjb21tZW5kYXRpb25zLmFkZChyMSk7Ci0JCXJlY29tbWVuZGF0aW9ucy5hZGQocjIpOwotCi0JCVBpY2tlciBwID0gbmV3IFBpY2tlcihuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtpdTEsIGl1Mn0sIG51bGwpOwotCQlJSW5zdGFsbGFibGVVbml0W11bXSBtYXRjaGVzID0gcC5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIml1MSIsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSl9LCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtYXRjaGVzWzFdWzBdLCBpdTEpOwotCi0JCVBpY2tlciBwMSA9IG5ldyBQaWNrZXIobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7aXUxLCBpdTJ9LCBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKHJlY29tbWVuZGF0aW9ucykpOwotCQltYXRjaGVzID0gcDEuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSl9LCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtYXRjaGVzWzBdLmxlbmd0aCwgMCk7Ci0JCWFzc2VydEVxdWFscyhtYXRjaGVzWzFdLmxlbmd0aCwgMCk7Ci0KLQkJbWF0Y2hlcyA9IHAxLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMiwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1swXS5sZW5ndGgsIDApOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1sxXS5sZW5ndGgsIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXaWRlbmluZ1JhbmdlcygpIHsKLQkJLy9UaGUgSVVzIHdlIHdpbGwgcGljayBmcm9tCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUxID0gY3JlYXRlSVUoIml1MSIsIG5ldyBWZXJzaW9uKDQsIDAsIDApKTsKLQotCQkvL0hlcmUgd2UgYWRkIHJlY29tbWVuZGF0aW9uIHRoYXQgd2lkZW4gdGhlIHJhbmdlIG9mIHRoZSBidW5kbGUgd2UgYXJlIGxvb2tpbmcgZm9yCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uMiwgbmV3VmFsdWUyOwotCQlhcHBseU9uMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBuZXcgVmVyc2lvblJhbmdlKCJbNC4yLCA1LjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBuZXcgVmVyc2lvblJhbmdlKCJbNC4wLCA1LjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIyID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24yLCBuZXdWYWx1ZTIpOwotCQlTZXQgcmVjb21tZW5kYXRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJcmVjb21tZW5kYXRpb25zLmFkZChyMik7Ci0KLQkJLy9DaGVjayB3aXRob3V0IHRoZSByZWNvbW1lbmRhdGlvbnMKLQkJUGlja2VyIHAyID0gbmV3IFBpY2tlcihuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtpdTF9LCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdW10gbWF0Y2hlcyA9IHAyLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMCwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1sxXS5sZW5ndGgsIDEpOwotCi0JCS8vQ2hlY2sgdGhlIHdpZGVuaW5nIHdvcmtzCi0JCVBpY2tlciBwMSA9IG5ldyBQaWNrZXIobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7aXUxfSwgbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihyZWNvbW1lbmRhdGlvbnMpKTsKLQkJbWF0Y2hlcyA9IHAxLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMiwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1sxXS5sZW5ndGgsIDEpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvck1lcmdlKCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjEsIG5ld1ZhbHVlMTsKLQkJYXBwbHlPbjEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJuYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJbmV3VmFsdWUxID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIxID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24xLCBuZXdWYWx1ZTEpOwotCQlTZXQgbGlzdDEgPSBuZXcgSGFzaFNldCgpOwotCQlsaXN0MS5hZGQocjEpOwotCQlSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgZGVzYzEgPSBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKGxpc3QxKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjIsIG5ld1ZhbHVlMjsKLQkJYXBwbHlPbjIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJuYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJbmV3VmFsdWUyID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4zLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIyID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24yLCBuZXdWYWx1ZTIpOwotCQlTZXQgbGlzdDIgPSBuZXcgSGFzaFNldCgpOwotCQlsaXN0Mi5hZGQocjIpOwotCQlSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgZGVzYzIgPSBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKGxpc3QyKTsKLQotCQkvL1dlIHRlc3QgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBtZXJnZSB3b3JrZWQuCi0JCWFzc2VydEVxdWFscyhTdGF0dXMuT0tfU1RBVFVTLCBkZXNjMS5tZXJnZShkZXNjMikpOwotCQlhc3NlcnRFcXVhbHMocjIsIGRlc2MxLmZpbmRSZWNvbW1lbmRhdGlvbihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJuYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3JNZXJnZUNvbmZsaWN0KCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjEsIG5ld1ZhbHVlMTsKLQkJYXBwbHlPbjEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJuYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJbmV3VmFsdWUxID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIxID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24xLCBuZXdWYWx1ZTEpOwotCQlTZXQgbGlzdDEgPSBuZXcgSGFzaFNldCgpOwotCQlsaXN0MS5hZGQocjEpOwotCQlSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgZGVzYzEgPSBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKGxpc3QxKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjIsIG5ld1ZhbHVlMjsKLQkJYXBwbHlPbjIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJuYW1lc3BhY2UiLCAibmFtZSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDIuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJbmV3VmFsdWUyID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIyID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24yLCBuZXdWYWx1ZTIpOwotCQlTZXQgbGlzdDIgPSBuZXcgSGFzaFNldCgpOwotCQlsaXN0Mi5hZGQocjIpOwotCQlSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgZGVzYzIgPSBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKGxpc3QyKTsKLQotCQkvL1dlIHRlc3QgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBtZXJnZSB3b3JrZWQuCi0JCWFzc2VydEVxdWFscyhTdGF0dXMuSU5GTywgZGVzYzEubWVyZ2UoZGVzYzIpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSYW5nZUludGVyc2VjdGlvbigpIHsKLQkJUmVjb21tZW5kYXRpb24gcmVjID0gbmV3IFJlY29tbWVuZGF0aW9uKG51bGwsIG51bGwpOwotCQl0cnkgewotCQkJTWV0aG9kIG0gPSByZWMuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiaW50ZXJzZWN0IiwgbmV3IENsYXNzW10ge1ZlcnNpb25SYW5nZS5jbGFzcywgVmVyc2lvblJhbmdlLmNsYXNzfSk7Ci0JCQltLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlswLjEuMCwgMy4wLjBdIil9KSk7Ci0KLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuOS4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjkuMF0iKX0pKTsKLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDIuMC4wKSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAyLjEuMF0iKX0pKTsKLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMy4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiWzAuOS4wLCAxLjMuMF0iKX0pKTsKLQkJCWFzc2VydEVxdWFscyhudWxsLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiWzMuMC4wLCA0LjAuMF0iKX0pKTsKLQotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIigxLjAuMCwgMi4wLjBdIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBuZXcgVmVyc2lvblJhbmdlKCIoMS4wLjAsIDIuMS4wXSIpfSkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIigxLjAuMCwgMi4wLjBdIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCIoMS4wLjAsIDIuMC4wXSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMS4wXSIpfSkpOwotCi0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIil9KSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIil9KSk7Ci0KLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKX0pKTsKLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCIoMS4wLjAsIDIuMC4wKSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiKDEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiKDEuMC4wLCAyLjAuMCkiKX0pKTsKLQotCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDMuMC4wKSIpfSkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMi4wLjBdIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDMuMC4wKSIpfSkpOwotCQkJYXNzZXJ0RXF1YWxzKG51bGwsIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBuZXcgVmVyc2lvblJhbmdlKCIoMi4wLjAsIDMuMC4wKSIpfSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVXNhZ2Ugb2YgcmVmbGVjdGlvbiBmYWlsZWQiKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZXBsYWNlUGxhblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZXBsYWNlUGxhblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmYjNlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVwbGFjZVBsYW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUZXN0cyB7QGxpbmsgSVBsYW5uZXIjZ2V0UHJvdmlzaW9uaW5nUGxhbihQcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfQotICogaW52b2x2aW5nIHJlcGxhY2luZyBhbiBJVSB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlUGxhblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgZjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMV8xOwotCUlJbnN0YWxsYWJsZVVuaXQgZjFfNDsKLQlJSW5zdGFsbGFibGVVbml0IGZyYWcxOwotCUlJbnN0YWxsYWJsZVVuaXQgZnJhZzFfMTsKLQlJSW5zdGFsbGFibGVVbml0IGZyYWcxXzQ7Ci0JSUluc3RhbGxhYmxlVW5pdCBmYTsKLQlJSW5zdGFsbGFibGVVbml0IGZhcDsKLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9iYXNlIElVIHRoYXQgb3RoZXJzIHJlcXVpcmUKLQkJZjEgPSBjcmVhdGVJVSgiZjEiLCBERUZBVUxUX1ZFUlNJT04sIHRydWUpOwotCQlmMV8xID0gY3JlYXRlSVUoImYxIiwgbmV3IFZlcnNpb24oMSwgMSwgMCksIHRydWUpOwotCQlmMV80ID0gY3JlYXRlSVUoImYxIiwgbmV3IFZlcnNpb24oMSwgNCwgMCksIHRydWUpOwotCi0JCS8vZnJhZ21lbnRzIG9mIGJhc2UgSVUKLQkJZnJhZzEgPSBjcmVhdGVJVUZyYWdtZW50KGYxLCAiZnJhZzEiLCBmMS5nZXRWZXJzaW9uKCkpOwotCQlmcmFnMV8xID0gY3JlYXRlSVVGcmFnbWVudChmMSwgImZyYWcxIiwgZjFfMS5nZXRWZXJzaW9uKCkpOwotCQlmcmFnMV80ID0gY3JlYXRlSVVGcmFnbWVudChmMSwgImZyYWcxIiwgZjFfNC5nZXRWZXJzaW9uKCkpOwotCi0JCS8vSVVzIHRoYXQgcmVxdWlyZSBiYXNlIElVCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJmMSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4zLjApIiksIG51bGwpOwotCQlmYSA9IGNyZWF0ZUlVKCJmYSIsIHJlcXVpcmVzLCBmYWxzZSk7Ci0JCXJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJmMSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS40LjApIiksIG51bGwpOwotCQlmYXAgPSBjcmVhdGVJVSgiZmEiLCBuZXcgVmVyc2lvbigxLCAxLCAwKSwgcmVxdWlyZXMsIE5PX1BST1BFUlRJRVMsIGZhbHNlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGZhLCBmcmFnMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmYSwgZnJhZzF9KTsKLQkJZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMV8xLCBmMV80LCBmcmFnMV8xLCBmcmFnMV80fSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlcGxhY2UoKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBvbGRVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ZhfTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIG5ld1VuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZmFwfTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG9sZFVuaXRzKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ld1VuaXRzKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcXVlc3QsIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCksIG51bGwpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBwbGFuLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiMS4xIiwgcHJvZmlsZSwgb2xkVW5pdHMpOwotCQlJU3RhdHVzIHJlc3VsdCA9IGNyZWF0ZUVuZ2luZSgpLnBlcmZvcm0ocHJvZmlsZSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCByZXN1bHQuaXNPSygpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCIxLjMiLCBwcm9maWxlLCBuZXdVbml0cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VGcmFnbWVudCgpIHsKLQkJLy9UT0RPIGl0IGlzIHN0cmFuZ2UgdGhhdCB0aGlzIHN1Y2NlZWRzLCBzaW5jZSBmcmFnMV80IGFuZCBmYSBjYW5ub3QgY28tZXhpc3QKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ZyYWcxfSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmcmFnMV80fSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcGxhbi5nZXRTdGF0dXMoKS5pc09LKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1Jlc29sdXRpb25IZWxwZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVzb2x1dGlvbkhlbHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3OWU0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVzb2x1dGlvbkhlbHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlVuc2F0aXNmaWVkQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFJlc29sdXRpb25IZWxwZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb2x1dGlvbkhlbHBlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfS0VZID0gIm9zZ2kub3MiOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXNvbHV0aW9uSGVscGVyVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFJlc29sdXRpb25IZWxwZXJUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JcHVibGljIFJlc29sdXRpb25IZWxwZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHJlc29sdmluZyBhbiBJVSB0aGF0IHJlcXVpcmVzIGEgY2FwYWJpbGl0eSwgYW5kIHRoZSBhdmFpbGFibGUKLQkgKiBwcm92aWRlZCBjYXBhYmlsaXR5IGlzIGFib3ZlIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5J3MgdmVyc2lvbiByYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeUFib3ZlVmVyc2lvblJhbmdlKCkgewotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbig1LCAwLCAwKTsKLQotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgcHJvdmlkZXMpOwotCi0JCS8vYW4gSVUgd2hvc2UgcmVxdWlyZWQgY2FwYWJpbGl0eSBmYWxscyBvdXRzaWRlIGF2YWlsYWJsZSByYW5nZQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsNS4wKSIpLCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGwgPSBjcmVhdGVJVSgibWF0Y2giLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgIm1hdGNoIiwgdW5zYXRpc2ZpZWRbMF0uZ2V0VW5zYXRpc2ZpZWRVbml0KCkuZ2V0SWQoKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gdW5zYXRpc2ZpZWRbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuNSIsICJ0ZXN0IiwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHJlc29sdmluZyBhbiBJVSB0aGF0IHJlcXVpcmVzIGEgY2FwYWJpbGl0eSwgYW5kIHRoZSBhdmFpbGFibGUKLQkgKiBwcm92aWRlZCBjYXBhYmlsaXR5IGlzIGJlbG93IHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5J3MgdmVyc2lvbiByYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeUJlbG93VmVyc2lvblJhbmdlKCkgewotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbigyLCAwLCAwKTsKLQotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgcHJvdmlkZXMpOwotCi0JCS8vYW4gSVUgd2hvc2UgcmVxdWlyZWQgY2FwYWJpbGl0eSBmYWxscyBvdXRzaWRlIGF2YWlsYWJsZSByYW5nZQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIG5ldyBWZXJzaW9uUmFuZ2UoIigyLjAsMy4wKSIpLCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGwgPSBjcmVhdGVJVSgibWF0Y2giLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgIm1hdGNoIiwgdW5zYXRpc2ZpZWRbMF0uZ2V0VW5zYXRpc2ZpZWRVbml0KCkuZ2V0SWQoKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gdW5zYXRpc2ZpZWRbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuNSIsICJ0ZXN0IiwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXBlbmRlbmN5V2l0aFBsYXRmb3JtRmlsdGVyKCkgewotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgY3JlYXRlRmlsdGVyKEZJTFRFUl9LRVksICJ3aW4zMiIpLCBwcm92aWRlcyk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBBTllfVkVSU0lPTiwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoInRvSW5zdGFsbCIsIHZlcnNpb24sIHJlcXVpcmVzKTsKLQotCQkvL3NldHVwIGNvbnRleHQgc28gdGhhdCBwbGF0Zm9ybSBmaWx0ZXIgd2lsbCBzYXRpc2Z5IGRlcGVuZGVuY3kKLQkJSGFzaHRhYmxlIGNvbnRleHQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWNvbnRleHQucHV0KEZJTFRFUl9LRVksICJ3aW4zMiIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIoY29udGV4dCwgbnVsbCk7Ci0JCUhhc2hTZXQgaW5zdGFsbFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWluc3RhbGxTZXQuYWRkKHRvSW5zdGFsbCk7Ci0JCUhhc2hTZXQgYXZhaWxhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJYXZhaWxhYmxlLmFkZChyZXF1aXJlZCk7Ci0JCVVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIHVuc2F0aXNmaWVkID0gcmguaW5zdGFsbChpbnN0YWxsU2V0LCBhdmFpbGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0KLQkJLy9ub3cgdHJ5IHdpdGggYSBudWxsIGV2YWx1YXRpb24gY29udGV4dAotCQlyaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpOwotCQl1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAxLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsICJ0b0luc3RhbGwiLCB1bnNhdGlzZmllZFswXS5nZXRVbnNhdGlzZmllZFVuaXQoKS5nZXRJZCgpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkgPSB1bnNhdGlzZmllZFswXS5nZXRSZXF1aXJlZENhcGFiaWxpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjMiLCAidGVzdC5jYXBhYmlsaXR5IiwgY2FwYWJpbGl0eS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgInRlc3QiLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7Ci0KLQkJLy9ub3cgdXNlIGEgY29udGV4dCB3aGVyZSBwbGF0Zm9ybSBmaWx0ZXIgd2lsbCBub3QgYmUgc2F0aXNmaWVkCi0JCWNvbnRleHQucHV0KEZJTFRFUl9LRVksICJub21hdGNoIik7Ci0JCXJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIoY29udGV4dCwgbnVsbCk7Ci0JCXVuc2F0aXNmaWVkID0gcmguaW5zdGFsbChpbnN0YWxsU2V0LCBhdmFpbGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDEsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMi4yIiwgInRvSW5zdGFsbCIsIHVuc2F0aXNmaWVkWzBdLmdldFVuc2F0aXNmaWVkVW5pdCgpLmdldElkKCkpOwotCQljYXBhYmlsaXR5ID0gdW5zYXRpc2ZpZWRbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCk7Ci0JCWFzc2VydEVxdWFscygiMi4zIiwgInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuNCIsICJ0ZXN0IiwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCi0JfQotCi0JLyoqCi0JICogVGVzdHMgcmVzb2x2aW5nIGFuIElVIHRoYXQgaGFzIGEgZmlsdGVyIG9uIGl0cyByZXF1aXJlZCBjYXBhYmlsaXR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTYXRpc2ZpZWREZXBlbmRlbmN5V2l0aE1hdGNoaW5nRmlsdGVyKCkgewotCQkvL3VzZSB0aGUgc2FtZSB2ZXJzaW9uIGV2ZXJ5d2hlcmUgYmVjYXVzZSBpdCdzIG5vdCBpbnRlcmVzdGluZyBmb3IgdGhpcyB0ZXN0Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JCS8vVGhlIElVIHRoYXQgZXhwb3J0cyB0aGUgY2FwYWJpbGl0eQotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCB2ZXJzaW9uKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWQgPSBjcmVhdGVJVSgicmVxdWlyZWQiLCB2ZXJzaW9uLCBwcm92aWRlcyk7Ci0KLQkJLy9hbiBJVSB3aG9zZSBmaWx0ZXIgd2lsbCBtYXRjaCB0aGUgZW52aXJvbm1lbnQKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBjcmVhdGVGaWx0ZXIoRklMVEVSX0tFWSwgIm1hdGNoVmFsdWUiKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm1hdGNoIiwgdmVyc2lvbiwgcmVxdWlyZXMpOwotCi0JCURpY3Rpb25hcnkgZW52aXJvbm1lbnQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWVudmlyb25tZW50LnB1dChGSUxURVJfS0VZLCAibWF0Y2hWYWx1ZSIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIoZW52aXJvbm1lbnQsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogSW4gdGhpcyB0ZXN0IHdlIHRyeSB0byByZXNvbHZlIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSB0aGF0IGlzCi0JICogYXZhaWxhYmxlLCBidXQgdGhlcmUgaXMgYSBmaWx0ZXIgb24gdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkgc28gaXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTYXRpc2ZpZWREZXBlbmRlbmN5V2l0aFVubWF0Y2hpbmdGaWx0ZXIoKSB7Ci0JCS8vdXNlIHRoZSBzYW1lIHZlcnNpb24gZXZlcnl3aGVyZSBiZWNhdXNlIGl0J3Mgbm90IGludGVyZXN0aW5nIGZvciB0aGlzIHRlc3QKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIHByb3ZpZGVzKTsKLQotCQkvL2FuIElVIHdob3NlIGZpbHRlciB3aWxsIG5vdCBtYXRjaCB0aGUgZW52aXJvbm1lbnQKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBjcmVhdGVGaWx0ZXIoRklMVEVSX0tFWSwgIm5vTWF0Y2hWYWx1ZSIpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGwgPSBjcmVhdGVJVSgibm9NYXRjaCIsIHZlcnNpb24sIHJlcXVpcmVzKTsKLQotCQlEaWN0aW9uYXJ5IGVudmlyb25tZW50ID0gbmV3IEhhc2h0YWJsZSgpOwotCQllbnZpcm9ubWVudC5wdXQoRklMVEVSX0tFWSwgIm1hdGNoVmFsdWUiKTsKLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKGVudmlyb25tZW50LCBudWxsKTsKLQkJSGFzaFNldCBpbnN0YWxsU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaW5zdGFsbFNldC5hZGQodG9JbnN0YWxsKTsKLQkJSGFzaFNldCBhdmFpbGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlhdmFpbGFibGUuYWRkKHJlcXVpcmVkKTsKLQkJVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10gdW5zYXRpc2ZpZWQgPSByaC5pbnN0YWxsKGluc3RhbGxTZXQsIGF2YWlsYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVEZXBlbmRlbmN5KCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiamF2YS5ydW50aW1lIiwgIkpSRSIsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSl9OwotCQlJSW5zdGFsbGFibGVVbml0IG9zZ2kgPSBjcmVhdGVJVSgib3JnLmVjbGlwc2Uub3NnaSIsIG5ldyBWZXJzaW9uKDMsIDIsIDAsIG51bGwpLCByZXF1aXJlcywgTk9fUFJPUEVSVElFUywgZmFsc2UpOwotCi0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJqYXZhLnJ1bnRpbWUiLCAiSlJFIiwgbmV3IFZlcnNpb24oMSwgNCwgMiwgInNyMiIpKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQganJlID0gY3JlYXRlSVUoImNvbS5pYm0uanJlIiwgbmV3IFZlcnNpb24oMSwgNCwgMiwgInNyMiIpLCBwcm92aWRlcyk7Ci0KLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpOwotCQlIYXNoU2V0IG9zZ2lTZXQgPSBuZXcgSGFzaFNldCgxKTsKLQkJb3NnaVNldC5hZGQob3NnaSk7Ci0JCUhhc2hTZXQganJlU2V0ID0gbmV3IEhhc2hTZXQoMSk7Ci0JCWpyZVNldC5hZGQoanJlKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCByaC5pbnN0YWxsKG9zZ2lTZXQsIGpyZVNldCkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyByZXNvbHZpbmcgYW4gSVUgdGhhdCBoYXMgYSBmaWx0ZXIgb24gaXRzIHJlcXVpcmVkIGNhcGFiaWxpdHksIGFuZAotCSAqIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFVuc2F0aXNmaWVkRGVwZW5kZW5jeVdpdGhNYXRjaGluZ0ZpbHRlcigpIHsKLQkJLy91c2UgdGhlIHNhbWUgdmVyc2lvbiBldmVyeXdoZXJlIGJlY2F1c2UgaXQncyBub3QgaW50ZXJlc3RpbmcgZm9yIHRoaXMgdGVzdAotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgcHJvdmlkZXMpOwotCi0JCS8vYW4gSVUgd2hvc2UgZmlsdGVyIHdpbGwgbWF0Y2ggdGhlIGVudmlyb25tZW50Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJkb2VzLm5vdC5leGlzdCIsIGNyZWF0ZUZpbHRlcihGSUxURVJfS0VZLCAibWF0Y2hWYWx1ZSIpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGwgPSBjcmVhdGVJVSgibWF0Y2giLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJRGljdGlvbmFyeSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKLQkJZW52aXJvbm1lbnQucHV0KEZJTFRFUl9LRVksICJtYXRjaFZhbHVlIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihlbnZpcm9ubWVudCwgbnVsbCk7Ci0JCUhhc2hTZXQgaW5zdGFsbFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWluc3RhbGxTZXQuYWRkKHRvSW5zdGFsbCk7Ci0JCUhhc2hTZXQgYXZhaWxhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJYXZhaWxhYmxlLmFkZChyZXF1aXJlZCk7Ci0JCVVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIHVuc2F0aXNmaWVkID0gcmguaW5zdGFsbChpbnN0YWxsU2V0LCBhdmFpbGFibGUpOwotCi0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgdW5zYXRpc2ZpZWQubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAibWF0Y2giLCB1bnNhdGlzZmllZFswXS5nZXRVbnNhdGlzZmllZFVuaXQoKS5nZXRJZCgpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkgPSB1bnNhdGlzZmllZFswXS5nZXRSZXF1aXJlZENhcGFiaWxpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjQiLCAidGVzdC5jYXBhYmlsaXR5IiwgY2FwYWJpbGl0eS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiMS41IiwgImRvZXMubm90LmV4aXN0IiwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEluIHRoaXMgdGVzdCB3ZSB0cnkgdG8gcmVzb2x2ZSBhbiBJVSB0aGF0IGhhcyBhbiB1bnNhdGlzZmllZCBkZXBlbmRlbmN5LgotCSAqIEhvd2V2ZXIsIHRoZXJlIGlzIGEgZmlsdGVyIG9uIHRoZSB1bnJlc29sdmVkIGRlcGVuZGVuY3kgdGhhdCBkb2VzIG5vdAotCSAqIG1hdGNoIHRoZSBlbnZpcm9ubWVudCwgc28gaXQgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBJVSBiZWluZyByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zYXRpc2ZpZWREZXBlbmRlbmN5V2l0aFVubWF0Y2hpbmdGaWx0ZXIoKSB7Ci0JCS8vdXNlIHRoZSBzYW1lIHZlcnNpb24gZXZlcnl3aGVyZSBiZWNhdXNlIGl0J3Mgbm90IGludGVyZXN0aW5nIGZvciB0aGlzIHRlc3QKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIHByb3ZpZGVzKTsKLQotCQkvL2FuIElVIHdob3NlIGZpbHRlciB3aWxsIG5vdCBtYXRjaCB0aGUgZW52aXJvbm1lbnQKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgImRvZXMubm90LmV4aXN0IiwgY3JlYXRlRmlsdGVyKEZJTFRFUl9LRVksICJub01hdGNoVmFsdWUiKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm5vTWF0Y2giLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJRGljdGlvbmFyeSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKLQkJZW52aXJvbm1lbnQucHV0KEZJTFRFUl9LRVksICJtYXRjaFZhbHVlIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihlbnZpcm9ubWVudCwgbnVsbCk7Ci0JCUhhc2hTZXQgaW5zdGFsbFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWluc3RhbGxTZXQuYWRkKHRvSW5zdGFsbCk7Ci0JCUhhc2hTZXQgYXZhaWxhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJYXZhaWxhYmxlLmFkZChyZXF1aXJlZCk7Ci0JCVVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIHVuc2F0aXNmaWVkID0gcmguaW5zdGFsbChpbnN0YWxsU2V0LCBhdmFpbGFibGUpOwotCi0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgdW5zYXRpc2ZpZWQubGVuZ3RoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUm9sbGJhY2tUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUm9sbGJhY2tUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYzEzZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JvbGxiYWNrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5EaXJlY3RvckFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbi5BZ2VudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSb2xsYmFja1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElEaXJlY3RvciBkaXJlY3RvcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBERUZBVUxUX1ZFUlNJT04sIHRydWUpOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJcHJpbnRQcm9maWxlKHByb2ZpbGUpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG51bGw7Ci0JCXJlcG8gPSByZXBvTWFuLmxvYWRSZXBvc2l0b3J5KGdldFJvbGxiYWNrUmVwb3NpdG9yeSgpLCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IChJSW5zdGFsbGFibGVVbml0W10pIHJlcG8ucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXVzLmxlbmd0aDsgaSsrKQotCQkJU3lzdGVtLm91dC5wcmludGxuKGl1c1tpXSk7Ci0JCWRpcmVjdG9yLnJldmVydChpdXNbMF0sIHByb2ZpbGUsIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlwcmludFByb2ZpbGUocHJvZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkgewotCQl0cnkgewotCQkJVVJMIGxvY2F0aW9uID0gKChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpKS5nZXREYXRhQXJlYShEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUik7Ci0JCQlyZXR1cm4gbmV3IFVSTChsb2NhdGlvbiwgInJvbGxiYWNrIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCI0Ljk5IiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9TaW5nbGV0b25UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvU2luZ2xldG9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGM1Yjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9TaW5nbGV0b25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xldG9uVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMTsKLQlJSW5zdGFsbGFibGVVbml0IGYxXzE7Ci0KLQlJSW5zdGFsbGFibGVVbml0IGYyOwotCUlJbnN0YWxsYWJsZVVuaXQgZjJfMTsKLQotCUlJbnN0YWxsYWJsZVVuaXQganVuaXQzODsKLQlJSW5zdGFsbGFibGVVbml0IGp1bml0NDA7Ci0KLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWYxID0gY3JlYXRlSVUoImYxIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCi0JCWYxXzEgPSBjcmVhdGVJVSgiZjEiLCBuZXcgVmVyc2lvbigxLCAxLCAwKSwgdHJ1ZSk7Ci0KLQkJZjIgPSBjcmVhdGVJVSgiZjIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0KLQkJZjJfMSA9IGNyZWF0ZUlVKCJmMiIsIG5ldyBWZXJzaW9uKDEsIDAsIDEpKTsKLQotCQlqdW5pdDM4ID0gY3JlYXRlSVUoImp1bml0IiwgbmV3IFZlcnNpb24oMywgOCwgMSkpOwotCi0JCWp1bml0NDAgPSBjcmVhdGVJVSgianVuaXQiLCBuZXcgVmVyc2lvbig0LCAwLCAxKSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxLCBmMV8xLCBqdW5pdDM4LCBqdW5pdDQwLCBmMiwgZjJfMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVZlcnNpb25Ob25TaW5nbGV0b24oKSB7Ci0JCS8vIFRoZSBpbnN0YWxsYXRpb24gb2YganVuaXQzOCBhbmQganVuaXQgNDAgdG9nZXRoZXIgc2hvdWxkIHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2p1bml0MzgsIGp1bml0NDB9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWZXJzaW9uU2luZ2xldG9uKCkgewotCQkvLyBUaGUgaW5zdGFsbGF0aW9uIG9mIGp1bml0MzggYW5kIGp1bml0IDQwIHRvZ2V0aGVyIHNob3VsZCBub3Qgc3VjY2VlZAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGYxXzF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWZXJzaW9uU2luZ2xldG9uMigpIHsKLQkJLy8gVGhlIGluc3RhbGxhdGlvbiBvZiBqdW5pdDM4IGFuZCBqdW5pdCA0MCB0b2dldGhlciBzaG91bGQgbm90IHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YyLCBmMl8xfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VuaW5zdGFsbFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9Vbmluc3RhbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzFhZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VuaW5zdGFsbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSURpcmVjdG9yIGRpcmVjdG9yOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIERFRkFVTFRfVkVSU0lPTiwgdHJ1ZSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbCgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9OwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModW5pdHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zKCIxLjAiLCBwcm9maWxlLCB1bml0cyk7Ci0JCXJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyh1bml0cyk7Ci0JCWRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RW1wdHlQcm9maWxlKHByb2ZpbGUpOwotCQkvL3VuaW5zdGFsbGluZyBvbiBlbXB0eSBwcm9maWxlIHNob3VsZCBiZSBhIG5vLW9wCi0JCWRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RW1wdHlQcm9maWxlKHByb2ZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9VcGRhdGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvVXBkYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9VcGRhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgZjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMV8xOwotCUlJbnN0YWxsYWJsZVVuaXQgZjFfNDsKLQotCUlJbnN0YWxsYWJsZVVuaXQgZmE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmYXA7Ci0JSURpcmVjdG9yIGRpcmVjdG9yOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmMUlkID0gZ2V0TmFtZSgpICsgImYxIjsKLQkJZjEgPSBjcmVhdGVJVShmMUlkLCBERUZBVUxUX1ZFUlNJT04sIHRydWUpOwotCQlmMV8xID0gY3JlYXRlSVUoZjFJZCwgbmV3IFZlcnNpb24oMSwgMSwgMCksIHRydWUpOwotCQlmMV80ID0gY3JlYXRlSVUoZjFJZCwgbmV3IFZlcnNpb24oMSwgNCwgMCksIHRydWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGYxSWQsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4zLjApIiksIG51bGwpOwotCQlTdHJpbmcgZmFJZCA9IGdldE5hbWUoKSArICIuZmEiOwotCQlmYSA9IGNyZWF0ZUlVKGZhSWQsIHJlcXVpcmVzLCBmYWxzZSk7Ci0KLQkJcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgZjFJZCwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjQuMCkiKSwgbnVsbCk7Ci0JCWZhcCA9IGNyZWF0ZUlVKGZhSWQsIG5ldyBWZXJzaW9uKDEsIDEsIDApLCByZXF1aXJlcywgTk9fUFJPUEVSVElFUywgZmFsc2UpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMSwgZmF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVXBkYXRlVGVzdC4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZmF9KTsKLQkJYXNzZXJ0T0soZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zKCJQcm9maWxlIHNldHVwIiwgcHJvZmlsZSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGZhfSk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMV8xLCBmMV80fSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMV8xfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0T0socGxhbi5nZXRTdGF0dXMoKSk7Ci0JCWFzc2VydE9LKGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjFfNH0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL0Fic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL0Fic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNGQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BYnN0cmFjdERpcmVjdG9yeVdhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaXJlY3RvcnlXYXRjaGVyVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQkvLyBsaXN0IG9mIEZpbGUgb2JqZWN0cyB0byByZW1vdmUgbGF0ZXIgZHVyaW5nIHRlYXJkb3duCi0JcHJvdGVjdGVkIFNldCB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIEFic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCWRlbGV0ZSgoRmlsZSkgaXRlci5uZXh0KCkpOwotCQl0b1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MzhhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlyZWN0b3J5V2F0Y2hlclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVwb3NpdG9yeUxpc3RlbmVyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9maWxlU3luY2hyb25pemVyVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvRGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYTEyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeVdhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5V2F0Y2hlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JcHVibGljIERpcmVjdG9yeVdhdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXJlY3RvcnlXYXRjaGVyTnVsbERpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJbmV3IERpcmVjdG9yeVdhdGNoZXIoKEZpbGUpIG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlyZWN0b3J5V2F0Y2hlck9uZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKTsKLQkJRGlyZWN0b3J5V2F0Y2hlciB3YXRjaGVyID0gbmV3IERpcmVjdG9yeVdhdGNoZXIoZm9sZGVyKTsKLQkJd2F0Y2hlci5zdGFydCgpOwotCQl3YXRjaGVyLnN0b3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlyZWN0b3J5V2F0Y2hlclByb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMSIpOwotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKEZpbGVMb2NhdG9yLnRvRmlsZVVSTChiYXNlKS5nZXRQYXRoKCkpOwotCi0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KERpcmVjdG9yeVdhdGNoZXIuRElSLCBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKHByb3BzLCBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSk7Ci0JCXdhdGNoZXIuc3RhcnQoKTsKLQkJd2F0Y2hlci5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVdhdGNoZXJMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKTsKLQotCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChEaXJlY3RvcnlXYXRjaGVyLkRJUiwgZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihwcm9wcywgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlmaW5hbCBMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0JCURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJDVlMiKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlZChGaWxlIGZpbGUpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJDVlMiKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWxpc3QucmVtb3ZlKGZpbGUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMb25nIGdldFNlZW5GaWxlKEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydFBvbGwoKSB7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0JCQl9Ci0KLQkJfTsKLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Byb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9Qcm9maWxlU3luY2hyb25pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTEzYmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Byb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvcnl3YXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3REaXJlY3RvcnlXYXRjaGVyVGVzdCB7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogUnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0KCkgewotCQkvLyBlbXB0eSB0ZXN0IGJlY2F1c2UgdGhlIG90aGVycyBhcmVuJ3QgZW5hYmxlZCB5ZXQKLQl9Ci0KLQkvKgotCSAqIFRlc3QgdGhhdCB3ZSBvbmx5IHRyeSB0byBpbnN0YWxsIGJ1bmRsZXMgd2l0aCBtYXRjaGluZyBwbGF0Zm9ybSBmaWx0ZXJzLgotCSAqIAotCSAqIFRPRE8gd2UgZG9uJ3Qgd2FudCB0byB0ZXN0IHRvIHNlZSBpZiB0aGUgYnVuZGxlcyBhcmUgaW4gdGhlIHJlcG8sIGJ1dCBpZgotCSAqIHRoZSBidW5kbGVzIGFyZSBmaWx0ZXJlZCB3aGVuIHRoZXkgYXJlIGluc3RhbGxlZCBpbnRvIGEgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBfdGVzdFBsYXRmb3JtRmlsdGVyKCkgewotCQlTdHJpbmcgYmFzZSA9ICIvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci8iOwotCQlTdHJpbmdbXSBleHRlbnNpb25zID0gbmV3IFN0cmluZ1tdIHsiYmJiXzEuMC4wLmphciIsICJiYmIubGludXhfMS4wLjAuamFyIiwgImJiYi53aW4zMl8xLjAuMC5qYXIifTsKLQkJU2V0IGphcnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQlqYXJzLmFkZChnZXRUZXN0RGF0YSgiMC45OSIsIGJhc2UgKyBleHRlbnNpb25zW2ldKSk7Ci0JCUZpbGUgZm9sZGVyID0gZ2V0VGVtcEZvbGRlcigpOwotCQl0b1JlbW92ZS5hZGQoZm9sZGVyKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gamFycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZpbGUgbmV4dCA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWNvcHkoIjEuMCAiICsgbmV4dC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV4dCwgbmV3IEZpbGUoZm9sZGVyLCBuZXh0LmdldE5hbWUoKSkpOwotCQl9Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJVGVzdFJlcG9zaXRvcnlXYXRjaGVyIHdhdGNoZXIgPSBUZXN0UmVwb3NpdG9yeVdhdGNoZXIuY3JlYXRlV2F0Y2hlcihmb2xkZXIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDAsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgMCwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCi0JCXdhdGNoZXIucG9sbCgpOwotCi0JCS8vIHdoaWNoIElVcyB3ZSBhcmUgZXhwZWN0aW5nIGlzIGRlcGVuZGVudCBvbiB3aGljaCBPUyB3ZSBhcmUgcnVubmluZwotCQlTZXQgZXhwZWN0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlleHBlY3RlZC5hZGQoImJiYiIpOwotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kub3MiKTsKLQkJaWYgKCJ3aW4zMiIuZXF1YWxzKG9zKSkgewotCQkJZXhwZWN0ZWQuYWRkKCJiYmIud2luMzIiKTsKLQkJfSBlbHNlIGlmICgibGludXgiLmVxdWFscyhvcykpIHsKLQkJCWV4cGVjdGVkLmFkZCgiYmJiLmxpbnV4Iik7Ci0JCX0KLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgZXhwZWN0ZWQuc2l6ZSgpLCBpdXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRUcnVlKCIzLjEgIiArIGl1c1tpXS5nZXRJZCgpLCBleHBlY3RlZC5jb250YWlucyhpdXNbaV0uZ2V0SWQoKSkpOwotCQlhc3NlcnRFcXVhbHMoIjMuMiIsIGV4cGVjdGVkLnNpemUoKSwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCX0KLQotCS8qCi0JICogVGVzdCB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHRyeSB0byBpbnN0YWxsIHRoZSBoaWdoZXN0IHZlcnNpb24gb2Ygc2luZ2xldG9uIGJ1bmRsZXMKLQkgKiB3aGVyZSBtdWx0aXBsZSB2ZXJzaW9ucyBleGlzdC4KLQkgKiAKLQkgKiBUT0RPIHdlIGRvbid0IHdhbnQgdG8gdGVzdCB0byBzZWUgaWYgdGhlIGJ1bmRsZXMgYXJlIGluIHRoZSByZXBvLCBidXQgaWYKLQkgKiB0aGUgYnVuZGxlcyBhcmUgZmlsdGVyZWQgd2hlbiB0aGV5IGFyZSBpbnN0YWxsZWQgaW50byBhIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgX3Rlc3RNdWx0aXBsZVZlcnNpb25zKCkgewotCQlGaWxlIG9uZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzEuMC4wLmphciIpOwotCQlGaWxlIHR3byA9IGdldFRlc3REYXRhKCIwLjIiLCAiL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzIuMC4wLmphciIpOwotCQlGaWxlIGZvbGRlciA9IGdldFRlbXBGb2xkZXIoKTsKLQkJdG9SZW1vdmUuYWRkKGZvbGRlcik7Ci0KLQkJY29weSgiMS4wIiwgb25lLCBuZXcgRmlsZShmb2xkZXIsIG9uZS5nZXROYW1lKCkpKTsKLQkJY29weSgiMS4xIiwgdHdvLCBuZXcgRmlsZShmb2xkZXIsIHR3by5nZXROYW1lKCkpKTsKLQotCQlUZXN0UmVwb3NpdG9yeVdhdGNoZXIgd2F0Y2hlciA9IFRlc3RSZXBvc2l0b3J5V2F0Y2hlci5jcmVhdGVXYXRjaGVyKGZvbGRlcik7Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAwLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDAsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQotCQl3YXRjaGVyLnBvbGwoKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMSwgaXVzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMy4xIiwgImNjYyIsIGl1c1swXS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjIiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgaXVzWzBdLmdldFZlcnNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgYXJ0aWZhY3RzLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjU3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvUmVwb3NpdG9yeUxpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlMaXN0ZW5lclRlc3QgZXh0ZW5kcyBBYnN0cmFjdERpcmVjdG9yeVdhdGNoZXJUZXN0IHsKLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUxpc3RlbmVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIFJ1biBhbGwgdGhlIHRlc3RzIGluIHRoaXMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIFJlbW92ZSB0aGUgZmlsZXMgZnJvbSB0aGUgdGFyZ2V0LCBpZiB0aGV5IGV4aXN0IGluIHRoZSBzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRlbnRzKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkgewotCQlpZiAoc291cmNlLmV4aXN0cygpICYmIHNvdXJjZS5pc0RpcmVjdG9yeSgpICYmIHRhcmdldC5leGlzdHMoKSAmJiB0YXJnZXQuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gc291cmNlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZmlsZXNbaV0gIT0gbnVsbCkKLQkJCQkJZGVsZXRlKG5ldyBGaWxlKHRhcmdldCwgZmlsZXNbaV0uZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3J5V2F0Y2hlckxpc3RlbmVyKCkgewotCQlGaWxlIGJhc2VGb2xkZXIgPSBnZXRUZXN0RGF0YSgiMC45OSIsICIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBiYXNlRm9sZGVyMiA9IGdldFRlc3REYXRhKCIwLjEwMCIsICIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIiKTsKLQotCQkvLyBtYWtlIHN1cmUgd2UgcmVtb3ZlIHRoaXMgZmlsZSBhZnRlciB3ZSBmaW5pc2ggcnVubmluZyB0aGUgdGVzdHMKLQkJRmlsZSBmb2xkZXIgPSBnZXRUZW1wRm9sZGVyKCk7Ci0JCXRvUmVtb3ZlLmFkZChmb2xkZXIpOwotCi0JCS8vIGNyZWF0ZSB0aGUgd2F0Y2hlcgotCQlUZXN0UmVwb3NpdG9yeVdhdGNoZXIgd2F0Y2hlciA9IFRlc3RSZXBvc2l0b3J5V2F0Y2hlci5jcmVhdGVXYXRjaGVyKGZvbGRlcik7Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIDAsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQotCQkvLyBjb3B5IHRoZSBmaXJzdCBzZXQgb2YgZGF0YSB0byB0aGUgZm9sZGVyIHNvIGl0IGlzIGRpc2NvdmVyZWQgYW5kIHRoZW4gdmVyaWZ5IHRoZSBjb250ZW50cwotCQljb3B5KCIyLjAiLCBiYXNlRm9sZGVyLCBmb2xkZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZpbGUgPSB3YXRjaGVyLmdldEFydGlmYWN0RmlsZShrZXlzW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCWFzc2VydFRydWUoIjIuMS4iICsgZmlsZSwgZmlsZS5zdGFydHNXaXRoKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMiwgd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCAyLCB3YXRjaGVyLmdldEFydGlmYWN0S2V5cygpLmxlbmd0aCk7Ci0KLQkJLy8gY29weSB0aGUgc2Vjb25kIGRhdGEgc2V0IHRvIGJlIGRpc2NvdmVyZWQgYW5kIHRoZW4gdmVyaWZ5IHRoZSBudW1iZXIgb2YgZW50cmllcwotCQljb3B5KCI0Ljk5IiwgYmFzZUZvbGRlcjIsIGZvbGRlcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCQlhc3NlcnRFcXVhbHMoIjUuMCIsIDMsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiNS4xIiwgMywgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCi0JCS8vIHJlbW92ZSBzb21lIG9mIHRoZSBkYXRhIGFuZCB0aGVuIHZlcmlmeSB0aGUgY29udGVudHMKLQkJcmVtb3ZlQ29udGVudHMoYmFzZUZvbGRlciwgZm9sZGVyKTsKLQkJd2F0Y2hlci5wb2xsKCk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgMSwgd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCI2LjEiLCAxLCB3YXRjaGVyLmdldEFydGlmYWN0S2V5cygpLmxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IHdlIGNvbnZlcnQgYnVuZGxlcyB3aXRoIEVjbGlwc2UgMi54LXN0eWxlIHBsdWdpbi54bWwgZmlsZXMgaW50byAKLQkgKiBwcm9wZXIgT1NHaSBtYW5pZmVzdCBmaWxlcyBzbyB0aGUgYnVuZGxlIGNhbiBiZSBpbnN0YWxsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luWE1MQ29udmVyc2lvbigpIHsKLQkJLy8gdGVzdCBwbHVnaW4ueG1sIGluIGEgSkFSJ2QgYnVuZGxlCi0JCUZpbGUgb2xkQnVuZGxlSkFSID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUi5qYXIiKTsKLQkJLy8gdGVzdCBwbHVnaW4ueG1sIGluIGEgZGlyZWN0b3J5LWJhc2VkIGJ1bmRsZQotCQlGaWxlIG9sZEJ1bmRsZURpcmVjdG9yeSA9IGdldFRlc3REYXRhKCIwLjIiLCAiL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVEaXJlY3RvcnkiKTsKLQkJLy8gdGVzdCBwbHVnaW4ueG1sIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBbnQgTWFuaWZlc3QgZmlsZSBpbiBhIEpBUidkIGJ1bmRsZQotCQlGaWxlIG9sZEJ1bmRsZUpBUlR3byA9IGdldFRlc3REYXRhKCIwLjMiLCAiL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVKQVJUd28uamFyIik7Ci0JCS8vIHRlc3QgcGx1Z2luLnhtbCBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQW50IE1hbmlmZXN0IGZpbGUgaW4gYSBkaXJlY3RvcnktYmFzZWQgYnVuZGxlCi0JCUZpbGUgb2xkQnVuZGxlRGlyZWN0b3J5VHdvID0gZ2V0VGVzdERhdGEoIjAuNCIsICIvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3byIpOwotCi0JCS8vIGNvcHkgdGhlIHRlc3QgYnVuZGxlcyBvdmVyIHRvIHdoZXJlIHdlIHdpbGwgYmUgd2F0Y2hpbmcgaW4gdGhlIHJlcG8gbGlzdGVuZXIKLQkJRmlsZSBmb2xkZXIgPSBnZXRUZW1wRm9sZGVyKCk7Ci0JCXRvUmVtb3ZlLmFkZChmb2xkZXIpOwotCQljb3B5KCIxLjAiLCBvbGRCdW5kbGVKQVIsIG5ldyBGaWxlKGZvbGRlciwgb2xkQnVuZGxlSkFSLmdldE5hbWUoKSkpOwotCQljb3B5KCIxLjEiLCBvbGRCdW5kbGVKQVJUd28sIG5ldyBGaWxlKGZvbGRlciwgb2xkQnVuZGxlSkFSVHdvLmdldE5hbWUoKSkpOwotCQljb3B5KCIxLjIiLCBvbGRCdW5kbGVEaXJlY3RvcnksIG5ldyBGaWxlKGZvbGRlciwgb2xkQnVuZGxlRGlyZWN0b3J5LmdldE5hbWUoKSkpOwotCQljb3B5KCIxLjMiLCBvbGRCdW5kbGVEaXJlY3RvcnlUd28sIG5ldyBGaWxlKGZvbGRlciwgb2xkQnVuZGxlRGlyZWN0b3J5VHdvLmdldE5hbWUoKSkpOwotCi0JCS8vIFdlIHNob3VsZCBoYXZlIGFuIGVtcHR5IHJlcG9zaXRvcnkgYmVjYXVzZSB3ZSBoYXZlbid0IGRvbmUgYW55dGhpbmcgeWV0Ci0JCVRlc3RSZXBvc2l0b3J5V2F0Y2hlciB3YXRjaGVyID0gVGVzdFJlcG9zaXRvcnlXYXRjaGVyLmNyZWF0ZVdhdGNoZXIoZm9sZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAwLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDAsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQotCQl3YXRjaGVyLnBvbGwoKTsKLQkJLy8gdGhlIHJlcG8gc2hvdWxkIGhhdmUgYWRkZWQgYWxsIDQgYnVuZGxlcwotCQlhc3NlcnRFcXVhbHMoIjMuMCIsIDQsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMy4xIiwgNCwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvVGVzdFJlcG9zaXRvcnlXYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9UZXN0UmVwb3NpdG9yeVdhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5ZGE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9UZXN0UmVwb3NpdG9yeVdhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JRmlsZUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5V2F0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuUmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBIZWxwZXIgdGVzdCBjbGFzcyB3aGljaCB3cmFwcyBhIHJlcG9zaXRvcnkgbGlzdGVuZXIuCi0gKi8KLWNsYXNzIFRlc3RSZXBvc2l0b3J5V2F0Y2hlciBleHRlbmRzIERpcmVjdG9yeVdhdGNoZXIgewotCi0JcHJpdmF0ZSBSZXBvc2l0b3J5TGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKgotCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHRlc3QgZGlyZWN0b3J5IHdhdGNoZXIgY2xhc3Mgd2hpY2ggd2lsbCBsaXN0ZW4gb24gdGhlIGdpdmVuIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3RSZXBvc2l0b3J5V2F0Y2hlciBjcmVhdGVXYXRjaGVyKEZpbGUgZm9sZGVyKSB7Ci0JCVJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBSZXBvc2l0b3J5TGlzdGVuZXIoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdC5nZXRVbmlxdWVTdHJpbmcoKSk7Ci0JCURpY3Rpb25hcnkgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChEaXJlY3RvcnlXYXRjaGVyLkRJUiwgZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJcHJvcHMucHV0KERpcmVjdG9yeVdhdGNoZXIuUE9MTCwgIjUwMCIpOwotCQlUZXN0UmVwb3NpdG9yeVdhdGNoZXIgcmVzdWx0ID0gbmV3IFRlc3RSZXBvc2l0b3J5V2F0Y2hlcihwcm9wcywgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlyZXN1bHQuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIFRlc3RSZXBvc2l0b3J5V2F0Y2hlcihEaWN0aW9uYXJ5IHByb3BzLCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocHJvcHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlXYXRjaGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoUmVwb3NpdG9yeUxpc3RlbmVyIHJlcG9MaXN0ZW5lcikgewotCQlzdXBlci5hZGRMaXN0ZW5lcihyZXBvTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RlbmVyID0gcmVwb0xpc3RlbmVyOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB0aGUgSVVzIGtub3duIHRvIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5IHRoaXMgd2F0Y2hlcidzIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gZ2V0SW5zdGFsbGFibGVVbml0cygpIHsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIGxpc3RlbmVyLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFydGlmYWN0IGtleXMga25vd24gdG8gdGhpcyBsaXN0ZW5lcidzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpLmdldEFydGlmYWN0S2V5cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJ0aWZhY3Qga2V5LgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiAoKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBsaXN0ZW5lci5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSkuZ2V0QXJ0aWZhY3RGaWxlKGtleSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kb3dubG9hZC9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWUwNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kb3dubG9hZDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZG93bmxvYWQgbWFuYWdlciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb3dubG9hZE1hbmFnZXJUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kb3dubG9hZC9Eb3dubG9hZE1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMThlN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRvd25sb2FkOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuRG93bmxvYWRNYW5hZ2VyOwotCi0vKioKLSAqIFNpbXBsZSB0ZXN0cyBvZiB7QGxpbmsgRG93bmxvYWRNYW5hZ2VyfSBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3dubG9hZE1hbmFnZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRG93bmxvYWRNYW5hZ2VyVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgaW52b2NhdGlvbiBvZiBEb3dubG9hZE1hbmFnZXIgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvd25sb2FkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLQkJRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRG93bmxvYWRNYW5hZ2VyKCk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbWFuYWdlci5zdGFydChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcmVzdWx0LmlzT0soKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW1iZWRkZWRlcXVpbm94L0VtYmVkZGVkRXF1aW5veC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VtYmVkZGVkZXF1aW5veC9FbWJlZGRlZEVxdWlub3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmZmYxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW1iZWRkZWRlcXVpbm94L0VtYmVkZGVkRXF1aW5veC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW1iZWRkZWRlcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKgotICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoZSBidW5kbGUncyBjbGFzc2xvYWRlciBvbmx5IGhhcyBhY2Nlc3MgdG8gb3JnLm9zZ2kuZnJhbWV3b3JrCi0gKiBmcm9tIHRoZSBob3N0aW5nIGZyYW1ld29yay4gIEFueSBtb3JlIGFjY2VzcyBjb3VsZCByZXN1bHQgaW4gQ2xhc3NWZXJpZmllciBlcnJvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZEVxdWlub3ggewotCXByaXZhdGUgZmluYWwgTWFwIGZyYW1ld29ya1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBmcmFtZXdvcmtBcmdzOwotCXByaXZhdGUgQ2xhc3MgZWNsaXBzZVN0YXJ0ZXJDbGF6ejsKLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFVSTFtdIGZyYW1ld29ya0NsYXNzUGF0aDsKLQotCXB1YmxpYyBFbWJlZGRlZEVxdWlub3goTWFwIGZyYW1ld29ya1Byb3BlcnRpZXMsIFN0cmluZ1tdIGZyYW1ld29ya0FyZ3MsIFVSTFtdIGZyYW1ld29ya0NsYXNzUGF0aCkgewotCQl0aGlzLmZyYW1ld29ya1Byb3BlcnRpZXMgPSBmcmFtZXdvcmtQcm9wZXJ0aWVzOwotCQl0aGlzLmZyYW1ld29ya0FyZ3MgPSBmcmFtZXdvcmtBcmdzOwotCQl0aGlzLmZyYW1ld29ya0NsYXNzUGF0aCA9IGZyYW1ld29ya0NsYXNzUGF0aDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlQ29udGV4dCBzdGFydEZyYW1ld29yaygpIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJvc2dpLmZyYW1ld29yay51c2VTeXN0ZW1Qcm9wZXJ0aWVzIiwgImZhbHNlIik7Ci0JCXRyeSB7Ci0JCQlVUkxDbGFzc0xvYWRlciBmcmFtZXdvcmtMb2FkZXIgPSBuZXcgRnJhbWV3b3JrQ2xhc3NMb2FkZXIoZnJhbWV3b3JrQ2xhc3NQYXRoLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQllY2xpcHNlU3RhcnRlckNsYXp6ID0gZnJhbWV3b3JrTG9hZGVyLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXIiKTsKLQotCQkJTWV0aG9kIHNldEluaXRpYWxQcm9wZXJ0aWVzID0gZWNsaXBzZVN0YXJ0ZXJDbGF6ei5nZXRNZXRob2QoInNldEluaXRpYWxQcm9wZXJ0aWVzIiwgbmV3IENsYXNzW10ge01hcC5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRJbml0aWFsUHJvcGVydGllcy5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtmcmFtZXdvcmtQcm9wZXJ0aWVzfSk7Ci0KLQkJCU1ldGhvZCBydW5NZXRob2QgPSBlY2xpcHNlU3RhcnRlckNsYXp6LmdldE1ldGhvZCgic3RhcnR1cCIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzcywgUnVubmFibGUuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJY29udGV4dCA9IChCdW5kbGVDb250ZXh0KSBydW5NZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7ZnJhbWV3b3JrQXJncywgbnVsbH0pOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2Qgc2h1dGRvd25NZXRob2QgPSBlY2xpcHNlU3RhcnRlckNsYXp6LmdldE1ldGhvZCgic2h1dGRvd24iLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJc2h1dGRvd25NZXRob2QuaW52b2tlKG51bGwsIG51bGwpOwotCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHQ7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBGcmFtZXdvcmtDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQkJQ2xhc3NMb2FkZXIgZW1iZWRkZWRCdW5kbGVMb2FkZXI7Ci0KLQkJcHVibGljIEZyYW1ld29ya0NsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCkgewotCQkJc3VwZXIodXJscywgbnVsbCk7Ci0JCQl0aGlzLmVtYmVkZGVkQnVuZGxlTG9hZGVyID0gcGFyZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgib3JnLm9zZ2kuZnJhbWV3b3JrLiIpKQotCQkJCS8vIFRPRE8gdGhpcyBzaG91bGQgY2FsbCBmaW5kQ2xhc3M7IGJ1dCB0aGVuIGhhdmUgdG8gdXNlIHJlZmxlY3Rpb24hIQotCQkJCXJldHVybiBlbWJlZGRlZEJ1bmRsZUxvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZENsYXNzKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIm9yZy9vc2dpL2ZyYW1ld29yay8iKSkKLQkJCQkvLyBUT0RPIHRoaXMgc2hvdWxkIGNhbGwgZmluZFJlc291cmNlOyBidXQgdGhlbiBoYXZlIHRvIHVzZSByZWZsZWN0aW9uISEKLQkJCQlyZXR1cm4gZW1iZWRkZWRCdW5kbGVMb2FkZXIuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZFJlc291cmNlKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCJvcmcvb3NnaS9mcmFtZXdvcmsvIikpCi0JCQkJLy8gVE9ETyB0aGlzIHNob3VsZCBjYWxsIGZpbmRSZXNvdXJjZXM7IGJ1dCB0aGVuIGhhdmUgdG8gdXNlIHJlZmxlY3Rpb24hIQotCQkJCXJldHVybiBlbWJlZGRlZEJ1bmRsZUxvYWRlci5nZXRSZXNvdXJjZXMobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRkYjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBlbmdpbmUgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW5naW5lVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQaGFzZVNldFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGhhc2VUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2ZpbGVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2ZpbGVSZWdpc3RyeVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVG91Y2hwb2ludFRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL0VuZ2luZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvRW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzk2NGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvRW5naW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqIAotICogTm90ZToKLSAqIEN1cnJlbnRseSB5b3UgTVVTVCBoYXZlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIG1ldGFkYXRhIGZyb20gYSAzLjMuMSBpbnN0YWxsLgotICogVGhlcmUgYXJlIG9yZGVyaW5nIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRlc3RzIHRlbXBvcmFyaWx5IAotICovCi1wdWJsaWMgY2xhc3MgRW5naW5lVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIGVuZ2luZVJlZjsKLQlwcml2YXRlIElFbmdpbmUgZW5naW5lOwotCXByaXZhdGUgRmlsZSB0ZXN0UHJvdmlzaW9uaW5nOwotCi0JcHVibGljIEVuZ2luZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRlc3RQcm92aXNpb25pbmcgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJ0ZXN0UHJvdmlzaW9pbmluZyIpOwotCQlkZWxldGVEaXJlY3RvcnkodGVzdFByb3Zpc2lvbmluZyk7Ci0JCXRlc3RQcm92aXNpb25pbmcubWtkaXIoKTsKLQl9Ci0KLQlwdWJsaWMgRW5naW5lVGVzdCgpIHsKLQkJdGhpcygiIik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLQkJaWYgKGRpcmVjdG9yeS5leGlzdHMoKSAmJiBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlc1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaXJlY3RvcnkuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW5naW5lUmVmID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShJRW5naW5lLlNFUlZJQ0VfTkFNRSk7Ci0JCWVuZ2luZSA9IChJRW5naW5lKSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKGVuZ2luZVJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW5naW5lID0gbnVsbDsKLQkJVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkudW5nZXRTZXJ2aWNlKGVuZ2luZVJlZik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxQcm9maWxlKCkgewotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBudWxsOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBEZWZhdWx0UGhhc2VTZXQoKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7fTsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBoYXNlU2V0KCkgewotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0Iik7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbnVsbDsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7fTsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE9wZXJhbmRzKCkgewotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0Iik7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBudWxsOwotCQl0cnkgewotCQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlPcGVyYW5kcygpIHsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdCIpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBEZWZhdWx0UGhhc2VTZXQoKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7fTsKLQkJSVN0YXR1cyByZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVBoYXNlU2V0KCkgewotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0RW1wdHlQaGFzZVNldCIpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBQaGFzZVNldChuZXcgUGhhc2VbXSB7fSkgewotCQkJLy8gZW1wdHkgUGhhc2VTZXQKLQkJfTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGNyZWF0ZVJlc29sdmVkSVUoY3JlYXRlSVUoIm5hbWUiKSksIG51bGwpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtvcH07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNPSygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybVNpbmdsZU51bGxPcGVyYW5kKCkgewotCQl0cnkgewotCQkJbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgbnVsbCk7Ci0JCQlmYWlsKCJTaG91bGQgbm90IGFsbG93IG51bGwgb3BlcmFuZCIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtSW5zdGFsbE9TR2lGcmFtZXdvcmsoKSB7Ci0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgdGVzdFByb3Zpc2lvbmluZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RQZXJmb3JtSW5zdGFsbE9TR2lGcmFtZXdvcmsiLCBudWxsLCBwcm9wZXJ0aWVzKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZSk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQkJSUluc3RhbGxhYmxlVW5pdCBkb29tZWQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7bmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQoY3JlYXRlUmVzb2x2ZWRJVShkb29tZWQpLCBudWxsKX07Ci0JCQllbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCi0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKG51bGwsIGNyZWF0ZU9TR2lJVSgpKX07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNPSygpKTsKLQkJSXRlcmF0b3IgaXVzID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsKLQkJYXNzZXJ0VHJ1ZShpdXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybVVwZGF0ZU9TR2lGcmFtZXdvcmsoKSB7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCB0ZXN0UHJvdmlzaW9uaW5nLmdldEFic29sdXRlUGF0aCgpKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RQZXJmb3JtVXBkYXRlT1NHaUZyYW1ld29yayIsIG51bGwsIHByb3BlcnRpZXMpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBEZWZhdWx0UGhhc2VTZXQoKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7bmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQoY3JlYXRlT1NHaUlVKCksIGNyZWF0ZU9TR2lJVSgpKX07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNPSygpKTsKLQkJSXRlcmF0b3IgaXVzID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsKLQkJYXNzZXJ0VHJ1ZShpdXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybVVuaW5zdGFsbE9TR2lGcmFtZXdvcmsoKSB7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCB0ZXN0UHJvdmlzaW9uaW5nLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdFBlcmZvcm1Vbmluc3RhbGxPU0dpRnJhbWV3b3JrIiwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChjcmVhdGVPU0dpSVUoKSwgbnVsbCl9OwotCQlJU3RhdHVzIHJlc3VsdCA9IGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmlzT0soKSk7Ci0JCWFzc2VydEVtcHR5UHJvZmlsZShwcm9maWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybVJvbGxiYWNrKCkgewotCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgdGVzdFByb3Zpc2lvbmluZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0UGVyZm9ybVJvbGxiYWNrIiwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCi0JCUl0ZXJhdG9yIGl1cyA9IGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGl1cy5oYXNOZXh0KCkpOwotCi0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKG51bGwsIGNyZWF0ZU9TR2lJVSgpKSwgbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgY3JlYXRlQmFkSVUoKSl9OwotCQlJU3RhdHVzIHJlc3VsdCA9IGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc3VsdC5pc09LKCkpOwotCQlpdXMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpOwotCQkvL1RPRE8gQ3VycmVudGx5IHRoaXMgdGVzdCBpcyBmYWlsaW5nLiBTZWUgYnVnIDIxMjA1OAotCQkvLwkJYXNzZXJ0RmFsc2UoaXVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZU9TR2lJVSgpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldElkKCJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JCWRlc2NyaXB0aW9uLnNldFZlcnNpb24obmV3IFZlcnNpb24oIjMuMy4xLlIzM3hfdjIwMDcwODI4IikpOwotCQlkZXNjcmlwdGlvbi5zZXRUb3VjaHBvaW50VHlwZShBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuVE9VQ0hQT0lOVF9PU0dJKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG1hbmlmZXN0ID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxyXG4iICsgIkJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLmNvcmUuU3lzdGVtQnVuZGxcclxuIiArICIgZUFjdGl2YXRvclxyXG4iICsgIkJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCxPU0dpL01pbmltdW0tMS4wXHJcbiIgKyAiRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kuZXZlbnQ7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuXHJcbiIgKyAiIGZyYW1ld29yay5jb25zb2xlO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5ldmVudG1ncjt2XHJcbiIgKyAiIGVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxvZzt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2VcclxuIiArICIgLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJcclxuIiArICIgdWc7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudDt2ZXJzaW9uPVwiMS4wXCIsb1xyXG4iICsgIiByZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5sb2NhbGl6YXRpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc1xyXG4iICsgIiBlcnZpY2UucGx1Z2luY29udmVyc2lvbjt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdlxyXG4iCi0JCQkJKyAiIGVyO3ZlcnNpb249XCIxLjFcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucnVubmFibGU7dmVyc2lvbj1cIjEuMFwiLG9yZy5cclxuIiArICIgZWNsaXBzZS5vc2dpLnNlcnZpY2UudXJsY29udmVyc2lvbjt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5zdG9cclxuIiArICIgcmFnZW1hbmFnZXI7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPVwiMS4wXCIsb3JnLm9zZ1xyXG4iICsgIiBpLmZyYW1ld29yazt2ZXJzaW9uPVwiMS4zXCIsb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluO3ZlcnNpb249XCIxLjBcclxuIiArICIgXCIsb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj1cIjEuMlwiLG9yZy5vc2dpLnNlcnZpY2UucGVybWlzXHJcbiIgKyAiIHNpb25hZG1pbjt2ZXJzaW9uPVwiMS4yXCIsb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsO3ZlcnNpb249XCIxLjBcIixvcmdcclxuIiArICIgLm9zZ2kuc2VydmljZS51cmw7dmVyc2lvbj1cIjEuMFwiLG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPVwiMS4zLjJcIlxyXG4iICsgIiAsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3I7eC1mcmllbmRzOj1cIm9yZy5lY2xpcHNlLmNvcmUucnVudGltXHJcbiIgKyAiIGVcIixvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xcclxuIgotCQkJCSsgIiBpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5zdGF0czt4LWZyaWVuZHM6PVwib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lXHJcbiIgKyAiIFwiLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmJhc2VcclxuIiArICIgYWRhcHRvci5idW5kbGVmaWxlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5iYXNlYWRhcHRvci5ob29rXHJcbiIgKyAiIHM7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yLmxvYWRlcjt4LWludGVybmFsOj10clxyXG4iICsgIiB1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5hZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NcclxuIiArICIgZ2kuZnJhbWV3b3JrLmRlYnVnO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuXHJcbiIgKyAiIGFsLmNvcmU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbFxyXG4iICsgIiA7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5idW5kbGVcclxuIiArICIgZW50cnk7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5iXHJcbiIKLQkJCQkrICIgdW5kbGVyZXNvdXJjZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLnByXHJcbiIgKyAiIG90b2NvbC5yZWZlcmVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbFxyXG4iICsgIiAucmVsaWFibGVmaWxlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubGF1bmNoZXI7eC1cclxuIiArICIgaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsudXRpbDt4LWludGVybmFsOj10cnVlLG9yZy5lXHJcbiIgKyAiIGNsaXBzZS5vc2dpLmludGVybmFsLmJhc2VhZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pblxyXG4iICsgIiB0ZXJuYWwubW9kdWxlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5wcm9maWxlO3gtaW5cclxuIiArICIgdGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucmVzb2x2ZXI7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuXHJcbiIgKyAiIGVjbGlwc2Uub3NnaS5pbnRlcm5hbC52ZXJpZmllcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW50ZVxyXG4iICsgIiBybmFsLnByb3Zpc2lvbmFsLnZlcmlmaWVyO3gtZnJpZW5kczo9XCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSxvcmcuZWNsXHJcbiIgKyAiIGlwc2UudWkud29ya2JlbmNoXCJcclxuIiArICJCdW5kbGUtVmVyc2lvbjogMy4zLjAudjIwMDYwOTI1XHJcbiIKLQkJCQkrICJFY2xpcHNlLVN5c3RlbUJ1bmRsZTogdHJ1ZVxyXG4iICsgIkJ1bmRsZS1Db3B5cmlnaHQ6ICVjb3B5cmlnaHRcclxuIiArICJCdW5kbGUtTmFtZTogJXN5c3RlbUJ1bmRsZVxyXG4iICsgIkJ1bmRsZS1EZXNjcmlwdGlvbjogJXN5c3RlbUJ1bmRsZVxyXG4iICsgIkJ1bmRsZS1Eb2NVcmw6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmdcclxuIiArICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyXHJcbiIgKyAiRXhwb3J0LVNlcnZpY2U6IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbixvcmcub3NnaS5zZVxyXG4iICsgIiBydmljZS5wZXJtaXNzaW9uYWRtaW4uUGVybWlzc2lvbkFkbWluLG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFcclxuIiArICIgcnRMZXZlbCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zXHJcbiIgKyAiQnVuZGxlLVZlbmRvcjogJWVjbGlwc2Uub3JnXHJcbiIgKyAiTWFpbi1DbGFzczogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXJcclxuIiArICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5vc2dpOyBzaW5nbGV0b246PXRydWVcclxuIiArICJCdW5kbGUtTG9jYWxpemF0aW9uOiBzeXN0ZW1idW5kbGVcclxuIiArICJFY2xpcHNlLUV4dGVuc2libGVBUEk6IHRydWVcclxuIiArICJcclxuIiArICIiOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoIm1hbmlmZXN0IiwgbWFuaWZlc3QpOwotCQkvL3RvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsICJpbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0JCS8vdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAidW5pbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gY3VzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFsxXTsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBkZXNjID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJZGVzYy5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGZyYWdtZW50ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KGRlc2MpOwotCQljdXNbMF0gPSBmcmFnbWVudDsKLQotCQkvL0lBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImVjbGlwc2UiLCAicGx1Z2luIiwgIm9yZy5lY2xpcHNlLm9zZ2kiLCBuZXcgVmVyc2lvbigiMy4zLjEuUjMzeF92MjAwNzA4MjgiKSk7Ci0JCS8vaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlc29sdmVkSW5zdGFsbGFibGVVbml0KGl1LCBjdXMpOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCYWRJVSgpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldElkKCJvcmcuZWNsaXBzZS5vc2dpLmJhZCIpOwotCQlkZXNjcmlwdGlvbi5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKCIzLjMuMS5SMzN4X3YyMDA3MDgyOCIpKTsKLQkJZGVzY3JpcHRpb24uc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBtYW5pZmVzdCA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcclxuIiArICJCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLlN5c3RlbUJ1bmRsXHJcbiIgKyAiIGVBY3RpdmF0b3JcclxuIiArICJCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsT1NHaS9NaW5pbXVtLTEuMFxyXG4iICsgIkV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLmV2ZW50O3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLlxyXG4iICsgIiBmcmFtZXdvcmsuY29uc29sZTt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3I7dlxyXG4iICsgIiBlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2c7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlXHJcbiIgKyAiIC5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGViXHJcbiIgKyAiIHVnO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj1cIjEuMFwiLG9cclxuIiArICIgcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UubG9jYWxpemF0aW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNcclxuIiArICIgZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZcclxuIgotCQkJCSsgIiBlcjt2ZXJzaW9uPVwiMS4xXCIsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJ1bm5hYmxlO3ZlcnNpb249XCIxLjBcIixvcmcuXHJcbiIgKyAiIGVjbGlwc2Uub3NnaS5zZXJ2aWNlLnVybGNvbnZlcnNpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc3RvXHJcbiIgKyAiIHJhZ2VtYW5hZ2VyO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj1cIjEuMFwiLG9yZy5vc2dcclxuIiArICIgaS5mcmFtZXdvcms7dmVyc2lvbj1cIjEuM1wiLG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbjt2ZXJzaW9uPVwiMS4wXHJcbiIgKyAiIFwiLG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluO3ZlcnNpb249XCIxLjJcIixvcmcub3NnaS5zZXJ2aWNlLnBlcm1pc1xyXG4iICsgIiBzaW9uYWRtaW47dmVyc2lvbj1cIjEuMlwiLG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPVwiMS4wXCIsb3JnXHJcbiIgKyAiIC5vc2dpLnNlcnZpY2UudXJsO3ZlcnNpb249XCIxLjBcIixvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj1cIjEuMy4yXCJcclxuIiArICIgLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yO3gtZnJpZW5kczo9XCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbVxyXG4iICsgIiBlXCIsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsXHJcbiIKLQkJCQkrICIgaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuc3RhdHM7eC1mcmllbmRzOj1cIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZVxyXG4iICsgIiBcIixvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5iYXNlXHJcbiIgKyAiIGFkYXB0b3IuYnVuZGxlZmlsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IuaG9va1xyXG4iICsgIiBzO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5iYXNlYWRhcHRvci5sb2FkZXI7eC1pbnRlcm5hbDo9dHJcclxuIiArICIgdWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zXHJcbiIgKyAiIGdpLmZyYW1ld29yay5kZWJ1Zzt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVyblxyXG4iICsgIiBhbC5jb3JlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2xcclxuIiArICIgO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2wuYnVuZGxlXHJcbiIgKyAiIGVudHJ5O3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2wuYlxyXG4iCi0JCQkJKyAiIHVuZGxlcmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wclxyXG4iICsgIiBvdG9jb2wucmVmZXJlbmNlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWxcclxuIiArICIgLnJlbGlhYmxlZmlsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxhdW5jaGVyO3gtXHJcbiIgKyAiIGludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZVxyXG4iICsgIiBjbGlwc2Uub3NnaS5pbnRlcm5hbC5iYXNlYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW5cclxuIiArICIgdGVybmFsLm1vZHVsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucHJvZmlsZTt4LWluXHJcbiIgKyAiIHRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnJlc29sdmVyO3gtaW50ZXJuYWw6PXRydWUsb3JnLlxyXG4iICsgIiBlY2xpcHNlLm9zZ2kuaW50ZXJuYWwudmVyaWZpZXI7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVcclxuIiArICIgcm5hbC5wcm92aXNpb25hbC52ZXJpZmllcjt4LWZyaWVuZHM6PVwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUsb3JnLmVjbFxyXG4iICsgIiBpcHNlLnVpLndvcmtiZW5jaFwiXHJcbiIgKyAiQnVuZGxlLVZlcnNpb246IDMuMy4wLnYyMDA2MDkyNVxyXG4iCi0JCQkJKyAiRWNsaXBzZS1TeXN0ZW1CdW5kbGU6IHRydWVcclxuIiArICJCdW5kbGUtQ29weXJpZ2h0OiAlY29weXJpZ2h0XHJcbiIgKyAiQnVuZGxlLU5hbWU6ICVzeXN0ZW1CdW5kbGVcclxuIiArICJCdW5kbGUtRGVzY3JpcHRpb246ICVzeXN0ZW1CdW5kbGVcclxuIiArICJCdW5kbGUtRG9jVXJsOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnXHJcbiIgKyAiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMlxyXG4iICsgIkV4cG9ydC1TZXJ2aWNlOiBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW4sb3JnLm9zZ2kuc2VcclxuIiArICIgcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25BZG1pbixvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhXHJcbiIgKyAiIHJ0TGV2ZWwsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc1xyXG4iICsgIkJ1bmRsZS1WZW5kb3I6ICVlY2xpcHNlLm9yZ1xyXG4iICsgIk1haW4tQ2xhc3M6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLkVjbGlwc2VTdGFydGVyXHJcbiIgKyAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NnaTsgc2luZ2xldG9uOj10cnVlXHJcbiIgKyAiQnVuZGxlLUxvY2FsaXphdGlvbjogc3lzdGVtYnVuZGxlXHJcbiIgKyAiRWNsaXBzZS1FeHRlbnNpYmxlQVBJOiB0cnVlXHJcbiIgKyAiXHJcbiIgKyAiIjsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJtYW5pZmVzdCIsIG1hbmlmZXN0KTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgIkJBRCIpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGN1cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbMV07Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gZGVzYyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWRlc2MuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCWN1c1swXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChkZXNjKTsKLQotCQkvL0lBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImVjbGlwc2UiLCAicGx1Z2luIiwgIm9yZy5lY2xpcHNlLm9zZ2kiLCBuZXcgVmVyc2lvbigiMy4zLjEuUjMzeF92MjAwNzA4MjgiKSk7Ci0JCS8vaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlc29sdmVkSW5zdGFsbGFibGVVbml0KGl1LCBjdXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9QaGFzZVNldFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Zjc4NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9QaGFzZVNldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLS8qKgotICogU2ltcGxlIHRlc3Qgb2YgdGhlIGVuZ2luZSBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZVNldFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXB1YmxpYyBQaGFzZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIFBoYXNlU2V0VGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsUGhhc2VzKCkgewotCQl0cnkgewotCQkJbmV3IFBoYXNlU2V0KG51bGwpIHsKLQkJCQkvLyBlbXB0eSBQaGFzZVNldAotCQkJfTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4ZXBjdGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVBoYXNlcygpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlBoYXNlU2V0VGVzdCIpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBQaGFzZVNldChuZXcgUGhhc2VbXSB7fSkgewotCQkJLy8gZW1wdHkgUGhhc2VTZXQKLQkJfTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGNyZWF0ZVJlc29sdmVkSVUoY3JlYXRlSVUoIml1IikpLCBudWxsKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7b3B9OwotCi0JCVByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gcGhhc2VTZXQucGVyZm9ybShuZXcgRW5naW5lU2Vzc2lvbihwcm9maWxlLCBjb250ZXh0KSwgcHJvZmlsZSwgb3BlcmFuZHMsIGNvbnRleHQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1BoYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJkMmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLS8qKgotICogU2ltcGxlIHRlc3Qgb2YgdGhlIGVuZ2luZSBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFBoYXNlU2V0IGV4dGVuZHMgUGhhc2VTZXQgewotCi0JCXB1YmxpYyBUZXN0UGhhc2VTZXQoKSB7Ci0JCQlzdXBlcihuZXcgUGhhc2VbXSB7bmV3IFRlc3RQaGFzZSgpfSk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdFBoYXNlU2V0KFBoYXNlIHBoYXNlKSB7Ci0JCQlzdXBlcihuZXcgUGhhc2VbXSB7cGhhc2V9KTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0UGhhc2VTZXQoUGhhc2VbXSBwaGFzZXMpIHsKLQkJCXN1cGVyKHBoYXNlcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQaGFzZSBleHRlbmRzIEluc3RhbGxhYmxlVW5pdFBoYXNlIHsKLQotCQlib29sZWFuIGNvbXBsZXRlT3BlcmFuZDsKLQkJYm9vbGVhbiBnZXRBY3Rpb247Ci0JCWJvb2xlYW4gaW5pdGlhbGl6ZU9wZXJhbmQ7Ci0JCWJvb2xlYW4gY29tcGxldGVQaGFzZTsKLQkJYm9vbGVhbiBpbml0aWFsaXplUGhhc2U7Ci0KLQkJcHJvdGVjdGVkIFRlc3RQaGFzZSgpIHsKLQkJCXN1cGVyKCJ0ZXN0IiwgMSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgVGVzdFBoYXNlKFN0cmluZyBwaGFzZUlkLCBpbnQgd2VpZ2h0KSB7Ci0JCQlzdXBlcihwaGFzZUlkLCB3ZWlnaHQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJY29tcGxldGVPcGVyYW5kID0gdHJ1ZTsKLQkJCXJldHVybiBzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWluaXRpYWxpemVPcGVyYW5kID0gdHJ1ZTsKLQkJCXJldHVybiBzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBvcGVyYW5kLCBwYXJhbWV0ZXJzLCBtb25pdG9yKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlSW5zdGFsbGFibGVVbml0UGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQkJY29tcGxldGVQaGFzZSA9IHRydWU7Ci0JCQlyZXR1cm4gc3VwZXIuY29tcGxldGVJbnN0YWxsYWJsZVVuaXRQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVJbnN0YWxsYWJsZVVuaXRQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlpbml0aWFsaXplUGhhc2UgPSB0cnVlOwotCQkJcmV0dXJuIHN1cGVyLmluaXRpYWxpemVJbnN0YWxsYWJsZVVuaXRQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgZW5naW5lUmVmOwotCXByaXZhdGUgSUVuZ2luZSBlbmdpbmU7Ci0KLQlwdWJsaWMgUGhhc2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBQaGFzZVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmVSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJZW5naW5lID0gKElFbmdpbmUpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllbmdpbmUgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBoYXNlSWQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgVGVzdFBoYXNlKG51bGwsIDEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UGhhc2VJZCgpIHsKLQkJdHJ5IHsKLQkJCW5ldyBUZXN0UGhhc2UoIiIsIDEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlV2VpZ2h0KCkgewotCQl0cnkgewotCQkJbmV3IFRlc3RQaGFzZSgieHl6IiwgLTEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9XZWlnaHQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgVGVzdFBoYXNlKCJ4eXoiLCAwKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtKCkgewotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQoKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlBoYXNlVGVzdCIpOwotCi0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFswXSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZVBoYXNlKCkgewotCQlUZXN0UGhhc2UgcGhhc2UgPSBuZXcgVGVzdFBoYXNlKCkgewotCQkJcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQlhc3NlcnRGYWxzZShpbml0aWFsaXplUGhhc2UpOwotCQkJCWFzc2VydEZhbHNlKGNvbXBsZXRlUGhhc2UpOwotCQkJCXN1cGVyLmluaXRpYWxpemVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJCQlhc3NlcnRUcnVlKGluaXRpYWxpemVQaGFzZSk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVQaGFzZSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQkJCWFzc2VydFRydWUoaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCQlhc3NlcnRGYWxzZShjb21wbGV0ZVBoYXNlKTsKLQkJCQlzdXBlci5jb21wbGV0ZVBoYXNlKG1vbml0b3IsIHByb2ZpbGUsIHBhcmFtZXRlcnMpOwotCQkJCWFzc2VydFRydWUoaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCQlhc3NlcnRUcnVlKGNvbXBsZXRlUGhhc2UpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQocGhhc2UpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiUGhhc2VUZXN0Iik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGNyZWF0ZUlVKCJ1bml0Iik7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCB1bml0KX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHBoYXNlLmluaXRpYWxpemVQaGFzZSk7Ci0JCWFzc2VydFRydWUocGhhc2UuY29tcGxldGVQaGFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZU9wZXJhbmQoKSB7Ci0JCVRlc3RQaGFzZSBwaGFzZSA9IG5ldyBUZXN0UGhhc2UoKSB7Ci0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgT3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVPcGVyYW5kKTsKLQkJCQlzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0JCQkJYXNzZXJ0VHJ1ZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0VHJ1ZShjb21wbGV0ZU9wZXJhbmQpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlhc3NlcnRGYWxzZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVPcGVyYW5kKTsKLQkJCQlzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBvcGVyYW5kLCBwYXJhbWV0ZXJzLCBtb25pdG9yKTsKLQkJCQlhc3NlcnRUcnVlKGluaXRpYWxpemVPcGVyYW5kKTsKLQkJCQlhc3NlcnRGYWxzZShjb21wbGV0ZU9wZXJhbmQpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQocGhhc2UpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiUGhhc2VUZXN0Iik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGNyZWF0ZUlVKCJ0ZXN0SW5pdENvbXBsZXRlT3BlcmFuZCIpOwotCi0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCB1bml0KX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHBoYXNlLmluaXRpYWxpemVPcGVyYW5kKTsKLQkJYXNzZXJ0VHJ1ZShwaGFzZS5jb21wbGV0ZU9wZXJhbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVJlZ2lzdHJ5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Qcm9maWxlUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGU4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Qcm9maWxlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX05BTUUgPSAiUHJvZmlsZVJlZ2lzdHJ5VGVzdC5wcm9maWxlIjsKLQlwcml2YXRlIElQcm9maWxlUmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIHJlZ2lzdHJ5UmVmOwotCi0JcHVibGljIFByb2ZpbGVSZWdpc3RyeVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgUHJvZmlsZVJlZ2lzdHJ5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRTZXJ2aWNlcygpIHsKLQkJcmVnaXN0cnlSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWdpc3RyeVJlZik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RhcnQoKSB7Ci0JCXRyeSB7Ci0JCQl1bmdldFNlcnZpY2VzKCk7Ci0JCQlUZXN0QWN0aXZhdG9yLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIpLnN0b3AoKTsKLQkJCVRlc3RBY3RpdmF0b3IuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIikuc3RhcnQoKTsKLQkJCWdldFNlcnZpY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0U2VydmljZXMoKTsKLQkJLy9lbnN1cmUgd2Ugc3RhcnQgaW4gYSBjbGVhbiBzdGF0ZQotCQlyZWdpc3RyeS5yZW1vdmVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdW5nZXRTZXJ2aWNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9maWxlKCkgewotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmdldFByb2ZpbGUoUFJPRklMRV9OQU1FKSk7Ci0JCUlQcm9maWxlIHRlc3QgPSBjcmVhdGVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyh0ZXN0LmdldFByb2ZpbGVJZCgpLCByZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSkuZ2V0UHJvZmlsZUlkKCkpOwotCQlyZWdpc3RyeS5yZW1vdmVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyaXN0ZW5jZSgpIHsKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSkpOwotCQlJUHJvZmlsZSB0ZXN0ID0gY3JlYXRlUHJvZmlsZShQUk9GSUxFX05BTUUpOwotCQlhc3NlcnRFcXVhbHModGVzdC5nZXRQcm9maWxlSWQoKSwgcmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpLmdldFByb2ZpbGVJZCgpKTsKLQotCQlyZXN0YXJ0KCk7Ci0JCXRlc3QgPSByZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwodGVzdCk7Ci0JCXJlZ2lzdHJ5LnJlbW92ZVByb2ZpbGUoUFJPRklMRV9OQU1FKTsKLQotCQlyZXN0YXJ0KCk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5nZXRTZXJ2aWNlcygpIHsKLQkJcmVnaXN0cnkgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVnaXN0cnlSZWYpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5YTgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1Byb2ZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyBQcm9maWxlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUHJvZmlsZVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFByb2ZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQljcmVhdGVQcm9maWxlKG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UHJvZmlsZSgpIHsKLQkJdHJ5IHsKLQkJCWNyZWF0ZVByb2ZpbGUoIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFByb2ZpbGVTdHJ1Y3R1cmUoKSB7Ci0JCUlQcm9maWxlIHBhcmVudCA9IGNyZWF0ZVByb2ZpbGUoInBhcmVudCIpOwotCQlJUHJvZmlsZSBjaGlsZCA9IGNyZWF0ZVByb2ZpbGUoImNoaWxkIiwgInBhcmVudCIpOwotCQlwYXJlbnQgPSBnZXRQcm9maWxlKCJwYXJlbnQiKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50bGVzcyBwcm9maWxlIHNob3VsZCBiZSBhIHJvb3QuIiwgcGFyZW50LmlzUm9vdFByb2ZpbGUoKSk7Ci0JCWFzc2VydEZhbHNlKCJDaGlsZCBwcm9maWxlIHNob3VsZCBub3QgYmUgYSByb290LiIsIGNoaWxkLmlzUm9vdFByb2ZpbGUoKSk7Ci0JCWFzc2VydFRydWUoIlBhcmVudCBzaG91bGQgYmUgcGFyZW50IG9mIGNoaWxkIiwgY2hpbGQuZ2V0UGFyZW50UHJvZmlsZSgpLmdldFByb2ZpbGVJZCgpLmVxdWFscyhwYXJlbnQuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50IHNob3VsZCBoYXZlIG9uZSBjaGlsZC4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2hpbGQgc2hvdWxkIGhhdmUgbm8gY2hpbGRyZW4uIiwgY2hpbGQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAwKTsKLQotCQlJUHJvZmlsZSBncmFuZGNoaWxkID0gY3JlYXRlUHJvZmlsZSgiZ3JhbmQiLCAiY2hpbGQiKTsKLQkJY2hpbGQgPSBnZXRQcm9maWxlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSgiR3JhbmRjaGlsZCBwcm9maWxlIHNob3VsZCBub3QgYmUgYSByb290LiIsIGdyYW5kY2hpbGQuaXNSb290UHJvZmlsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50IHNob3VsZCBoYXZlIG9uZSBjaGlsZC4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2hpbGQgc2hvdWxkIGhhdmUgb25lIGNoaWxkLiIsIGNoaWxkLmdldFN1YlByb2ZpbGVJZHMoKS5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIkdyYW5kcGFyZW50IG9mIGdyYW5kY2hpbGQgc2hvdWxkIGJlIHBhcmVudCBvZiBjaGlsZC4iLCBncmFuZGNoaWxkLmdldFBhcmVudFByb2ZpbGUoKS5nZXRQYXJlbnRQcm9maWxlKCkuZ2V0UHJvZmlsZUlkKCkuZXF1YWxzKHBhcmVudC5nZXRQcm9maWxlSWQoKSkpOwotCX0KLQotCS8qCVRoZSB0ZXN0IHByb2ZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBwcm9wZXJ0aWVzIHdoZXJlCi0JICogIAlpZHt4LHl9ICBpbmRpY2F0ZXMgYSBwcm9maWxlIHdpdGggaWQgImlkIiBhbmQgcHJvcGVydGllcyBkZWZpbmVkCi0JICoJCQkJIHdpdGgga2V5cyAieCIgYW5kICJ5IgotCSAqCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZGNoaWxkMDB7Zm9vfQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotCSAqICAgICAgICAgICAgICAgICAgICAgIGNoaWxkMHtmb299IHwgLS0tIGdyYW5kY2hpbGQwMXt9Ci0JICogICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgIFwKLQkgKgkJCQkJICAvICAgICAgICAgICAgICAgXAotCSAqICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgIGdyYW5kY2hpbGQwMXtiYXJ9Ci0JICoJcGFyZW50e2ZvbyxiYXJ9IHwJCQkJICAgCi0JICogICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgIGdyYW5kY2hpbGQxMHtmb299Ci0JICogICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgLwotCSAqICAgICAgICAgICAgICAgICAgICAgY2hpbGQxe30gfAotCSAqCQkJCQkJCQkgXAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZGNoaWxkMTF7fQotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcmVudElkID0gInBhcmVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoaWxkMElkID0gImNoaWxkMCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyYW5kY2hpbGQwMElkID0gImdyYW5kMDAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBncmFuZGNoaWxkMDFJZCA9ICJncmFuZDAxIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAySWQgPSAiZ3JhbmQwMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoaWxkMUlkID0gImNoaWxkMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyYW5kY2hpbGQxMElkID0gImdyYW5kMTAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBncmFuZGNoaWxkMTFJZCA9ICJncmFuZDExIjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBrZXkgPSAib3JnLmVjbGlwc2UucDIuZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyZW50VmFsdWUgPSAicGFyZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hpbGQwVmFsdWUgPSAiY2hpbGQwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAwVmFsdWUgPSAiZ3JhbmRjaGlsZDAwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAyVmFsdWUgPSAiZ3JhbmRjaGlsZDAyIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDEwVmFsdWUgPSAiZ3JhbmRjaGlsZDEwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3RoZXJLZXkgPSAib3JnLmVjbGlwc2UucDIuYmFyIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3RoZXJWYWx1ZSA9ICJvdGhlciI7Ci0KLQkvLyBDcmVhdGUgdGhlIHByb2ZpbGVzIGFuZCB0ZXN0IGdldCBhZnRlciBzZXQKLQkvLyBmb3IgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzLgotCXByaXZhdGUgSVByb2ZpbGVbXSBjcmVhdGVUZXN0UHJvZmlsZXMoKSB7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgcGFyZW50VmFsdWUpOwotCQlwcm9wZXJ0aWVzLnB1dChvdGhlcktleSwgb3RoZXJWYWx1ZSk7Ci0JCUlQcm9maWxlIHBhcmVudCA9IGNyZWF0ZVByb2ZpbGUocGFyZW50SWQsIG51bGwsIHByb3BlcnRpZXMpOwotCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKHBhcmVudC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMocGFyZW50LmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgY2hpbGQwVmFsdWUpOwotCQlJUHJvZmlsZSBjaGlsZDAgPSBjcmVhdGVQcm9maWxlKGNoaWxkMElkLCBwYXJlbnRJZCwgcHJvcGVydGllcyk7Ci0JCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZDBWYWx1ZS5lcXVhbHMoY2hpbGQwLmdldFByb3BlcnR5KGtleSkpKTsKLQotCQlJUHJvZmlsZSBjaGlsZDEgPSBjcmVhdGVQcm9maWxlKGNoaWxkMUlkLCBwYXJlbnRJZCwgcHJvcGVydGllcyk7Ci0JCS8vIG5vIHZhbHVlIGluIGNoaWxkMQotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgZ3JhbmRjaGlsZDAwVmFsdWUpOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDAgPSBjcmVhdGVQcm9maWxlKGdyYW5kY2hpbGQwMElkLCBjaGlsZDBJZCwgcHJvcGVydGllcyk7Ci0JCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMDBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAwLmdldFByb3BlcnR5KGtleSkpKTsKLQotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDEgPSBjcmVhdGVQcm9maWxlKGdyYW5kY2hpbGQwMUlkLCBjaGlsZDBJZCk7Ci0JCS8vIG5vIHZhbHVlIGluIGdyYW5kY2hpbGQwMQotCi0JCXByb3BlcnRpZXMucHV0KG90aGVyS2V5LCBncmFuZGNoaWxkMDJWYWx1ZSk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMiA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDAySWQsIGNoaWxkMElkLCBwcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllcy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMlZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJcHJvcGVydGllcy5wdXQoa2V5LCBncmFuZGNoaWxkMTBWYWx1ZSk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMCA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDEwSWQsIGNoaWxkMUlkLCBwcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllcy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQxMFZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTAuZ2V0UHJvcGVydHkoa2V5KSkpOwotCi0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMSA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDExSWQsIGNoaWxkMUlkKTsKLQkJLy8gbm8gdmFsdWUgaW4gZ3JhbmRjaGlsZDExCi0KLQkJcGFyZW50ID0gZ2V0UHJvZmlsZShwYXJlbnRJZCk7Ci0JCWNoaWxkMCA9IGdldFByb2ZpbGUoY2hpbGQwSWQpOwotCQljaGlsZDEgPSBnZXRQcm9maWxlKGNoaWxkMUlkKTsKLQkJZ3JhbmRjaGlsZDAwID0gZ2V0UHJvZmlsZShncmFuZGNoaWxkMDBJZCk7Ci0JCWdyYW5kY2hpbGQwMSA9IGdldFByb2ZpbGUoZ3JhbmRjaGlsZDAxSWQpOwotCQlncmFuZGNoaWxkMDIgPSBnZXRQcm9maWxlKGdyYW5kY2hpbGQwMklkKTsKLQkJZ3JhbmRjaGlsZDEwID0gZ2V0UHJvZmlsZShncmFuZGNoaWxkMTBJZCk7Ci0JCWdyYW5kY2hpbGQxMSA9IGdldFByb2ZpbGUoZ3JhbmRjaGlsZDExSWQpOwotCi0JCUlQcm9maWxlW10gcHJvZmlsZXMgPSB7cGFyZW50LCBjaGlsZDAsIGNoaWxkMSwgZ3JhbmRjaGlsZDAwLCBncmFuZGNoaWxkMDEsIGdyYW5kY2hpbGQwMiwgZ3JhbmRjaGlsZDEwLCBncmFuZGNoaWxkMTF9OwotCQlyZXR1cm4gcHJvZmlsZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0ZVByb2ZpbGVzKGNyZWF0ZVRlc3RQcm9maWxlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVByb2ZpbGVzKElQcm9maWxlW10gcHJvZmlsZXMpIHsKLQkJSVByb2ZpbGUgcGFyZW50ID0gcHJvZmlsZXNbMF07Ci0JCUlQcm9maWxlIGNoaWxkMCA9IHByb2ZpbGVzWzFdOwotCQlJUHJvZmlsZSBjaGlsZDEgPSBwcm9maWxlc1syXTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDAwID0gcHJvZmlsZXNbM107Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMSA9IHByb2ZpbGVzWzRdOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDIgPSBwcm9maWxlc1s1XTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDEwID0gcHJvZmlsZXNbNl07Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMSA9IHByb2ZpbGVzWzddOwotCi0JCWFzc2VydFRydWUocGFyZW50SWQuZXF1YWxzKHBhcmVudC5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJQcm9maWxlIHNob3VsZCBoYXZlIDMgbG9jYWwgcHJvcGVydGllcyIsIHBhcmVudC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKHBhcmVudC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMocGFyZW50LmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJQYXJlbnQgc2hvdWxkIGhhdmUgMiBjaGlsZHJlbi4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAyKTsKLQotCQlhc3NlcnRUcnVlKGNoaWxkMElkLmVxdWFscyhjaGlsZDAuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgQ2hpbGQgc2hvdWxkIGhhdmUgMSBsb2NhbCBwcm9wZXJ0aWVzLiIsIGNoaWxkMC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoY2hpbGQwVmFsdWUuZXF1YWxzKGNoaWxkMC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoY2hpbGQwLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJGaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuLiIsIGNoaWxkMC5nZXRTdWJQcm9maWxlSWRzKCkubGVuZ3RoID09IDMpOwotCi0JCWFzc2VydFRydWUoY2hpbGQxSWQuZXF1YWxzKGNoaWxkMS5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgQ2hpbGQgc2hvdWxkIGhhdmUgMCBsb2NhbCBwcm9wZXJ0aWVzLiIsIGNoaWxkMS5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKGNoaWxkMS5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoY2hpbGQxLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgQ2hpbGQgc2hvdWxkIGhhdmUgMiBjaGlsZHJlbi4iLCBjaGlsZDEuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAyKTsKLQotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMElkLmVxdWFscyhncmFuZGNoaWxkMDAuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgR3JhbmRjaGlsZCBvZiBmaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAxIHByb3BlcnR5LiIsIGdyYW5kY2hpbGQwMC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoZ3JhbmRjaGlsZDAwVmFsdWUuZXF1YWxzKGdyYW5kY2hpbGQwMC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAwLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCi0JCWFzc2VydFRydWUoZ3JhbmRjaGlsZDAxSWQuZXF1YWxzKGdyYW5kY2hpbGQwMS5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgR3JhbmRjaGlsZCBvZiBmaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAwIHByb3BlcnRpZXMuIiwgZ3JhbmRjaGlsZDAxLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZDBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAxLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDEuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMDJJZC5lcXVhbHMoZ3JhbmRjaGlsZDAyLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIlRoaXJkIEdyYW5kY2hpbGQgb2YgZmlyc3QgQ2hpbGQgc2hvdWxkIGhhdmUgMSBwcm9wZXJ0eS4iLCBncmFuZGNoaWxkMDIuZ2V0TG9jYWxQcm9wZXJ0aWVzKCkuc2l6ZSgpID09IDEpOwotCQlhc3NlcnRUcnVlKGNoaWxkMFZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkoa2V5KSkpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMlZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTBJZC5lcXVhbHMoZ3JhbmRjaGlsZDEwLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIkZpcnN0IEdyYW5kY2hpbGQgb2Ygc2Vjb25kIENoaWxkIHNob3VsZCBoYXZlIDEgcHJvcGVydHkuIiwgZ3JhbmRjaGlsZDEwLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDEwLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTAuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTFJZC5lcXVhbHMoZ3JhbmRjaGlsZDExLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBHcmFuZGNoaWxkIG9mIHNlY29uZCBDaGlsZCBzaG91bGQgaGF2ZSAwIHByb3BlcnRpZXMuIiwgZ3JhbmRjaGlsZDExLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnRWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDExLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTEuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfVEVTVF9UQVJHRVQgPSAicHJvZmlsZVRlc3QiOwotCXByaXZhdGUgc3RhdGljIFZlcnNpb24gUFJPRklMRV9URVNUX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigiMC4wLjEiKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9GSUxFX1RFU1RfRUxFTUVOVCA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFU19FTEVNRU5UID0gInByb2ZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JY2xhc3MgUHJvZmlsZVN0cmluZ1dyaXRlciBleHRlbmRzIFByb2ZpbGVXcml0ZXIgewotCi0JCXB1YmxpYyBQcm9maWxlU3RyaW5nV3JpdGVyKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihzdHJlYW0sIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7UHJvY2Vzc2luZ0luc3RydWN0aW9uLm1ha2VDbGFzc1ZlcnNpb25JbnN0cnVjdGlvbihQUk9GSUxFX1RFU1RfVEFSR0VULCBQcm9maWxlLmNsYXNzLCBQUk9GSUxFX1RFU1RfVkVSU0lPTil9KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdyaXRlVGVzdChJUHJvZmlsZVtdIHByb2ZpbGVzKSB7Ci0JCQlzdGFydChQUk9GSUxFX1RFU1RfRUxFTUVOVCk7Ci0JCQl3cml0ZVByb2ZpbGVzKHByb2ZpbGVzKTsKLQkJCWVuZChQUk9GSUxFX1RFU1RfRUxFTUVOVCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZVByb2ZpbGVzKElQcm9maWxlW10gcHJvZmlsZXMpIHsKLQkJCWlmIChwcm9maWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJc3RhcnQoUFJPRklMRVNfRUxFTUVOVCk7Ci0JCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHByb2ZpbGVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9maWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQl3cml0ZVByb2ZpbGUocHJvZmlsZXNbaV0pOwotCQkJCX0KLQkJCQllbmQoUFJPRklMRVNfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBQcm9maWxlU3RyaW5nUGFyc2VyIGV4dGVuZHMgUHJvZmlsZVBhcnNlciB7Ci0KLQkJcHJpdmF0ZSBJUHJvZmlsZVtdIHByb2ZpbGVzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvZmlsZVN0cmluZ1BhcnNlcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBidW5kbGVJZCkgewotCQkJc3VwZXIoY29udGV4dCwgYnVuZGxlSWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHByb2ZpbGVTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aGlzLnN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWdldFBhcnNlcigpOwotCQkJCVRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7Ci0JCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBQcm9maWxlRG9jSGFuZGxlcihQUk9GSUxFX1RFU1RfRUxFTUVOVCwgdGVzdEhhbmRsZXIpKTsKLQkJCQl4bWxSZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIocHJvZmlsZVN0cmluZykpKTsKLQkJCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJCXByb2ZpbGVzID0gdGVzdEhhbmRsZXIucHJvZmlsZXM7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9maWxlRG9jSGFuZGxlciBleHRlbmRzIERvY0hhbmRsZXIgewotCi0JCQlwdWJsaWMgUHJvZmlsZURvY0hhbmRsZXIoU3RyaW5nIHJvb3ROYW1lLCBSb290SGFuZGxlciByb290SGFuZGxlcikgewotCQkJCXN1cGVyKHJvb3ROYW1lLCByb290SGFuZGxlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKFBST0ZJTEVfVEVTVF9UQVJHRVQuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJU3RyaW5nIGNsYXp6ID0gZXh0cmFjdFBJQ2xhc3MoZGF0YSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoIUNsYXNzLmZvck5hbWUoY2xhenopLmVxdWFscyhQcm9maWxlLmNsYXNzKSkgewotCQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIldyb25nIGNsYXNzICciICsgY2xhenogKyAiJyBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiUHJvZmlsZSBjbGFzcyAnIiArIGNsYXp6ICsgIicgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQlWZXJzaW9uIHByb2ZpbGVUZXN0VmVyc2lvbiA9IGV4dHJhY3RQSVZlcnNpb24odGFyZ2V0LCBkYXRhKTsKLQkJCQkJaWYgKCFQUk9GSUxFX1RFU1RfVkVSU0lPTi5lcXVhbHMocHJvZmlsZVRlc3RWZXJzaW9uKSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiQmFkIHByb2ZpbGUgdGVzdCB2ZXJzaW9uLiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBUZXN0SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBQcm9maWxlc0hhbmRsZXIgcHJvZmlsZXNIYW5kbGVyOwotCQkJSVByb2ZpbGVbXSBwcm9maWxlczsKLQotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUm9vdEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQlpZiAoUFJPRklMRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJaWYgKHByb2ZpbGVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlwcm9maWxlc0hhbmRsZXIgPSBuZXcgUHJvZmlsZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQlpZiAocHJvZmlsZXNIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCXByb2ZpbGVzID0gcHJvZmlsZXNIYW5kbGVyLmdldFByb2ZpbGVzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBQcm9maWxlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIGZpbmFsIE1hcCBwcm9maWxlSGFuZGxlcnM7Ci0KLQkJCXB1YmxpYyBQcm9maWxlc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFBST0ZJTEVTX0VMRU1FTlQpOwotCQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCQlwcm9maWxlSGFuZGxlcnMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEhhc2hNYXAobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgSGFzaE1hcCg0KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJUHJvZmlsZVtdIGdldFByb2ZpbGVzKCkgewotCQkJCWlmIChwcm9maWxlSGFuZGxlcnMuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbmV3IElQcm9maWxlWzBdOwotCi0JCQkJTWFwIHByb2ZpbGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9maWxlSGFuZGxlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgcHJvZmlsZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQlhZGRQcm9maWxlKHByb2ZpbGVJZCwgcHJvZmlsZU1hcCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIChJUHJvZmlsZVtdKSBwcm9maWxlTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IElQcm9maWxlW3Byb2ZpbGVNYXAuc2l6ZSgpXSk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBhZGRQcm9maWxlKFN0cmluZyBwcm9maWxlSWQsIE1hcCBwcm9maWxlTWFwKSB7Ci0JCQkJaWYgKHByb2ZpbGVNYXAuY29udGFpbnNLZXkocHJvZmlsZUlkKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJUHJvZmlsZUhhbmRsZXIgcHJvZmlsZUhhbmRsZXIgPSAoUHJvZmlsZUhhbmRsZXIpIHByb2ZpbGVIYW5kbGVycy5nZXQocHJvZmlsZUlkKTsKLQkJCQlQcm9maWxlIHBhcmVudFByb2ZpbGUgPSBudWxsOwotCi0JCQkJU3RyaW5nIHBhcmVudElkID0gcHJvZmlsZUhhbmRsZXIuZ2V0UGFyZW50SWQoKTsKLQkJCQlpZiAocGFyZW50SWQgIT0gbnVsbCkgewotCQkJCQlhZGRQcm9maWxlKHBhcmVudElkLCBwcm9maWxlTWFwKTsKLQkJCQkJcGFyZW50UHJvZmlsZSA9IChQcm9maWxlKSBwcm9maWxlTWFwLmdldChwYXJlbnRJZCk7Ci0JCQkJfQotCi0JCQkJUHJvZmlsZSBwcm9maWxlID0gbmV3IFByb2ZpbGUocHJvZmlsZUlkLCBwYXJlbnRQcm9maWxlLCBwcm9maWxlSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJCXByb2ZpbGUuc2V0VGltZXN0YW1wKHByb2ZpbGVIYW5kbGVyLmdldFRpbWVzdGFtcCgpKTsKLQkJCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gcHJvZmlsZUhhbmRsZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpOwotCQkJCWlmIChpdXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGl1c1tpXTsKLQkJCQkJCXByb2ZpbGUuYWRkSW5zdGFsbGFibGVVbml0KGl1KTsKLQkJCQkJCU1hcCBpdVByb3BlcnRpZXMgPSBwcm9maWxlSGFuZGxlci5nZXRJVVByb3BlcnRpZXMoaXUpOwotCQkJCQkJaWYgKGl1UHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl1UHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJCQlwcm9maWxlLnNldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBrZXksIHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZmlsZU1hcC5wdXQocHJvZmlsZUlkLCBwcm9maWxlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoUFJPRklMRV9FTEVNRU5UKSkgewotCQkJCQluZXcgUHJvZmlsZXNQcm9maWxlSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBwcm9maWxlSGFuZGxlcnMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBjbGFzcyBQcm9maWxlc1Byb2ZpbGVIYW5kbGVyIGV4dGVuZHMgUHJvZmlsZUhhbmRsZXIgewotCQkJcHJpdmF0ZSBmaW5hbCBNYXAgcHJvZmlsZUhhbmRsZXJzOwotCi0JCQlwdWJsaWMgUHJvZmlsZXNQcm9maWxlSGFuZGxlcihQcm9maWxlc0hhbmRsZXIgcHJvZmlsZXNIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIE1hcCBwcm9maWxlSGFuZGxlcnMpIHsKLQkJCQl0aGlzLnByb2ZpbGVIYW5kbGVycyA9IHByb2ZpbGVIYW5kbGVyczsKLQkJCQl0aGlzLnBhcmVudEhhbmRsZXIgPSBwcm9maWxlc0hhbmRsZXI7Ci0JCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotCQkJCWhhbmRsZVJvb3RBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJCXByb2ZpbGVIYW5kbGVycy5wdXQoZ2V0UHJvZmlsZUlkKCksIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuICJFcnJvciBwYXJzaW5nIHByb2ZpbGUgc3RyaW5nIjsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9maWxlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdC5wdXQocHJvZmlsZXNbaV0uZ2V0UHJvZmlsZUlkKCksIHByb2ZpbGVzW2ldKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvZmlsZVBlcnNpc3RlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb2ZpbGVbXSB0ZXN0UHJvZmlsZXMgPSBjcmVhdGVUZXN0UHJvZmlsZXMoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDE0OTIpOwotCQlQcm9maWxlU3RyaW5nV3JpdGVyIHdyaXRlcjAgPSBuZXcgUHJvZmlsZVN0cmluZ1dyaXRlcihvdXRwdXQwKTsKLQkJd3JpdGVyMC53cml0ZVRlc3QodGVzdFByb2ZpbGVzKTsKLQkJU3RyaW5nIHByb2ZpbGVUZXh0MCA9IG91dHB1dDAudG9TdHJpbmcoKTsKLQkJb3V0cHV0MC5jbG9zZSgpOwotCi0JCVByb2ZpbGVTdHJpbmdQYXJzZXIgcGFyc2VyID0gbmV3IFByb2ZpbGVTdHJpbmdQYXJzZXIoVGVzdEFjdGl2YXRvci5jb250ZXh0LCBUZXN0QWN0aXZhdG9yLlBJX1BST1ZfVEVTVFMpOwotCQlwYXJzZXIucGFyc2UocHJvZmlsZVRleHQwKTsKLQkJYXNzZXJ0VHJ1ZSgiRXJyb3IgcGFyc2luZyB0ZXN0IHByb2ZpbGU6ICIgKyBwYXJzZXIuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBwYXJzZXIuZ2V0U3RhdHVzKCkuaXNPSygpKTsKLQkJTWFwIHByb2ZpbGVNYXAgPSAoTWFwKSBwYXJzZXIuZ2V0Um9vdE9iamVjdCgpOwotCQlJUHJvZmlsZSBwYXJlbnQgPSAoSVByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KHBhcmVudElkKTsKLQkJSVByb2ZpbGUgY2hpbGQwID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChjaGlsZDBJZCk7Ci0JCUlQcm9maWxlIGNoaWxkMSA9IChJUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQoY2hpbGQxSWQpOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDAgPSAoSVByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KGdyYW5kY2hpbGQwMElkKTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDAxID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChncmFuZGNoaWxkMDFJZCk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMiA9IChJUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQoZ3JhbmRjaGlsZDAySWQpOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMTAgPSAoSVByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KGdyYW5kY2hpbGQxMElkKTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDExID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChncmFuZGNoaWxkMTFJZCk7Ci0JCUlQcm9maWxlW10gcHJvZmlsZXMgPSB7cGFyZW50LCBjaGlsZDAsIGNoaWxkMSwgZ3JhbmRjaGlsZDAwLCBncmFuZGNoaWxkMDEsIGdyYW5kY2hpbGQwMiwgZ3JhbmRjaGlsZDEwLCBncmFuZGNoaWxkMTF9OwotCQl2YWxpZGF0ZVByb2ZpbGVzKHByb2ZpbGVzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDE0OTIpOwotCQlQcm9maWxlU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBQcm9maWxlU3RyaW5nV3JpdGVyKG91dHB1dDEpOwotCi0JCXdyaXRlci53cml0ZVRlc3QocHJvZmlsZXMpOwotCQlTdHJpbmcgcHJvZmlsZVRleHQxID0gb3V0cHV0MS50b1N0cmluZygpOwotCQlvdXRwdXQxLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoIlByb2ZpbGUgd3JpdGUgYWZ0ZXIgcmVhZCBhZnRlciB3cml0ZSBwcm9kdWNlZCBkaWZmZXJlbnQgWE1MIiwgcHJvZmlsZVRleHQxLmVxdWFscyhwcm9maWxlVGV4dDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1RvdWNocG9pbnRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1RvdWNocG9pbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmVkODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Ub3VjaHBvaW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lLlBoYXNlVGVzdC5UZXN0UGhhc2VTZXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogU2ltcGxlIHRlc3Qgb2YgdGhlIGVuZ2luZSBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb3VjaHBvaW50VGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQlzdGF0aWMgdm9sYXRpbGUgVGVzdFRvdWNocG9pbnQgdGVzdFRvdWNocG9pbnQ7Ci0KLQlhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVGVzdFRvdWNocG9pbnQgZXh0ZW5kcyBUb3VjaHBvaW50IHsKLQkJaW50IGNvbXBsZXRlT3BlcmFuZDsKLQkJaW50IGNvbXBsZXRlUGhhc2U7Ci0JCWludCBpbml0aWFsaXplT3BlcmFuZDsKLQkJaW50IGluaXRpYWxpemVQaGFzZTsKLQotCQlwdWJsaWMgVGVzdFRvdWNocG9pbnQoKSB7Ci0JCQl0ZXN0VG91Y2hwb2ludCA9IHRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWNvbXBsZXRlT3BlcmFuZCsrOwotCQkJcmV0dXJuIHN1cGVyLmNvbXBsZXRlT3BlcmFuZChwcm9maWxlLCBwaGFzZUlkLCBvcGVyYW5kLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgTWFwIHRvdWNocG9pbnRQYXJhbWV0ZXJzKSB7Ci0JCQljb21wbGV0ZVBoYXNlKys7Ci0JCQlyZXR1cm4gc3VwZXIuY29tcGxldGVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwaGFzZUlkLCB0b3VjaHBvaW50UGFyYW1ldGVycyk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycykgewotCQkJaW5pdGlhbGl6ZU9wZXJhbmQrKzsKLQkJCXJldHVybiBzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBwaGFzZUlkLCBvcGVyYW5kLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMpIHsKLQkJCWluaXRpYWxpemVQaGFzZSsrOwotCQkJcmV0dXJuIHN1cGVyLmluaXRpYWxpemVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwaGFzZUlkLCB0b3VjaHBvaW50UGFyYW1ldGVycyk7Ci0JCX0KLQotCQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCkgewotCQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgidGVzdCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlcmFuZFRlc3RUb3VjaHBvaW50IGV4dGVuZHMgVGVzdFRvdWNocG9pbnQgewotCQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgY29tcGxldGVPcGVyYW5kKTsKLQkJCXN1cGVyLmNvbXBsZXRlT3BlcmFuZChwcm9maWxlLCBwaGFzZUlkLCBvcGVyYW5kLCBwYXJhbWV0ZXJzKTsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgY29tcGxldGVPcGVyYW5kKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWFzc2VydEVxdWFscygwLCBpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgY29tcGxldGVPcGVyYW5kKTsKLQkJCXN1cGVyLmluaXRpYWxpemVPcGVyYW5kKHByb2ZpbGUsIHBoYXNlSWQsIG9wZXJhbmQsIHBhcmFtZXRlcnMpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGluaXRpYWxpemVPcGVyYW5kKTsKLQkJCWFzc2VydEVxdWFscygwLCBjb21wbGV0ZU9wZXJhbmQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBoYXNlVGVzdFRvdWNocG9pbnQgZXh0ZW5kcyBUZXN0VG91Y2hwb2ludCB7Ci0JCXB1YmxpYyBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplUGhhc2UpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGNvbXBsZXRlUGhhc2UpOwotCQkJc3VwZXIuY29tcGxldGVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwaGFzZUlkLCBwYXJhbWV0ZXJzKTsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplUGhhc2UpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGNvbXBsZXRlUGhhc2UpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWFzc2VydEVxdWFscygwLCBpbml0aWFsaXplUGhhc2UpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGNvbXBsZXRlUGhhc2UpOwotCQkJc3VwZXIuaW5pdGlhbGl6ZVBoYXNlKG1vbml0b3IsIHByb2ZpbGUsIHBoYXNlSWQsIHBhcmFtZXRlcnMpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGluaXRpYWxpemVQaGFzZSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgY29tcGxldGVQaGFzZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBlbmdpbmVSZWY7Ci0JcHJpdmF0ZSBJRW5naW5lIGVuZ2luZTsKLQotCXB1YmxpYyBUb3VjaHBvaW50VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmVSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJZW5naW5lID0gKElFbmdpbmUpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmUgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdENvbXBsZXRlT3BlcmFuZCgpIHsKLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgVGVzdFBoYXNlU2V0KCk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0UHJvZmlsZSIpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7bmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgY3JlYXRlVGVzdElVKCJvcGVyYW5kVGVzdCIpKX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFRvdWNocG9pbnQuaW5pdGlhbGl6ZU9wZXJhbmQpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFRvdWNocG9pbnQuY29tcGxldGVPcGVyYW5kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdENvbXBsZXRlUGhhc2UoKSB7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IFRlc3RQaGFzZVNldCgpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdFByb2ZpbGUiKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKG51bGwsIGNyZWF0ZVRlc3RJVSgicGhhc2VUZXN0IikpfSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0VG91Y2hwb2ludC5pbml0aWFsaXplT3BlcmFuZCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0VG91Y2hwb2ludC5jb21wbGV0ZU9wZXJhbmQpOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVUZXN0SVUoU3RyaW5nIHRvdWNocG9pbnROYW1lKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXRJZCgib3JnLmVjbGlwc2UudGVzdCIpOwotCQlkZXNjcmlwdGlvbi5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKCIxLjAuMCIpKTsKLQkJZGVzY3JpcHRpb24uc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKHRvdWNocG9pbnROYW1lLCBuZXcgVmVyc2lvbigiMS4wLjAiKSkpOwotCQlJSW5zdGFsbGFibGVVbml0IHVuaXQgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIGNyZWF0ZVJlc29sdmVkSVUodW5pdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9EaXJlY3RvclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9mdWxsL0RpcmVjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZmMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9mdWxsL0RpcmVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmZ1bGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGluc3RhbGxzIG9yIHVuaW5zdGFsbHMgdGhlIElVIGRlZmluZWQgYnkgdGhlIHByb3BlcnR5ICJlY2xpcHNlLnAyLmF1dG9JbnN0YWxsIi4KLSAqIE1ldGFkYXRhIGZvciB0aGUgSVVzIHRvIGluc3RhbGwgbXVzdCBiZSBnZW5lcmF0ZWQgc2VwYXJhdGVseSBiZWZvcmUgcnVubmluZyB0aGlzIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxJVSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGlyZWN0b3Igc2VydmljZSBub3QgYXZhaWxhYmxlIik7Ci0JCX0KLQkJSURpcmVjdG9yIGRpcmVjdG9yID0gKElEaXJlY3RvcikgVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2Uoc3IpOwotCQlpZiAoZGlyZWN0b3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkRpcmVjdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQiKTsKLQkJfQotCi0JCVNlcnZpY2VSZWZlcmVuY2Ugc3IyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWdyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZShzcjIpOwotCQlpZiAobWdyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG1hbmFnZXIgY291bGQgbm90IGJlIGxvYWRlZCIpOwotCQl9Ci0KLQkJU3RyaW5nIGF1dG9JbnN0YWxsID0gU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmF1dG9JbnN0YWxsIik7Ci0JCUNvbGxlY3RvciBhbGxKb2JzID0gbWdyLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShhdXRvSW5zdGFsbCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCi0JCVN0cmluZyBpbnN0YWxsRm9sZGVyID0gU3lzdGVtLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHByb2ZpbGVSZWdTciA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2UocHJvZmlsZVJlZ1NyKTsKLQkJaWYgKHByb2ZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvZmlsZSByZWdpc3RyeSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKTsKLQkJfQotCi0JCVN0cmluZyBuZXdGbGF2b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvciIpOwotCQlib29sZWFuIGRvVW5pbnN0YWxsID0gKEJvb2xlYW4uVFJVRS5lcXVhbHMoQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5kb1VuaW5zdGFsbCIpKSkpOwotCi0JCUlQcm9maWxlIHAgPSBudWxsOwotCQlpZiAoZG9Vbmluc3RhbGwpIHsKLQkJCXAgPSBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShpbnN0YWxsRm9sZGVyKTsKLQkJCWlmIChwID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuaW5zdGFsbGluZyBmcm9tIGEgbm9uZXhpc3RlbnQgcHJvZmlsZSIpOwotCQl9IGVsc2UgewotCQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgaW5zdGFsbEZvbGRlcik7Ci0JCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0ZMQVZPUiwgbmV3Rmxhdm9yKTsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBFbnZpcm9ubWVudEluZm8uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPSIgKyBpbmZvLmdldE9TKCkgKyAiLG9zZ2kud3M9IiArIGluZm8uZ2V0V1MoKSArICIsb3NnaS5hcmNoPSIgKyBpbmZvLmdldE9TQXJjaCgpKTsKLQotCQkJcCA9IGNyZWF0ZVByb2ZpbGUoaW5zdGFsbEZvbGRlciwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCX0KLQotCQlJSW5zdGFsbGFibGVVbml0W10gYWxsUm9vdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFsxXTsKLQkJSVN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBudWxsOwotCQlpZiAoIWFsbEpvYnMuaXNFbXB0eSgpKSB7Ci0JCQlhbGxSb290c1swXSA9IChJSW5zdGFsbGFibGVVbml0KSBhbGxKb2JzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwKTsKLQkJCWlmICghZG9Vbmluc3RhbGwpCi0JCQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKGFsbFJvb3RzKTsKLQkJCWVsc2UKLQkJCQlyZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdHMoYWxsUm9vdHMpOwotCQkJb3BlcmF0aW9uU3RhdHVzID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQl9IGVsc2UgewotCQkJb3BlcmF0aW9uU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLnRlc3QiLCAiVGhlIGluc3RhbGxhYmxlIHVuaXQgJyIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UucDIuYXV0b0luc3RhbGwiKSArICInIGhhcyBub3QgYmVlbiBmb3VuZCIpOwotCQl9Ci0KLQkJaWYgKCFvcGVyYXRpb25TdGF0dXMuaXNPSygpKQotCQkJZmFpbCgiVGhlIGluc3RhbGxhdGlvbiBoYXMgZmFpbGVkIik7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIHJlc3VsdCA9IChJSW5zdGFsbGFibGVVbml0W10pIHAucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGFsbFJvb3RzWzBdLmdldElkKCksIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgKCFkb1VuaW5zdGFsbCA/IDEgOiAwKSk7Ci0JCXJlc3VsdCA9IChJSW5zdGFsbGFibGVVbml0W10pIHAucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KCJ0b29saW5nZGVmYXVsdCIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCi0JCWVuc3VyZUZyYWdtZW50QXNzb2NpYXRpb25Jc05vdFBlcnNpc3RlZChtZ3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVGcmFnbWVudEFzc29jaWF0aW9uSXNOb3RQZXJzaXN0ZWQoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWdyKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJLy9UZXN0IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NjYxCi0JCUFnZW50TG9jYXRpb24gbG9jYXRpb24gPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1nci5yZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uLmdldE1ldGFkYXRhUmVwb3NpdG9yeVVSTCgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbnVsbDsKLQkJcmVwbyA9IG1nci5sb2FkUmVwb3NpdG9yeShsb2NhdGlvbi5nZXRNZXRhZGF0YVJlcG9zaXRvcnlVUkwoKSwgbnVsbCk7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVwby5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCk7Ci0JCWlmICghaXQuaGFzTmV4dCgpKQotCQkJcmV0dXJuOwotCQlJSW5zdGFsbGFibGVVbml0IHNjID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0Lm5leHQoKTsKLQkJaWYgKHNjLmlzUmVzb2x2ZWQoKSkKLQkJCWZhaWwoIlRoZSByZXBvc2l0b3J5IHNob3VsZCBub3Qgc3RvcmUgcmVzb2x2ZWQgaW5zdGFsbGFibGUgdW5pdHMiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9FbmQyRW5kVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Z1bGwvRW5kMkVuZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhODVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9FbmQyRW5kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmZ1bGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkVudmlyb25tZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRW5kMkVuZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLQlwcml2YXRlIElEaXJlY3RvciBkaXJlY3RvcjsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkRpcmVjdG9yIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpOwotCQlkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCVNlcnZpY2VSZWZlcmVuY2Ugc3IyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmVwb01hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHNyMik7Ci0JCWlmIChyZXBvTWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgbWFuYWdlciBjb3VsZCBub3QgYmUgbG9hZGVkIik7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9maWxlIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIHByb2ZpbGVJZCkgewotCQlTdHJpbmcgaW5zdGFsbEZvbGRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSKTsKLQkJU2VydmljZVJlZmVyZW5jZSBwcm9maWxlUmVnU3IgPSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHByb2ZpbGVSZWdTcik7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2ZpbGUgcmVnaXN0cnkgc2VydmljZSBub3QgYXZhaWxhYmxlIik7Ci0JCX0KLQotCQlTdHJpbmcgbmV3Rmxhdm9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmNvbmZpZ3VyYXRpb25GbGF2b3IiKTsKLQkJYm9vbGVhbiBkb1VuaW5zdGFsbCA9IChCb29sZWFuLlRSVUUuZXF1YWxzKEJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UucDIuZG9Vbmluc3RhbGwiKSkpKTsKLQotCQlJUHJvZmlsZSBwID0gbnVsbDsKLQkJaWYgKGRvVW5pbnN0YWxsKSB7Ci0JCQlwID0gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJCWlmIChwID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuaW5zdGFsbGluZyBmcm9tIGEgbm9uZXhpc3RlbnQgcHJvZmlsZSIpOwotCQl9IGVsc2UgewotCQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgaW5zdGFsbEZvbGRlciArICcvJyArIHByb2ZpbGVJZCk7Ci0JCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0ZMQVZPUiwgbmV3Rmxhdm9yKTsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBFbnZpcm9ubWVudEluZm8uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPSIgKyBpbmZvLmdldE9TKCkgKyAiLG9zZ2kud3M9IiArIGluZm8uZ2V0V1MoKSArICIsb3NnaS5hcmNoPSIgKyBpbmZvLmdldE9TQXJjaCgpKTsKLQotCQkJcCA9IGNyZWF0ZVByb2ZpbGUocHJvZmlsZUlkLCBudWxsLCBwcm9wZXJ0aWVzKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFNESygpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZTIgPSBjcmVhdGVQcm9maWxlKCJwcm9maWxlMiIpOwotCQkvL0ZpcnN0IHdlIGluc3RhbGwgdGhlIHNkawotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2dldElVKCJzZGsiLCBuZXcgVmVyc2lvbigiMy4zLjAiKSl9KTsKLQkJSVN0YXR1cyBzID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlpZiAoIXMuaXNPSygpKQotCQkJZmFpbCgiSW5zdGFsbGF0aW9uIGZhaWxlZCIpOwotCQlJSW5zdGFsbGFibGVVbml0IGZpcnN0U25hcHNob3QgPSBnZXRJVSgicHJvZmlsZTIiKTsgLy9UaGlzIHNob3VsZCByZXByZXNlbnQgdGhlIGVtcHR5IHByb2ZpbGUKLQkJYXNzZXJ0Tm90TnVsbChmaXJzdFNuYXBzaG90KTsKLQkJYXNzZXJ0Tm90TnVsbChmaXJzdFNuYXBzaG90LmdldFByb3BlcnR5KCJwcm9maWxlSVUiKSk7Ci0KLQkJLy9Vbmluc3RhbGwgdGhlIFNESwotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2dldElVKCJzZGsiLCBuZXcgVmVyc2lvbigiMy4zLjAiKSl9KTsKLQkJcyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKCFzLmlzT0soKSkKLQkJCWZhaWwoIlRoZSB1bmluc3RhbGxhdGlvbiBoYXMgZmFpbGVkIGFuZCBpdCB3YXMgbm90IGV4cGVjdGVkIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUyKS5oYXNOZXh0KCkpOyAvL3RoZSBwcm9maWxlIHNob3VsZCBiZSBlbXB0eSBzaW5jZSB3ZSB1bmluc3RhbGxlZCBldmVyeXRoaW5nCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBzbmFwc2hvdHMgPSBnZXRJVXMoInByb2ZpbGUyIik7Ci0JCWFzc2VydFRydWUoInNuYXAiICsgc25hcHNob3RzLmxlbmd0aCwgc25hcHNob3RzLmxlbmd0aCA+PSAyKTsvL1RPRE8gTm9ybWFsbHkgaGVyZSBpdCBzaG91bGQgYmUgMiEhIQotCQlhc3NlcnRUcnVlKHByb2ZpbGUyLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSgic2RrIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLmlzRW1wdHkoKSk7Ci0KLQkJLy8gTm93IHRlc3QgdGhlIHJvbGxiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUsIGluIHRoaXMgY2FzZSB3ZSByZWluc3RhbGwgdGhlIFNESwotCQlzID0gZGlyZWN0b3IucmV2ZXJ0KHNuYXBzaG90c1swXS5lcXVhbHMoZmlyc3RTbmFwc2hvdCkgPyBzbmFwc2hvdHNbMV0gOiBzbmFwc2hvdHNbMF0sIHByb2ZpbGUyLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKCFzLmlzT0soKSkKLQkJCWZhaWwoIlRoZSBiZWNvbWUgb3BlcmF0aW9uIGZhaWxlZCIpOwotCi0JCWFzc2VydE5vdE51bGwoZ2V0SVUoInNkayIpKTsKLQotCQkvL1Rlc3QgcmVwbGFjZQotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHBsYW5uZXIudXBkYXRlc0ZvcihnZXRJVSgic2RrIiwgbmV3IFZlcnNpb24oIjMuMy4wIikpLCBudWxsLCBudWxsKSk7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtnZXRJVSgic2RrIiwgbmV3IFZlcnNpb24oIjMuMy4wIikpfSk7Ci0JCWFzc2VydE9LKGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiIiwgcHJvZmlsZTIsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2dldElVKCJzZGsiLCBuZXcgVmVyc2lvbigiMy40LjAiKSl9KTsKLQkJYXNzZXJ0Tm90SVVzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2dldElVKCJzZGsiLCBuZXcgVmVyc2lvbigiMy4zLjAiKSl9LCBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUyKSk7Ci0KLQkJLy9SZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBwcm9maWxlIGJ5IGJlY29taW5nIGFuIGVtcHR5IHByb2ZpbGUKLQkJcyA9IGRpcmVjdG9yLnJldmVydChmaXJzdFNuYXBzaG90LCBwcm9maWxlMiwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydE9LKHMpOwotCQkvLwkJYXNzZXJ0RW1wdHlQcm9maWxlKHByb2ZpbGUyKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldElVcyhTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIHJlcG9NYW5hZ2VyLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0SVUoU3RyaW5nIGlkKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVwb01hbmFnZXIucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJaWYgKGl0Lmhhc05leHQoKSkKLQkJCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRJVShTdHJpbmcgaWQsIFZlcnNpb24gdikgewotCQlJdGVyYXRvciBpdCA9IHJlcG9NYW5hZ2VyLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgdiksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJaWYgKGl0Lmhhc05leHQoKSkKLQkJCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9SZXBvVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9SZXBvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjY3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Z1bGwvUmVwb1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmZ1bGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUmVwb1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHJlcG9Mb2MgPSBuZXcgVVJMKCJmaWxlOmQ6L2dhbnltZWRlTTUiKTsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGxhbm5lciBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKTsKLQkJfQotCQlJUGxhbm5lciBwbGFubmVyID0gKElQbGFubmVyKSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZShzcik7Ci0JCWlmIChwbGFubmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQbGFubmVyIGNvdWxkIG5vdCBiZSBsb2FkZWQiKTsKLQkJfQotCi0JCVNlcnZpY2VSZWZlcmVuY2Ugc3IyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWdyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZShzcjIpOwotCQlpZiAobWdyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG1hbmFnZXIgY291bGQgbm90IGJlIGxvYWRlZCIpOwotCQl9Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgdmFsaWRhdGVkUmVwbyA9IG1nci5sb2FkUmVwb3NpdG9yeShyZXBvTG9jLCBudWxsKTsKLQotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgInRvb2xpbmciKTsKLQkJSVByb2ZpbGUgcCA9IGNyZWF0ZVByb2ZpbGUoInJlcG9WYWxpZGF0b3IiLCBudWxsLCBwcm9wZXJ0aWVzKTsKLQotCQlRdWVyeSBxOwotCQkvLwkJcSA9IG5ldyBRdWVyeSgpIHsKLQkJLy8JCQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBvYmplY3QpIHsKLQkJLy8JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQkJCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJLy8JCQkJaWYgKGNhbmRpZGF0ZS5nZXRJZCgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmpzdCIpIHx8IGNhbmRpZGF0ZS5nZXRJZCgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLndzdCIpKQotCQkvLwkJCQkJcmV0dXJuIHRydWU7Ci0JCS8vCQkJCXJldHVybiBmYWxzZTsKLQkJLy8JCQl9Ci0JCS8vCQl9OwotCi0JCS8vCQlxID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KCJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyIik7Ci0KLQkJcSA9IEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWTsKLQkJQ29sbGVjdG9yIGl1c1RvVGVzdCA9IHZhbGlkYXRlZFJlcG8ucXVlcnkocSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQotCQlQcm92aXNpb25pbmdDb250ZXh0IHBjID0gbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQobmV3IFVSTFtdIHtyZXBvTG9jfSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXNUb1Rlc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlJSW5zdGFsbGFibGVVbml0IGlzSW5zdGFsbGFibGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwKTsKLQkJCQlyZXEuc2V0UHJvZmlsZVByb3BlcnR5KCJlY2xpcHNlLnAyLmluc3RhbGwuZmVhdHVyZXMiLCAidHJ1ZSIpOwotCQkJCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2lzSW5zdGFsbGFibGV9KTsKLQkJCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtpbmcgb246ICIgKyBpc0luc3RhbGxhYmxlKTsKLQkJCQlJU3RhdHVzIHMgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBwYywgbnVsbCkuZ2V0U3RhdHVzKCk7Ci0JCQkJaWYgKCFzLmlzT0soKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IHJlc29sdmU6ICIgKyBpc0luc3RhbGxhYmxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjYzYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZ2VuZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGVuZ2luZSB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlU0RLMzNUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpdGVQYXJzZXJUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9FY2xpcHNlU0RLMzNUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0VjbGlwc2VTREszM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwYzg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0VjbGlwc2VTREszM1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5JR2VuZXJhdG9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUZXN0cyBydW5uaW5nIHRoZSBtZXRhZGF0YSBnZW5lcmF0b3IgYWdhaW5zdCBFY2xpcHNlIDMuMyBmZWF0dXJlcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VTREszM1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWNsaXBzZVNESzMzVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VTREszM1Rlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZVNESzMzVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGlvbigpIHsKLQkJSUdlbmVyYXRvckluZm8gZ2VuZXJhdG9ySW5mbyA9IGNyZWF0ZUdlbmVyYXRvckluZm8oKTsKLQkJR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBHZW5lcmF0b3IoZ2VuZXJhdG9ySW5mbyk7Ci0JCWdlbmVyYXRvci5nZW5lcmF0ZSgpOwotCi0JCVRlc3RNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IChUZXN0TWV0YWRhdGFSZXBvc2l0b3J5KSBnZW5lcmF0b3JJbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCQlJSW5zdGFsbGFibGVVbml0IHVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLmN2cy5zb3VyY2UuZmVhdHVyZS5ncm91cCIsICIxLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZSIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucmNwLmZlYXR1cmUuZ3JvdXAiLCAiMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIik7Ci0JCWFzc2VydE5vdE51bGwodW5pdCk7Ci0JCWFzc2VydEdyb3VwKHVuaXQpOwotCQl1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5qZHQuZmVhdHVyZS5ncm91cCIsICIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIik7Ci0JCWFzc2VydE5vdE51bGwodW5pdCk7Ci0JCWFzc2VydEdyb3VwKHVuaXQpOwotCQl1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5jdnMuZmVhdHVyZS5ncm91cCIsICIxLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZSIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucGRlLnNvdXJjZS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnNkay5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPIik7Ci0JCWFzc2VydE5vdE51bGwodW5pdCk7Ci0JCWFzc2VydEdyb3VwKHVuaXQpOwotCQl1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmZlYXR1cmUuZ3JvdXAiLCAiMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIik7Ci0JCWFzc2VydE5vdE51bGwodW5pdCk7Ci0JCWFzc2VydEdyb3VwKHVuaXQpOwotCQl1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5qZHQuc291cmNlLmZlYXR1cmUuZ3JvdXAiLCAiMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUiIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucGRlLmZlYXR1cmUuZ3JvdXAiLCAiMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGFydGlmYWN0UmVwbyA9IChUZXN0QXJ0aWZhY3RSZXBvc2l0b3J5KSBnZW5lcmF0b3JJbmZvLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpOwotCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gYXJ0aWZhY3RSZXBvLmdldEFydGlmYWN0S2V5cygpOwotCQlhc3NlcnRUcnVlKGtleXMubGVuZ3RoID09IDExKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIElVIHJlcHJlc2VudHMgYSBncm91cC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzZXJ0R3JvdXAoSUluc3RhbGxhYmxlVW5pdCB1bml0KSB7Ci0JCWFzc2VydEVxdWFscygiSVUgaXMgbm90IGEgZ3JvdXAiLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSwgdW5pdC5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9HUk9VUCkpOwotCX0KLQotCXByaXZhdGUgSUdlbmVyYXRvckluZm8gY3JlYXRlR2VuZXJhdG9ySW5mbygpIHsKLQkJQnVuZGxlIG15QnVuZGxlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCk7Ci0JCVVSTCByb290ID0gRmlsZUxvY2F0b3IuZmluZChteUJ1bmRsZSwgbmV3IFBhdGgoInRlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zIiksIG51bGwpOwotCQlGaWxlIHJvb3RGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJvb3QgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwocm9vdCk7Ci0JCQlyb290RmlsZSA9IG5ldyBGaWxlKHJvb3QuZ2V0UGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiNC45OSIsIGUpOwotCQl9Ci0JCVRlc3RHZW5lcmF0b3JJbmZvIGluZm8gPSBuZXcgVGVzdEdlbmVyYXRvckluZm8ocm9vdEZpbGUpOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvU2l0ZVBhcnNlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvU2l0ZVBhcnNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiNzFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1NpdGVQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcy5EZWZhdWx0U2l0ZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcy5TaXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0RGF0YTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdCB0aGUgc2l0ZS54bWwgcGFyc2VyIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlUGFyc2VyVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHVibGljIHZvaWQgdGVzdEV1cm9wYVNpdGUoKSB7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQl0cnkgewotCQkJU2l0ZU1vZGVsIHNpdGUgPSBwYXJzZXIucGFyc2UoVGVzdERhdGEuZ2V0KCJnZW5lcmF0b3IiLCAiRXVyb3BhL3NpdGUueG1sIikpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHNpdGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiNC45OSIsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCI0Ljk5IiwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1Rlc3RHZW5lcmF0b3JJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1Rlc3RHZW5lcmF0b3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjMyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9UZXN0R2VuZXJhdG9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5Db25maWdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTGF1bmNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5JR2VuZXJhdG9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0TWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBJR2VuZXJhdG9ySW5mbyB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEdlbmVyYXRvckluZm8gaW1wbGVtZW50cyBJR2VuZXJhdG9ySW5mbyB7Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RSZXBvOwotCXByaXZhdGUgRmlsZSBiYXNlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG87Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdElkOwotCXByaXZhdGUgU3RyaW5nIHJvb3RWZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyQ29uZmlnOwotCXByaXZhdGUgVVJMIHNpdGVMb2NhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29tcGF0aWJpbHR5ID0gZmFsc2U7Ci0KLQlwdWJsaWMgVGVzdEdlbmVyYXRvckluZm8oRmlsZSBiYXNlTG9jYXRpb24pIHsKLQkJdGhpcy5iYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkRGVmYXVsdElVcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFwcGVuZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJaWYgKGFydGlmYWN0UmVwbyA9PSBudWxsKQotCQkJYXJ0aWZhY3RSZXBvID0gbmV3IFRlc3RBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJcmV0dXJuIGFydGlmYWN0UmVwbzsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEJ1bmRsZUxvY2F0aW9ucygpIHsKLQkJRmlsZVtdIGNoaWxkcmVuID0gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAicGx1Z2lucyIpLmxpc3RGaWxlcygpOwotCQlyZXR1cm4gY2hpbGRyZW4gPT0gbnVsbCA/IG5ldyBGaWxlWzBdIDogY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIENvbmZpZ0RhdGEgZ2V0Q29uZmlnRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAiY29uZmlndXJhdGlvbiIpOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RGVmYXVsdElVcyhTZXQgaXVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEV4ZWN1dGFibGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RmVhdHVyZXNMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGJhc2VMb2NhdGlvbiwgImZlYXR1cmVzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGbGF2b3IoKSB7Ci0JCXJldHVybiBmbGF2b3I7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SlJFTG9jYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMYXVuY2hlckRhdGEgZ2V0TGF1bmNoZXJEYXRhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRNYXBwaW5nUnVsZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJaWYgKG1ldGFkYXRhUmVwbyA9PSBudWxsKQotCQkJbWV0YWRhdGFSZXBvID0gbmV3IFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbMF0pOwotCQlyZXR1cm4gbWV0YWRhdGFSZXBvOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkKCkgewotCQlyZXR1cm4gcm9vdElkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdFZlcnNpb24oKSB7Ci0JCXJldHVybiByb290VmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFNpdGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHNpdGVMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyQ29uZmlnKCkgewotCQlyZXR1cm4gbGF1bmNoZXJDb25maWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hBcnRpZmFjdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSB2YWx1ZSkgewotCQl0aGlzLmFydGlmYWN0UmVwbyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5mbGF2b3IgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoSU1ldGFkYXRhUmVwb3NpdG9yeSB2YWx1ZSkgewotCQl0aGlzLm1ldGFkYXRhUmVwbyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdHMoYm9vbGVhbiB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RJZChTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5yb290SWQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlTG9jYXRpb24oVVJMIGxvY2F0aW9uKSB7Ci0JCXRoaXMuc2l0ZUxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXJDb25maWcoU3RyaW5nIGxhdW5jaGVyQ29uZmlnKSB7Ci0JCXRoaXMubGF1bmNoZXJDb25maWcgPSBsYXVuY2hlckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc1VwZGF0ZUNvbXBhdGlibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZUNvbXBhdGliaWx0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1VwZGF0ZUNvbXBhdGlibGUoYm9vbGVhbiBpc0NvbXBhdGlibGUpIHsKLQkJdGhpcy51cGRhdGVDb21wYXRpYmlsdHkgPSBpc0NvbXBhdGlibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldXNlRXhpc3RpbmdQYWNrMjAwRmlsZXMoYm9vbGVhbiBwdWJsaXNoUGFjaykgewotCQkvLwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdEZpbGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0T3RoZXJJVXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkFkdmljZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uQWR2aWNlKFN0cmluZyBhZHZpY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxMDVhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIG1ldGFkYXRhIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFydGlmYWN0S2V5UGFyc2luZ1Rlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRnJhZ21lbnRNZXRob2RUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZyYWdtZW50VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJVVBlcnNpc3RlbmNlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaWNlbnNlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aXBsZUlVQW5kRnJhZ21lbnRUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FydGlmYWN0S2V5UGFyc2luZ1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9BcnRpZmFjdEtleVBhcnNpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjUwMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FydGlmYWN0S2V5UGFyc2luZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgPGNvZGU+QXJ0aWZhY3RrZXlEZVNlcmlhbGl6ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEtleVBhcnNpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiY2xhc3NpZmllciIsICJpZGVudGlmaWVyIiwgbmV3IFZlcnNpb24oIjEuMCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzc2lmaWVyLGlkZW50aWZpZXIsMS4wLjAiLCBrZXkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZUVtcHR5Q2xhc3NpZmllcigpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiIiwgImlkZW50aWZpZXIiLCBuZXcgVmVyc2lvbigiMS4wIikpOwotCQlhc3NlcnRFcXVhbHMoIixpZGVudGlmaWVyLDEuMC4wIiwga2V5LnRvRXh0ZXJuYWxGb3JtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZSgpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IEFydGlmYWN0S2V5LnBhcnNlKCJjbGFzc2lmaWVyLGlkZW50aWZpZXIsMS4wLjAiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoImNsYXNzaWZpZXIiLCBrZXkuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZGVudGlmaWVyIiwga2V5LmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb24oIjEuMCIpLCBrZXkuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzZXJpYWxpemVFbXB0eUNsYXNzaWZpZXIoKSB7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBBcnRpZmFjdEtleS5wYXJzZSgiLGlkZW50aWZpZXIsMS4wLjAiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkZW50aWZpZXIiLCBrZXkuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvbigiMS4wIiksIGtleS5nZXRWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZUVtcHR5SWRlbnRpZmllcigpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IEFydGlmYWN0S2V5LnBhcnNlKCJjbGFzc2lmaWVyLCwxLjAuMCIpOwotCQlhc3NlcnROb3ROdWxsKGtleSk7Ci0JCWFzc2VydEVxdWFscygiY2xhc3NpZmllciIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAiKSwga2V5LmdldFZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplRW1wdHlWZXJzaW9uKCkgewotCQlJQXJ0aWZhY3RLZXkga2V5ID0gQXJ0aWZhY3RLZXkucGFyc2UoImNsYXNzaWZpZXIsaWRlbnRpZmllciwiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoImNsYXNzaWZpZXIiLCBrZXkuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZGVudGlmaWVyIiwga2V5LmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb24oIjAuMCIpLCBrZXkuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzZXJpYWxpemVFbXB0eUV2ZXJ5dGhpbmcoKSB7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBBcnRpZmFjdEtleS5wYXJzZSgiLCwiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIwLjAiKSwga2V5LmdldFZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplVG9vRmV3UGFydHNJKCkgewotCQl0cnkgewotCQkJQXJ0aWZhY3RLZXkucGFyc2UoIiIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZVRvb01hbnlQYXJ0c0koKSB7Ci0JCXRyeSB7Ci0JCQlBcnRpZmFjdEtleS5wYXJzZSgiLCwsLCIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZVRvb0Zld1BhcnRzSUkoKSB7Ci0JCXRyeSB7Ci0JCQlBcnRpZmFjdEtleS5wYXJzZSgiY2xhc3NpZmllciIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudE1ldGhvZFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudE1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MWE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvRnJhZ21lbnRNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbi5SZXNvbHV0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBGcmFnbWVudE1ldGhvZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJBRyA9ICJwcm9wRnJhZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSVUgPSAicHJvcElVIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVFVSVJFRCA9ICJ0ZXN0UmVxdWlyZWQiOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUxOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUzOwotCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIGl1MURlcHM7Ci0JUmVxdWlyZWRDYXBhYmlsaXR5W10gaXUzRGVwczsKLQlQcm92aWRlZENhcGFiaWxpdHlbXSBpdTFDYXBzOwotCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGl1M0NhcHM7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlpdTEgPSBjcmVhdGVJVSgiaXUudGVzdDEiKTsKLQkJaXUzID0gY3JlYXRlSVVGcmFnbWVudCgiaXUuZnJhZ21lbnQiKTsKLQkJaXUxQ2FwcyA9IGl1MS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQlpdTNDYXBzID0gaXUzLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWl1MURlcHMgPSBpdTEuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJaXUzRGVwcyA9IGl1My5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCQlIYXNoU2V0IGhhc2ggPSBuZXcgSGFzaFNldCgpOwotCQloYXNoLmFkZChpdTEpOwotCQloYXNoLmFkZChpdTMpOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG5ldyBIYXNodGFibGUoKSwgbnVsbCkuYXR0YWNoQ1VzKGhhc2gpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKGl1MS5nZXRJZCgpKSkKLQkJCQlpdTEgPSBpdTsKLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTMuZ2V0SWQoKSkpCi0JCQkJaXUzID0gaXU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpdTEgPSBudWxsOwotCQlpdTMgPSBudWxsOwotCQlpdTFEZXBzID0gbnVsbDsKLQkJaXUzRGVwcyA9IG51bGw7Ci0JCWl1MUNhcHMgPSBudWxsOwotCQlpdTNDYXBzID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwYWJpbGl0aWVzKCkgewotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBpdUNhcGFiaWxpdGllcyA9IGl1MUNhcHM7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGluaXRpYWxGcmFnbWVudENhcGFiaWxpdGllcyA9IGl1M0NhcHM7Ci0KLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gbWVyZ2VkQ2FwYWJpbGl0aWVzID0gaXUxLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXVDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZyYWdtZW50VGVzdC5hc3NlcnRDb250YWluc1dpdGhFcXVhbHMobWVyZ2VkQ2FwYWJpbGl0aWVzLCBpdUNhcGFiaWxpdGllc1tpXSk7Ci0JCX0KLQotCQkvL1RoZSBmcmFnbWVudCBwcm9wZXJ0eSBpcyBub3Qgc2V0Ci0JCWFzc2VydE51bGwoaXUxLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5UKSk7Ci0KLQkJLy9UaGUgZnJhZ21lbnQgZG9lcyBub3QgY29udGFpbiBpdSBuYW1lc3BhY2UKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsRnJhZ21lbnRDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbml0aWFsRnJhZ21lbnRDYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKSkgewotCQkJCWFzc2VydERvZXNOb3RDb250YWluKG1lcmdlZENhcGFiaWxpdGllcywgaW5pdGlhbEZyYWdtZW50Q2FwYWJpbGl0aWVzW2ldKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydEVxdWFscygiVGhlIGZyYWdtZW50IGNhcGFiaWxpdGllcyBzaG91bGQgbm90IGNoYW5nZSIsIGluaXRpYWxGcmFnbWVudENhcGFiaWxpdGllcywgaXUzLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCksIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJZmFpbChtZXNzYWdlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwsIGJvb2xlYW4gb3JkZXJJbXBvcnRhbnQpIHsKLQkJLy8gaWYgdGhlIG9yZGVyIGluIHRoZSBhcnJheSBtdXN0IG1hdGNoIGV4YWN0bHksIHRoZW4gY2FsbCB0aGUgb3RoZXIgbWV0aG9kCi0JCWlmIChvcmRlckltcG9ydGFudCkgewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG90aGVyd2lzZSB1c2UgdGhpcyBtZXRob2QgYW5kIGNoZWNrIHRoYXQgdGhlIGFycmF5cyBhcmUgZXF1YWwgaW4gYW55IG9yZGVyCi0JCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKQotCQkJcmV0dXJuOwotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCkKLQkJCWFzc2VydFRydWUobWVzc2FnZSArICIuMSIsIGZhbHNlKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIi4yIiwgZmFsc2UpOwotCQlib29sZWFuW10gZm91bmQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFmb3VuZFtqXSAmJiBleHBlY3RlZFtpXS5lcXVhbHMoYWN0dWFsW2pdKSkKLQkJCQkJZm91bmRbal0gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmQubGVuZ3RoOyBpKyspCi0JCQlpZiAoIWZvdW5kW2ldKQotCQkJCWFzc2VydFRydWUobWVzc2FnZSArICIuMy4iICsgaSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnREb2VzTm90Q29udGFpbihPYmplY3RbXSBvYmplY3RzLCBPYmplY3Qgc2VhcmNoZWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2JqZWN0c1tpXS5lcXVhbHMoc2VhcmNoZWQpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiVGhlIGFycmF5IHNob3VsZCBub3QgY29udGFpbiB0aGUgc2VhcmNoZWQgZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIiwgaXUzLmdldFByb3BlcnR5KFBST1BfRlJBRykpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcHJvcGVydHkgaXMgbWlzc2luZyIsIGl1MS5nZXRQcm9wZXJ0eShQUk9QX0lVKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGF2YWlsYWJsZSIsIGl1MS5nZXRQcm9wZXJ0eSgiZG9lc25vdGV4aXN0IikpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVRnJhZ21lbnQoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBpdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKG5hbWUpOwotCQlpdS5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1LnNldFByb3BlcnR5KFBST1BfRlJBRywgInZhbHVlIik7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImVjbGlwc2UudG91Y2hwb2ludCIsICJidW5kbGUiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIHRydWUpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KFRFU1RfUkVRVUlSRUQsIFRFU1RfUkVRVUlSRUQsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSl9OwotCQlpdS5zZXRIb3N0KHJlcXMpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBjYXAgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3RDYXBhYmlsaXR5SW5GcmFnbWVudCIsICJ0ZXN0Q2FwYWJpbGl0eUluRnJhZ21lbnQiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9OwotCQlpdS5zZXRDYXBhYmlsaXRpZXMoY2FwKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChpdSk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKG5hbWUpOwotCQlpdS5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1LnNldFByb3BlcnR5KFBST1BfSVUsICJ2YWx1ZUlVIik7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNhcCA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgiZWNsaXBzZS50b3VjaHBvaW50IiwgImJ1bmRsZSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdENhcGFiaWxpdHkiLCAidGVzdENhcGFiaWxpdHkiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9OwotCQlpdS5zZXRDYXBhYmlsaXRpZXMoY2FwKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyZWMwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvRnJhZ21lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbigpIHsKLQkJU3RyaW5nIElEID0gInVpLnRlc3QxIjsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTEgPSBjcmVhdGVFY2xpcHNlSVUoSUQpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MiA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihuZXcgSGFzaHRhYmxlKCksIG51bGwpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoaXUxKTsKLQkJc2V0LmFkZChpdTIpOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IHJoLmF0dGFjaENVcyhzZXQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKElEKSkgewotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgsIDEpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCAiaXVGcmFnbWVudC50ZXN0MSIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uMigpIHsKLQkJU3RyaW5nIElEMSA9ICJ1aS50ZXN0MSI7Ci0JCVN0cmluZyBJRDMgPSAidWkudGVzdDMiOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MSA9IGNyZWF0ZUVjbGlwc2VJVShJRDEpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MyA9IGNyZWF0ZUVjbGlwc2VJVShJRDMpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MiA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihuZXcgSGFzaHRhYmxlKCksIG51bGwpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoaXUxKTsKLQkJc2V0LmFkZChpdTIpOwotCQlzZXQuYWRkKGl1Myk7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gcmguYXR0YWNoQ1VzKHNldCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXUuZ2V0SWQoKS5lcXVhbHMoSUQxKSkgewotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgsIDEpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCAiaXVGcmFnbWVudC50ZXN0MSIpOwotCQkJfQotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKElEMykpIHsKLQkJCQlhc3NlcnRFcXVhbHMoaXUuZ2V0RnJhZ21lbnRzKCkubGVuZ3RoLCAxKTsKLQkJCQlhc3NlcnRFcXVhbHMoaXUuZ2V0RnJhZ21lbnRzKClbMF0uZ2V0SWQoKSwgIml1RnJhZ21lbnQudGVzdDEiKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb3VjaHBvaW50RGF0YSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGNyZWF0ZUlVV2l0aFRvdWNocG9pbnREYXRhKCkuZ2V0VG91Y2hwb2ludERhdGEoKS5sZW5ndGgsIDEpOwotCQlhc3NlcnRFcXVhbHMoY3JlYXRlQnVuZGxlRnJhZ21lbnQoIml1RnJhZ21lbnQudGVzdDEiKS5nZXRUb3VjaHBvaW50RGF0YSgpLmxlbmd0aCwgMSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUxID0gY3JlYXRlSVVXaXRoVG91Y2hwb2ludERhdGEoKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTIgPSBjcmVhdGVCdW5kbGVGcmFnbWVudCgiaXVGcmFnbWVudC50ZXN0MSIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIobmV3IEhhc2h0YWJsZSgpLCBudWxsKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKGl1MSk7Ci0JCXNldC5hZGQoaXUyKTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSByaC5hdHRhY2hDVXMoc2V0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTEuZ2V0SWQoKSkpCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGl1LmdldFRvdWNocG9pbnREYXRhKCkubGVuZ3RoKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50Q2FwYWJpbGl0eSgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSwgaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdElVQ2FwYWJpbGl0eSgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUVjbGlwc2VJVSgidWkudGVzdDEiKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwID0gaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXAubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjYXBbaV0uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKSkgewotCQkJCWFzc2VydEVxdWFscyhjYXBbaV0uZ2V0TmFtZXNwYWNlKCksIElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKTsKLQkJCQlhc3NlcnRFcXVhbHMoY2FwW2ldLmdldE5hbWUoKSwgaXUuZ2V0SWQoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiTm8gY2FwYWJpbGl0eSBmb3IgdGhlIGl1IGlkIik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbnRhaW5zKE9iamVjdFtdIG9iamVjdHMsIE9iamVjdCBzZWFyY2hlZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvYmplY3RzW2ldID09IHNlYXJjaGVkKQotCQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIlRoZSBhcnJheSBkb2VzIG5vdCBjb250YWluIHRoZSBzZWFyY2hlZCBlbGVtZW50Iik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbnRhaW5zV2l0aEVxdWFscyhPYmplY3RbXSBvYmplY3RzLCBPYmplY3Qgc2VhcmNoZWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2JqZWN0c1tpXS5lcXVhbHMoc2VhcmNoZWQpKQotCQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIlRoZSBhcnJheSBkb2VzIG5vdCBjb250YWluIHRoZSBzZWFyY2hlZCBlbGVtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVV2l0aFRvdWNocG9pbnREYXRhKCkgewotCQlUb3VjaHBvaW50RGF0YSBkYXRhID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gY3JlYXRlRWNsaXBzZUlVKCJ1aS50ZXN0MSIsIERFRkFVTFRfVkVSU0lPTiwgTk9fUkVRVUlSRVMsIGRhdGEpOwotCX0KLQotCS8vCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVUZyYWdtZW50V2l0aFRvdWNocG9pbnREYXRhKCkgewotCS8vCQlUb3VjaHBvaW50RGF0YSBkYXRhID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG5ldyBIYXNoTWFwKCkpOwotCS8vCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgdW5pdCA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JLy8JCXJldHVybiB1bml0OwotCS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9JVVBlcnNpc3RlbmNlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0lVUGVyc2lzdGVuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTU4YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0lVUGVyc2lzdGVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uTWV0YWRhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvLk1ldGFkYXRhV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgSVVQZXJzaXN0ZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JLy8gUmFuZG9tbHkgY2hvc2Ugb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyBhcyB0aGUgSVUgZm9yIHRlc3RpbmcgcGVyc2lzdGVuY2UKLQkvLyBidXQgJ2VuaGFuY2VkJyBpdCBmb3IgYmV0dGVyIGNvdmVyYWdlLgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQYWNrYWdlc05TID0gIm9zZ2kucGFja2FnZXMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiOwotCXByaXZhdGUgc3RhdGljIFZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKCIzLjEuMjAwLnYyMDA3MDYwNSIpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaWx0ZXIgPSAiKCYgKG9zZ2kud3M9d2luMzIpIChvc2dpLm9zPXdpbjMyKSAob3NnaS5hcmNoPXg4NikpIjsgLy8gbm90IHJlYWxseQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBwcm9wZXJ0aWVzID0gbmV3IFN0cmluZ1tdW10ge25ldyBTdHJpbmdbXSB7ImVxdWlub3gucDIubmFtZSIsICJPU0dpIFJlbGVhc2UgNC4wLjEgU2VydmljZXMifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7ImVxdWlub3gucDIuZGVzY3JpcHRpb24iLCAiT1NHaSBTZXJ2aWNlIFBsYXRmb3JtIFJlbGVhc2UgNC4wLjEgU2VydmljZSBJbnRlcmZhY2VzIGFuZCBDbGFzc2VzIn0sIC8vCi0JCQluZXcgU3RyaW5nW10geyJlcXVpbm94LnAyLnByb3ZpZGVyIiwgIkVjbGlwc2Uub3JnIn0sIC8vCi0JCQluZXcgU3RyaW5nW10geyJlcXVpbm94LnAyLmNvbnRhY3QiLCAid3d3LmVjbGlwc2Uub3JnIn0sIC8vCi0JCQluZXcgU3RyaW5nW10geyJlcXVpbm94LnAyLmNvcHlyaWdodCIsICJDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEEgbG9uZy13aW5kZWQgY29weXJpZ2h0IG5vdGljZS4ifX07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIHByb3ZpZGVzID0gbmV3IFN0cmluZ1tdW10ge25ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuY20iLCAiMS4yLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50IiwgIjEuMC4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmRldmljZSIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5ldmVudCIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5odHRwIiwgIjEuMi4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmlvIiwgIjEuMC4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmxvZyIsICIxLjMuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZSIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5wcm92aXNpb25pbmciLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UudXBucCIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4iLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluIiwgIjEuMC4wIn19OyAvLwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSByZXF1aXJlcyA9IG5ldyBTdHJpbmdbXVtdIHtuZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJqYXZheC5zZXJ2bGV0IiwgIjAuMC4wIiwgInRydWUifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgImphdmF4LnNlcnZsZXQuaHR0cCIsICIwLjAuMCIsICJ0cnVlIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5mcmFtZXdvcmsiLCAiMS4yLjAiLCAiZmFsc2UifX07IC8vCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGluc3RydWN0aW9ucyA9IG5ldyBTdHJpbmdbXVtdIHtuZXcgU3RyaW5nW10geyJtYW5pZmVzdCIsICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcXEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnXFxCdW5kbGUtQ29udGFjdEFkZHJlc3M6IHd3dy5lY2xpcHNlLm9yZ1xcLi4uYSB3aG9sZSBidW5jaCBvZiBvdGhlciBtYW5pZmVzdCBjb250ZW50Li4uIn0sIG5ldyBTdHJpbmdbXSB7InppcHBlZCIsICJ0cnVlIn0sIC8vCi0JCQluZXcgU3RyaW5nW10geyJjb25maWd1cmUiLCAiYWRkUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOi1zdGFydHVwKTthZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6QGFydGlmYWN0KTsifX07IC8vCi0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlUGVyc2lzdGVuY2VUZXN0SVUoKSB7Ci0JCU1hcCBwcm9wZXJ0eU1hcCA9IGNyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGFkZGl0aW9uYWxQcm92aWRlcyA9IGNyZWF0ZVByb3ZpZGVkKHByb3ZpZGVzKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZW1lbnRzID0gY3JlYXRlUmVxdWlyZWQocmVxdWlyZXMpOwotCQlUb3VjaHBvaW50RGF0YSB0cERhdGEgPSBjcmVhdGVUb3VjaHBvaW50RGF0YShpbnN0cnVjdGlvbnMpOwotCQlJVXBkYXRlRGVzY3JpcHRvciB1cGRhdGUgPSBjcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCk7Ci0JCWJvb2xlYW4gc2luZ2xldG9uID0gZmFsc2U7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBjcmVhdGVJVShpZCwgdmVyc2lvbiwgZmlsdGVyLCByZXF1aXJlbWVudHMsIGFkZGl0aW9uYWxQcm92aWRlcywgcHJvcGVydHlNYXAsIFRPVUNIUE9JTlRfT1NHSSwgdHBEYXRhLCBzaW5nbGV0b24sIHVwZGF0ZSk7Ci0JCXJldHVybiBpdTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVXBkYXRlRGVzY3JpcHRvciBjcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoaWQsIG5ldyBWZXJzaW9uUmFuZ2UoSVVfVEVTVF9WRVJTSU9OLCB0cnVlLCBJVV9URVNUX1ZFUlNJT04sIHRydWUpLCBJVXBkYXRlRGVzY3JpcHRvci5ISUdILCAiZGVzYyIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBjcmVhdGVQcm9wZXJ0aWVzKFN0cmluZ1tdW10ga2V5VmFsdWVQYWlycykgewotCQlPcmRlcmVkUHJvcGVydGllcyBwcm9wcyA9IG5ldyBPcmRlcmVkUHJvcGVydGllcyhrZXlWYWx1ZVBhaXJzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5VmFsdWVQYWlycy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gbmV4dFBhaXIgPSBrZXlWYWx1ZVBhaXJzW2ldOwotCQkJcHJvcHMucHV0KG5leHRQYWlyWzBdLCBuZXh0UGFpclsxXSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNyZWF0ZVByb3ZpZGVkKFN0cmluZ1tdW10gcHJvdmlkZVR1cGxlcykgewotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlZCA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbcHJvdmlkZVR1cGxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVUdXBsZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIG5leHRUdXBsZSA9IHByb3ZpZGVUdXBsZXNbaV07Ci0JCQlwcm92aWRlZFtpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkobmV4dFR1cGxlWzBdLCBuZXh0VHVwbGVbMV0sIG5ldyBWZXJzaW9uKG5leHRUdXBsZVsyXSkpOwotCQl9Ci0JCS8vIHByb3ZpZGVkW3Byb3ZpZGVUdXBsZXMubGVuZ3RoXSA9IEJVTkRMRV9DQVBBQklMSVRZOwotCQlyZXR1cm4gcHJvdmlkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gY3JlYXRlUmVxdWlyZWQoU3RyaW5nW11bXSByZXF1aXJlVHVwbGVzKSB7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXF1aXJlVHVwbGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZVR1cGxlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gbmV4dFR1cGxlID0gcmVxdWlyZVR1cGxlc1tpXTsKLQkJCXJlcXVpcmVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShuZXh0VHVwbGVbMF0sIG5leHRUdXBsZVsxXSwgbmV3IFZlcnNpb25SYW5nZShuZXh0VHVwbGVbMl0pLCBudWxsLCBCb29sZWFuLnZhbHVlT2YobmV4dFR1cGxlWzNdKS5ib29sZWFuVmFsdWUoKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUb3VjaHBvaW50RGF0YSBjcmVhdGVUb3VjaHBvaW50RGF0YShTdHJpbmdbXVtdIGluc3RydWN0aW9uRGF0YSkgewotCQlNYXAgbWFwID0gbmV3IExpbmtlZEhhc2hNYXAoaW5zdHJ1Y3Rpb25EYXRhLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25EYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBuZXh0SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbkRhdGFbaV07Ci0JCQltYXAucHV0KG5leHRJbnN0cnVjdGlvblswXSwgbmV4dEluc3RydWN0aW9uWzFdKTsKLQkJfQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG1hcCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElVX1RFU1RfVEFSR0VUID0gImluc3RhbGxhYmxlVW5pdFRlc3QiOwotCXByaXZhdGUgc3RhdGljIFZlcnNpb24gSVVfVEVTVF9WRVJTSU9OID0gbmV3IFZlcnNpb24oIjAuMC4xIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSVVfVEVTVF9FTEVNRU5UID0gInRlc3QiOwotCi0JY2xhc3MgSVVTdHJpbmdXcml0ZXIgZXh0ZW5kcyBNZXRhZGF0YVdyaXRlciB7Ci0KLQkJcHVibGljIElVU3RyaW5nV3JpdGVyKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihzdHJlYW0sIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7UHJvY2Vzc2luZ0luc3RydWN0aW9uLm1ha2VDbGFzc1ZlcnNpb25JbnN0cnVjdGlvbihJVV9URVNUX1RBUkdFVCwgSW5zdGFsbGFibGVVbml0LmNsYXNzLCBJVV9URVNUX1ZFUlNJT04pfSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZVRlc3QoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQkJc3RhcnQoSVVfVEVTVF9FTEVNRU5UKTsKLQkJCXdyaXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQkJCWVuZChJVV9URVNUX0VMRU1FTlQpOwotCQl9Ci0JfQotCi0JY2xhc3MgSVVTdHJpbmdQYXJzZXIgZXh0ZW5kcyBNZXRhZGF0YVBhcnNlciB7Ci0KLQkJcHVibGljIElVU3RyaW5nUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcHJvZmlsZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRoaXMuc3RhdHVzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGFyc2VyKCk7Ci0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IElVRG9jSGFuZGxlcihJVV9URVNUX0VMRU1FTlQsIHRlc3RIYW5kbGVyKSk7Ci0JCQkJeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHByb2ZpbGVTdHJpbmcpKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQl0aGVJVSA9IHRlc3RIYW5kbGVyLmdldElVKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHRoZUlVID0gbnVsbDsKLQotCQlwcml2YXRlIGZpbmFsIGNsYXNzIElVRG9jSGFuZGxlciBleHRlbmRzIERvY0hhbmRsZXIgewotCi0JCQlwdWJsaWMgSVVEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChJVV9URVNUX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlTdHJpbmcgY2xhenogPSBleHRyYWN0UElDbGFzcyhkYXRhKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICghQ2xhc3MuZm9yTmFtZShjbGF6eikuZXF1YWxzKEluc3RhbGxhYmxlVW5pdC5jbGFzcykpIHsKLQkJCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJXcm9uZyBjbGFzcyAnIiArIGNsYXp6ICsgIicgaW4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIkluc3RhbGxhYmxlVW5pdCBjbGFzcyAnIiArIGNsYXp6ICsgIicgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQlWZXJzaW9uIGl1VGVzdFZlcnNpb24gPSBleHRyYWN0UElWZXJzaW9uKHRhcmdldCwgZGF0YSk7Ci0JCQkJCWlmICghSVVfVEVTVF9WRVJTSU9OLmVxdWFscyhpdVRlc3RWZXJzaW9uKSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiQmFkIGl1IHRlc3QgdmVyc2lvbi4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBSb290SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgSW5zdGFsbGFibGVVbml0SGFuZGxlciBpdUhhbmRsZXIgPSBudWxsOwotCi0JCQlwcml2YXRlIEluc3RhbGxhYmxlVW5pdCBpdSA9IG51bGw7Ci0JCQlwcml2YXRlIExpc3Qgc2luZ2xldG9uID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQkJcHVibGljIFRlc3RIYW5kbGVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXQgZ2V0SVUoKSB7Ci0JCQkJcmV0dXJuIGl1OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbm9BdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChpdUhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJaXVIYW5kbGVyID0gbmV3IEluc3RhbGxhYmxlVW5pdEhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgc2luZ2xldG9uKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJaWYgKGl1SGFuZGxlciAhPSBudWxsICYmIHNpbmdsZXRvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJaXUgPSAoSW5zdGFsbGFibGVVbml0KSBpdUhhbmRsZXIuZ2V0SW5zdGFsbGFibGVVbml0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiAiRXJyb3IgcGFyc2luZyBpbnN0YWxsYWJsZSB1bml0IHN0cmluZyI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhlSVU7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJVVBlcnNpc3RlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTAgPSBjcmVhdGVQZXJzaXN0ZW5jZVRlc3RJVSgpOwotCQl2YWxpZGF0ZUlVKGl1MCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQwID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgzMDcyKTsKLQkJSVVTdHJpbmdXcml0ZXIgd3JpdGVyMCA9IG5ldyBJVVN0cmluZ1dyaXRlcihvdXRwdXQwKTsKLQkJd3JpdGVyMC53cml0ZVRlc3QoaXUwKTsKLQkJU3RyaW5nIGl1VGV4dDAgPSBvdXRwdXQwLnRvU3RyaW5nKCk7Ci0JCW91dHB1dDAuY2xvc2UoKTsKLQotCQlJVVN0cmluZ1BhcnNlciBwYXJzZXIgPSBuZXcgSVVTdHJpbmdQYXJzZXIoVGVzdEFjdGl2YXRvci5jb250ZXh0LCBUZXN0QWN0aXZhdG9yLlBJX1BST1ZfVEVTVFMpOwotCQlwYXJzZXIucGFyc2UoaXVUZXh0MCk7Ci0JCWFzc2VydFRydWUoIkVycm9yIHBhcnNpbmcgdGVzdCBpdTogIiArIHBhcnNlci5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIHBhcnNlci5nZXRTdGF0dXMoKS5pc09LKCkpOwotCQlJbnN0YWxsYWJsZVVuaXQgaXUxID0gKEluc3RhbGxhYmxlVW5pdCkgcGFyc2VyLmdldFJvb3RPYmplY3QoKTsKLQkJdmFsaWRhdGVJVShpdTEpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0MSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTQ5Mik7Ci0JCUlVU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBJVVN0cmluZ1dyaXRlcihvdXRwdXQxKTsKLQkJd3JpdGVyLndyaXRlVGVzdChpdTEpOwotCQlTdHJpbmcgaXVUZXh0MSA9IG91dHB1dDEudG9TdHJpbmcoKTsKLQkJb3V0cHV0MS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHdyaXRlIGFmdGVyIHJlYWQgYWZ0ZXIgd3JpdGUgcHJvZHVjZWQgZGlmZmVyZW50IFhNTCIsIGl1VGV4dDEuZXF1YWxzKGl1VGV4dDApKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSVUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IGlkIGlzIG5vdCBjb3JyZWN0IiwgaWQuZXF1YWxzKGl1LmdldElkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB2ZXJzaW9uIGlzIG5vdCBjb3JyZWN0IiwgdmVyc2lvbi5lcXVhbHMoaXUuZ2V0VmVyc2lvbigpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgZmlsdGVyIGlzIG5vdCBjb3JyZWN0IiwgZmlsdGVyLmVxdWFscyhpdS5nZXRGaWx0ZXIoKSkpOwotCQkvLyBhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHByb3BlcnRpZXMgYXJlIG5vdCBjb3JyZWN0IiwgQXJyYXlzLmVxdWFscyhwcm9wZXJ0aWVzLCBleHRyYWN0UHJvcGVydGllcyhpdSkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCBwcm9wZXJ0aWVzIGFyZSBub3QgY29ycmVjdCIsIGVxdWFsKHByb3BlcnRpZXMsIGV4dHJhY3RQcm9wZXJ0aWVzKGl1KSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHByb3ZpZGVkIGNhcGFiaWxpdGllcyBhcmUgbm90IGNvcnJlY3QiLCBlcXVhbChhZGRTZWxmQ2FwYWJpbGl0eShpdSwgcHJvdmlkZXMpLCBleHRyYWN0UHJvdmlkZXMoaXUpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGFyZSBub3QgY29ycmVjdCIsIGVxdWFsKHJlcXVpcmVzLCBleHRyYWN0UmVxdWlyZXMoaXUpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgdXBkYXRlIGRlc2NyaXB0b3IgYXJlIG5vdCBjb3JyZWN0IiwgaWQuZXF1YWxzKGl1LmdldFVwZGF0ZURlc2NyaXB0b3IoKS5nZXRJZCgpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgdXBkYXRlIGRlc2NyaXB0b3IgYXJlIG5vdCBjb3JyZWN0IiwgSVVwZGF0ZURlc2NyaXB0b3IuSElHSCA9PSBpdS5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgdXBkYXRlIGRlc2NyaXB0b3IgYXJlIG5vdCBjb3JyZWN0IiwgImRlc2MiLmVxdWFscyhpdS5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0RGVzY3JpcHRpb24oKSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHVwZGF0ZSBkZXNjcmlwdG9yIGFyZSBub3QgY29ycmVjdCIsIG5ldyBWZXJzaW9uUmFuZ2UoSVVfVEVTVF9WRVJTSU9OLCB0cnVlLCBJVV9URVNUX1ZFUlNJT04sIHRydWUpLmVxdWFscyhpdS5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0UmFuZ2UoKSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gZXh0cmFjdFByb3BlcnRpZXMoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlNYXAgcHJvcHMgPSBpdS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCVNldCBrZXlzID0gcHJvcHMua2V5U2V0KCk7Ci0JCVN0cmluZ1tdW10gcGFpcnMgPSBuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXVsyXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBuZXh0S2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmV4dFZhbHVlID0gKFN0cmluZykgcHJvcHMuZ2V0KG5leHRLZXkpOwotCQkJcGFpcnNbaW5kZXhdID0gbmV3IFN0cmluZ1tdIHtuZXh0S2V5LCBuZXh0VmFsdWV9OwotCQkJaW5kZXgrKzsKLQkJfQotCQlyZXR1cm4gcGFpcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBhZGRTZWxmQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0IGl1LCBTdHJpbmdbXVtdIHByb3ZpZGVUdXBsZXMpIHsKLQkJU3RyaW5nW11bXSBhdWdtZW50ZWRQcm92aWRlcyA9IG5ldyBTdHJpbmdbcHJvdmlkZVR1cGxlcy5sZW5ndGggKyAxXVszXTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5IHNlbGYgPSBnZXRTZWxmQ2FwYWJpbGl0eShpdSk7Ci0JCWF1Z21lbnRlZFByb3ZpZGVzWzBdID0gbmV3IFN0cmluZ1tdIHtzZWxmLmdldE5hbWVzcGFjZSgpLCBzZWxmLmdldE5hbWUoKSwgc2VsZi5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKX07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZVR1cGxlcy5sZW5ndGg7IGkrKykgewotCQkJYXVnbWVudGVkUHJvdmlkZXNbaSArIDFdID0gcHJvdmlkZVR1cGxlc1tpXTsKLQkJfQotCQlyZXR1cm4gYXVnbWVudGVkUHJvdmlkZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBleHRyYWN0UHJvdmlkZXMoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92eWRlcyA9IGl1LmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCVN0cmluZ1tdW10gdHVwbGVzID0gbmV3IFN0cmluZ1twcm92eWRlcy5sZW5ndGhdWzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Z5ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm92aWRlZENhcGFiaWxpdHkgbmV4dCA9IHByb3Z5ZGVzW2ldOwotCQkJdHVwbGVzW2ldID0gbmV3IFN0cmluZ1tdIHtuZXh0LmdldE5hbWVzcGFjZSgpLCBuZXh0LmdldE5hbWUoKSwgbmV4dC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKX07Ci0JCX0KLQkJcmV0dXJuIHR1cGxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGV4dHJhY3RSZXF1aXJlcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXV5cmVzID0gaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJU3RyaW5nW11bXSB0dXBsZXMgPSBuZXcgU3RyaW5nW3JlcXV5cmVzLmxlbmd0aF1bNF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdXlyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVJlcXVpcmVkQ2FwYWJpbGl0eSBuZXh0ID0gcmVxdXlyZXNbaV07Ci0JCQl0dXBsZXNbaV0gPSBuZXcgU3RyaW5nW10ge25leHQuZ2V0TmFtZXNwYWNlKCksIG5leHQuZ2V0TmFtZSgpLCBuZXh0LmdldFJhbmdlKCkudG9TdHJpbmcoKSwgQm9vbGVhbi52YWx1ZU9mKG5leHQuaXNPcHRpb25hbCgpKS50b1N0cmluZygpfTsKLQkJfQotCQlyZXR1cm4gdHVwbGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0xpY2Vuc2VUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvTGljZW5zZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxYzIxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvTGljZW5zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLkxpY2Vuc2U7Ci0KLS8qKgotICogVGVzdHMgZm9yIExpY2Vuc2UgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemUoKSB7Ci0JCUxpY2Vuc2UgbGljZW5zZU9uZSA9IG5ldyBMaWNlbnNlKG51bGwsICJhICAgYiIpOwotCQlMaWNlbnNlIGxpY2Vuc2VUd28gPSBuZXcgTGljZW5zZShudWxsLCAiYVx0XG5cciAgXHRcblxyICBiIik7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgbGljZW5zZU9uZS5nZXREaWdlc3QoKSwgbGljZW5zZVR3by5nZXREaWdlc3QoKSk7Ci0KLQkJbGljZW5zZU9uZSA9IG5ldyBMaWNlbnNlKG51bGwsICIgICBhIGIgIGMgICIpOwotCQlsaWNlbnNlVHdvID0gbmV3IExpY2Vuc2UobnVsbCwgImFcdFxuYlxyICBcdFxuXHIgIGMiKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBsaWNlbnNlT25lLmdldERpZ2VzdCgpLCBsaWNlbnNlVHdvLmdldERpZ2VzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvTXVsdGlwbGVJVUFuZEZyYWdtZW50VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL011bHRpcGxlSVVBbmRGcmFnbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1OWNmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvTXVsdGlwbGVJVUFuZEZyYWdtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24uUmVzb2x1dGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIE11bHRpcGxlSVVBbmRGcmFnbWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JSUluc3RhbGxhYmxlVW5pdCBpdTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBpdTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBpdTM7Ci0JQ29sbGVjdGlvbiByZXN1bHQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpdTEgPSBjcmVhdGVFY2xpcHNlSVUoIm9uZSIpOwotCQlpdTIgPSBjcmVhdGVJVVdpdGhEZXBlbmRlbmN5T24oInR3byIsICJvbmUiKTsKLQkJaXUzID0gY3JlYXRlQnVuZGxlRnJhZ21lbnQoImZyYWdtZW50Iik7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZChpdTEpOwotCQlzZXQuYWRkKGl1Mik7Ci0JCXNldC5hZGQoaXUzKTsKLQkJcmVzdWx0ID0gbmV3IFJlc29sdXRpb25IZWxwZXIobmV3IEhhc2h0YWJsZSgpLCBudWxsKS5hdHRhY2hDVXMoc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlpdTEgPSBudWxsOwotCQlpdTIgPSBudWxsOwotCQlpdTMgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRhY2htZW50KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKGl1MS5nZXRJZCgpKSkgewotCQkJCWFzc2VydEVxdWFscygxLCBpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCBpdTMuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQlpZiAoaXUuZ2V0SWQoKS5lcXVhbHMoaXUyLmdldElkKCkpKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEsIGl1LmdldEZyYWdtZW50cygpLmxlbmd0aCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGl1LmdldEZyYWdtZW50cygpWzBdLmdldElkKCksIGl1My5nZXRJZCgpKTsKLQkJCX0KLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTMuZ2V0SWQoKSkpIHsKLQkJCQkvL2ZyYWdtZW50cyBkb24ndCBoYXZlIGZyYWdtZW50cwotCQkJCWFzc2VydE51bGwoaXUuZ2V0RnJhZ21lbnRzKCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVV2l0aERlcGVuZGVuY3lPbihTdHJpbmcgaXVOYW1lLCBTdHJpbmcgZGVwZW5kZW5jeU9uKSB7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBkZXBlbmRlbmN5T24sIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgdHJ1ZSl9OwotCQlyZXR1cm4gY3JlYXRlRWNsaXBzZUlVKGl1TmFtZSwgREVGQVVMVF9WRVJTSU9OLCByZXF1aXJlcywgTk9fVFBfREFUQSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Nzc1YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgYXV0b21hdGVkIG1ldGFkYXRhIHJlcG9zaXRvcnkgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmFyVVJMUmVwb3NpdG9yeVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0phclVSTFJlcG9zaXRvcnlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9KYXJVUkxSZXBvc2l0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhjODRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0phclVSTFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgSmFyVVJMUmVwb3NpdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgbWFuYWdlclJlZjsKLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXI7Ci0JcHJpdmF0ZSBGaWxlIHRlc3RSZXBvSmFyOwotCi0JcHVibGljIEphclVSTFJlcG9zaXRvcnlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBKYXJVUkxSZXBvc2l0b3J5VGVzdCgpIHsKLQkJdGhpcygiIik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLQkJaWYgKGRpcmVjdG9yeS5leGlzdHMoKSAmJiBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlc1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaXJlY3RvcnkuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWFuYWdlclJlZiA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShtYW5hZ2VyUmVmKTsKLQotCQlFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlciBwcm92aWRlciA9IG5ldyBFY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcigpOwotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMiKTsKLQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKSk7Ci0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlGaWxlIHRlc3RSZXBvID0gbmV3IEZpbGUodGVtcERpciwgInRlc3RSZXBvIik7Ci0JCWRlbGV0ZURpcmVjdG9yeSh0ZXN0UmVwbyk7Ci0JCXRlc3RSZXBvLm1rZGlyKCk7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcigiamFydGVzdCIpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkodGVzdFJlcG8udG9VUkwoKSwgInRlc3RSZXBvIiwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSk7Ci0JCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXBvc2l0b3J5LmdldExvY2F0aW9uKCkpOwotCQlwcm92aWRlci5zZXRNZXRhZGF0YVJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbmV3IEdlbmVyYXRvcihwcm92aWRlcikuZ2VuZXJhdGUoKTsKLQkJRmlsZVV0aWxzLnppcChuZXcgRmlsZVtdIHt0ZXN0UmVwb30sIG5ldyBGaWxlKHRlbXBEaXIsICJ0ZXN0UmVwby5qYXIiKSk7Ci0JCXRlc3RSZXBvSmFyID0gbmV3IEZpbGUodGVtcERpciwgInRlc3RSZXBvLmphciIpOwotCQlhc3NlcnRUcnVlKHRlc3RSZXBvSmFyLmV4aXN0cygpKTsKLQkJdGVzdFJlcG9KYXIuZGVsZXRlT25FeGl0KCk7Ci0JCWRlbGV0ZURpcmVjdG9yeSh0ZXN0UmVwbyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWFuYWdlciA9IG51bGw7Ci0JCVRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShtYW5hZ2VyUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmFyVVJMUmVwb3NpdG9yeSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgamFyUmVwb1VSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXJSZXBvVVJMID0gbmV3IFVSTCgiamFyOiIgKyB0ZXN0UmVwb0phci50b1VSTCgpLnRvU3RyaW5nKCkgKyAiIS90ZXN0UmVwby8iKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkoamFyUmVwb1VSTCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIXJlcG8ucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLmlzRW1wdHkoKSk7Ci0JCW1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShqYXJSZXBvVVJMKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0xvY2FsTWV0YWRhdGFSZXBvc2l0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZiODQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0xvY2FsTWV0YWRhdGFSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlSW5zdGFsbEdlbmVyYXRvckluZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLQotLyoqCi0gKiBUZXN0IEFQSSBvZiB0aGUgbG9jYWwgbWV0YWRhdGEgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5VGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfS0VZID0gIlRlc3RLZXkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1ZBTFVFID0gIlRlc3RWYWx1ZSI7Ci0JcHJvdGVjdGVkIEZpbGUgcmVwb0xvY2F0aW9uOwotCi0JcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0JCXJlcG9Mb2NhdGlvbiA9IG5ldyBGaWxlKHRlbXBEaXIsICJMb2NhbE1ldGFkYXRhUmVwb3NpdG9yeVRlc3QiKTsKLQkJQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmRlbGV0ZShyZXBvTG9jYXRpb24pOwotCQlyZXBvTG9jYXRpb24ubWtkaXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGUocmVwb0xvY2F0aW9uKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NlZFJlcG9zaXRvcnkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLnRvVVJMKCksICJUZXN0UmVwbyIsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlkpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVwby5nZXRMb2NhdGlvbigpKTsKLQkJcmVwby5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX0NPTVBSRVNTRUQsICJ0cnVlIik7Ci0JCUVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvKTsKLQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShyZXBvTG9jYXRpb24pOwotCQlwcm92aWRlci5zZXRSb290VmVyc2lvbigiMy4zIik7Ci0JCXByb3ZpZGVyLnNldFJvb3RJZCgic2RrIik7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcigidG9vbGluZyIpOwotCQkvLyBHZW5lcmF0ZSB0aGUgcmVwb3NpdG9yeQotCQluZXcgR2VuZXJhdG9yKHByb3ZpZGVyKS5nZW5lcmF0ZSgpOwotCQlGaWxlW10gZmlsZXMgPSByZXBvTG9jYXRpb24ubGlzdEZpbGVzKCk7Ci0JCWJvb2xlYW4gamFyRmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJYm9vbGVhbiB4bWxGaWxlUHJlc2VudCA9IGZhbHNlOwotCQkvLyBvbmUgb2YgdGhlIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHNob3VsZCBiZSB0aGUgY29udGVudC54bWwuamFyCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgiY29udGVudC5qYXIiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWphckZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgiY29udGVudC54bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCXhtbEZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWphckZpbGVQcmVzZW50KSB7Ci0JCQlmYWlsKCJSZXBvc2l0b3J5IGRpZCBub3QgY3JlYXRlIEpBUiBmb3IgY29udGVudC54bWwiKTsKLQkJfQotCQlpZiAoeG1sRmlsZVByZXNlbnQpIHsKLQkJCWZhaWwoIlJlcG9zaXRvcnkgc2hvdWxkIG5vdCBjcmVhdGUgY29udGVudC54bWwiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiVGVzdFJlcG8iLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJTWFwIHByb3BlcnRpZXMgPSByZXBvLmdldFByb3BlcnRpZXMoKTsKLQkJLy9hdHRlbXB0aW5nIHRvIG1vZGlmeSB0aGUgcHJvcGVydGllcyBzaG91bGQgZmFpbAotCQl0cnkgewotCQkJcHJvcGVydGllcy5wdXQoVEVTVF9LRVksIFRFU1RfVkFMVUUpOwotCQkJZmFpbCgiU2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHByb3BlcnR5Iik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiVGVzdFJlcG8iLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCU1hcCBwcm9wZXJ0aWVzID0gcmVwby5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsICFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFRFU1RfS0VZKSk7Ci0JCXJlcG8uc2V0UHJvcGVydHkoVEVTVF9LRVksIFRFU1RfVkFMVUUpOwotCi0JCS8vdGhlIHByZXZpb3VzbHkgb2J0YWluZWQgcHJvcGVydGllcyBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHN1YnNlcXVlbnQgY2hhbmdlcwotCQlhc3NlcnRUcnVlKCIxLjEiLCAhcHJvcGVydGllcy5jb250YWluc0tleShURVNUX0tFWSkpOwotCQlwcm9wZXJ0aWVzID0gcmVwby5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVEVTVF9LRVkpKTsKLQotCQkvL2dvaW5nIGJhY2sgdG8gcmVwbyBtYW5hZ2VyLCBzaG91bGQgc3RpbGwgZ2V0IHRoZSBuZXcgcHJvcGVydHkKLQkJcmVwbyA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLnRvVVJMKCksIG51bGwpOwotCQlwcm9wZXJ0aWVzID0gcmVwby5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydFRydWUoIjEuMyIsIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVEVTVF9LRVkpKTsKLQotCQkvL3NldHRpbmcgYSBudWxsIHZhbHVlIHNob3VsZCByZW1vdmUgdGhlIGtleQotCQlyZXBvLnNldFByb3BlcnR5KFRFU1RfS0VZLCBudWxsKTsKLQkJcHJvcGVydGllcyA9IHJlcG8uZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRUcnVlKCIxLjQiLCAhcHJvcGVydGllcy5jb250YWluc0tleShURVNUX0tFWSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNvbXByZXNzZWRSZXBvc2l0b3J5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiVGVzdFJlcG8iLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCXJlcG8uc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCAiZmFsc2UiKTsKLQkJRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlcG8pOwotCQlwcm92aWRlci5pbml0aWFsaXplKHJlcG9Mb2NhdGlvbik7Ci0JCXByb3ZpZGVyLnNldFJvb3RWZXJzaW9uKCIzLjMiKTsKLQkJcHJvdmlkZXIuc2V0Um9vdElkKCJzZGsiKTsKLQkJcHJvdmlkZXIuc2V0Rmxhdm9yKCJ0b29saW5nIik7Ci0JCS8vIEdlbmVyYXRlIHRoZSByZXBvc2l0b3J5Ci0JCW5ldyBHZW5lcmF0b3IocHJvdmlkZXIpLmdlbmVyYXRlKCk7Ci0JCUZpbGVbXSBmaWxlcyA9IHJlcG9Mb2NhdGlvbi5saXN0RmlsZXMoKTsKLQkJYm9vbGVhbiBqYXJGaWxlUHJlc2VudCA9IGZhbHNlOwotCQkvLyBub25lIG9mIHRoZSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSBzaG91bGQgYmUgdGhlIGNvbnRlbnQueG1sLmphcgotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoImNvbnRlbnQuamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVzW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlqYXJGaWxlUHJlc2VudCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphckZpbGVQcmVzZW50KSB7Ci0JCQlmYWlsKCJSZXBvc2l0b3J5IHNob3VsZCBub3QgY3JlYXRlIEpBUiBmb3IgY29udGVudC54bWwiKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDAwZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlVSTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciBBUEkgb2Yge0BsaW5rIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcm90ZWN0ZWQgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlcjsKLQkvKioKLQkgKiBDb250YWlucyB0ZW1wIEZpbGUgaGFuZGxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IHRvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG9EZWxldGUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCWRlbGV0ZSgoRmlsZSkgaXQubmV4dCgpKTsKLQkJdG9EZWxldGUuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBZGRSZW1vdmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7Ci0JCVVSTCBsb2NhdGlvbiA9IHRlbXBGaWxlLnRvVVJMKCk7Ci0JCWFzc2VydFRydWUoIW1hbmFnZXJDb250YWlucyhsb2NhdGlvbikpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlhc3NlcnRUcnVlKG1hbmFnZXJDb250YWlucyhsb2NhdGlvbikpOwotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlhc3NlcnRUcnVlKCFtYW5hZ2VyQ29udGFpbnMobG9jYXRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0S25vd25SZXBvc2l0b3JpZXMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlpbnQgbm9uU3lzdGVtQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNKS5sZW5ndGg7Ci0JCWludCBzeXN0ZW1Db3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX1NZU1RFTSkubGVuZ3RoOwotCQlpbnQgYWxsQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpLmxlbmd0aDsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBhbGxDb3VudCwgbm9uU3lzdGVtQ291bnQgKyBzeXN0ZW1Db3VudCk7Ci0KLQkJLy9jcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQlGaWxlIHJlcG9Mb2NhdGlvbiA9IGdldFRlbXBMb2NhdGlvbigpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHRlc3RSZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlclRlc3QiLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZKTsKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHRlc3RSZXBvLmdldExvY2F0aW9uKCkpOwotCQlpbnQgbmV3Tm9uU3lzdGVtQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNKS5sZW5ndGg7Ci0JCWludCBuZXdTeXN0ZW1Db3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX1NZU1RFTSkubGVuZ3RoOwotCQlpbnQgbmV3QWxsQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpLmxlbmd0aDsKLQotCQkvL3RoZXJlIHNob3VsZCBiZSBvbmUgbW9yZSBub24tc3lzdGVtIHJlcG9zaXRvcnkKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCBub25TeXN0ZW1Db3VudCArIDEsIG5ld05vblN5c3RlbUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCBzeXN0ZW1Db3VudCwgbmV3U3lzdGVtQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIGFsbENvdW50ICsgMSwgbmV3QWxsQ291bnQpOwotCi0JCS8vbWFrZSB0aGUgcmVwb3NpdG9yeSBhIHN5c3RlbSByZXBvc2l0b3J5Ci0JCXRlc3RSZXBvLnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0KLQkJLy90aGVyZSBzaG91bGQgYmUgb25lIG1vcmUgc3lzdGVtIHJlcG9zaXRvcnkKLQkJbmV3Tm9uU3lzdGVtQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNKS5sZW5ndGg7Ci0JCW5ld1N5c3RlbUNvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfU1lTVEVNKS5sZW5ndGg7Ci0JCW5ld0FsbENvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKS5sZW5ndGg7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgbm9uU3lzdGVtQ291bnQsIG5ld05vblN5c3RlbUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCBzeXN0ZW1Db3VudCArIDEsIG5ld1N5c3RlbUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjIiLCBhbGxDb3VudCArIDEsIG5ld0FsbENvdW50KTsKLQotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEgbG9jYWwgY2FjaGUgd2hlbiBjb250YWN0aW5nIGEgbG9jYWwgbWV0YWRhdGEgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFDYWNoaW5nTG9jYWxSZXBvKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJRmlsZSByZXBvTG9jYXRpb24gPSBnZXRUZW1wTG9jYXRpb24oKTsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgZGF0YUFyZWEgPSBhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvY2FjaGUvIik7Ci0JCUZpbGUgZGF0YUFyZWFGaWxlID0gVVJMVXRpbC50b0ZpbGUoZGF0YUFyZWEpOwotCQlGaWxlIGNhY2hlRmlsZVhNTCA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgImNvbnRlbnQiICsgcmVwb0xvY2F0aW9uLmhhc2hDb2RlKCkgKyAiLnhtbCIpOwotCQlGaWxlIGNhY2hlRmlsZUpBUiA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgImNvbnRlbnQiICsgcmVwb0xvY2F0aW9uLmhhc2hDb2RlKCkgKyAiLmphciIpOwotCi0JCS8vIGNyZWF0ZSBhIGxvY2FsIHJlcG9zaXRvcnkKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSB0ZXN0UmVwbyA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgIk1ldGFkYXRhUmVwb3NpdG9yeUNhY2hpbmdUZXN0IiwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSk7Ci0JCW1hbmFnZXIubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLnRvVVJMKCksIG51bGwpOwotCi0JCS8vIGNoZWNrIHRoYXQgYSBsb2NhbCBjYWNoZSB3YXMgbm90IGNyZWF0ZWQKLQkJYXNzZXJ0RmFsc2UoIkNhY2hlIGZpbGUgd2FzIGNyZWF0ZWQuIiwgY2FjaGVGaWxlWE1MLmV4aXN0cygpIHx8IGNhY2hlRmlsZUpBUi5leGlzdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhhdCBsb2NhbCBjYWNoaW5nIG9mIHJlbW90ZSBtZXRhZGF0YSByZXBvc2l0b3JpZXMgd29ya3MsIGFuZCB0aGF0IHRoZQotCSAqIGNhY2hlIGlzIHVwZGF0ZWQgd2hlbiBpdCBiZWNvbWVzIHN0YWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUNhY2hpbmdSZW1vdGVSZXBvKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJVVJMIHJlcG9Mb2NhdGlvbiA9IG5ldyBVUkwoImh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL3Rlc3RVcGRhdGVzLyIpOwotCQlBZ2VudExvY2F0aW9uIGFnZW50TG9jYXRpb24gPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVVSTCBkYXRhQXJlYSA9IGFnZW50TG9jYXRpb24uZ2V0RGF0YUFyZWEoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9jYWNoZS8iKTsKLQkJRmlsZSBkYXRhQXJlYUZpbGUgPSBVUkxVdGlsLnRvRmlsZShkYXRhQXJlYSk7Ci0JCUZpbGUgY2FjaGVGaWxlWE1MID0gbmV3IEZpbGUoZGF0YUFyZWFGaWxlLCAiY29udGVudCIgKyByZXBvTG9jYXRpb24uaGFzaENvZGUoKSArICIueG1sIik7Ci0JCUZpbGUgY2FjaGVGaWxlSkFSID0gbmV3IEZpbGUoZGF0YUFyZWFGaWxlLCAiY29udGVudCIgKyByZXBvTG9jYXRpb24uaGFzaENvZGUoKSArICIuamFyIik7Ci0JCUZpbGUgY2FjaGVGaWxlOwotCi0JCS8vIGxvYWQgYSByZW1vdGUgcmVwb3NpdG9yeSBhbmQgY2hlY2sgdGhhdCBhIGxvY2FsIGNhY2hlIHdhcyBjcmVhdGVkCi0JCW1hbmFnZXIubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2FjaGUgZmlsZSB3YXMgbm90IGNyZWF0ZWQuIiwgY2FjaGVGaWxlWE1MLmV4aXN0cygpIHx8IGNhY2hlRmlsZUpBUi5leGlzdHMoKSk7Ci0JCWlmIChjYWNoZUZpbGVYTUwuZXhpc3RzKCkpCi0JCQljYWNoZUZpbGUgPSBjYWNoZUZpbGVYTUw7Ci0JCWVsc2UKLQkJCWNhY2hlRmlsZSA9IGNhY2hlRmlsZUpBUjsKLQotCQkvLyBtb2RpZnkgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSB0byBiZSBvbGRlciB0aGFuIHRoZSByZW1vdGUgZmlsZQotCQljYWNoZUZpbGUuc2V0TGFzdE1vZGlmaWVkKDApOwotCQkvLyByZWxvYWQgdGhlIHJlcG9zaXRvcnkgYW5kIGNoZWNrIHRoYXQgdGhlIGNhY2hlIHdhcyB1cGRhdGVkCi0JCW1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24pOwotCQltYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbiwgbnVsbCk7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkID0gY2FjaGVGaWxlLmxhc3RNb2RpZmllZCgpOwotCQlhc3NlcnRUcnVlKDAgIT0gbGFzdE1vZGlmaWVkKTsKLQotCQkvLyByZWxvYWQgdGhlIHJlcG9zaXRvcnkgYW5kIGNoZWNrIHRoYXQgdGhlIGNhY2hlIHdhcyBub3QgdXBkYXRlZAotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkocmVwb0xvY2F0aW9uKTsKLQkJbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24sIG51bGwpOwotCQlhc3NlcnRUcnVlKGxhc3RNb2RpZmllZCA9PSBjYWNoZUZpbGUubGFzdE1vZGlmaWVkKCkpOwotCi0JCWNhY2hlRmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbm9uLWV4aXN0ZW50IGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIHRlbXBvcmFyeQotCSAqIGZpbGUgb3IgZGlyZWN0b3J5LiBUaGUgbG9jYXRpb24gd2lsbCBiZSBkZWxldGVkIGluIHRoZSB0ZXN0IHRlYXJEb3duIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0VGVtcExvY2F0aW9uKCkgewotCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOwotCQlGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUodGVtcERpciwgIk1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0Iik7Ci0JCWRlbGV0ZSh0ZW1wRmlsZSk7Ci0JCWFzc2VydFRydWUoIXRlbXBGaWxlLmV4aXN0cygpKTsKLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlQWRkUmVtb3ZlKCkgewotCQl0cnkgewotCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KG51bGwpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB7QGxpbmsgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJ9IGNvbnRhaW5zIGEgcmVmZXJlbmNlCi0JICogdG8gYSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWFuYWdlckNvbnRhaW5zKFVSTCBsb2NhdGlvbikgewotCQlVUkxbXSBsb2NhdGlvbnMgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2F0aW9uc1tpXS5lcXVhbHMobG9jYXRpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BbGxPcHRpb25hbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsT3B0aW9uYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1OWFiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BbGxPcHRpb25hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFsbE9wdGlvbmFsIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGUxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFDID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQ1swXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQ1sxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJFIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFDKTsKLQkJZDEgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJZTEgPSBjcmVhdGVJVSgiRSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMSwgZDEsIGUxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGMxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZDEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBlMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGxhbi5nZXRPcGVyYW5kcygpLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocGxhbi5nZXRPcGVyYW5kcygpW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q4YzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBwbGFubmVyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFsbE9wdGlvbmFsLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFub3RoZXJTaW5nbGV0b24uY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVnMjA3MzE5LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERlcGVuZGVuY3lPblNlbGYuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRHJvcGluc1NjZW5hcmlvLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdyZWVkeVJlcXVpcmVtZW50LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElVV2l0aEZpbHRlci5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJVVdpdGhGaWx0ZXIyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pbmltYWxJbnN0YWxsLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdEZXBlbmRlbmN5LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdEZXBlbmRlbmN5Mi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXNzaW5nRGVwZW5kZW5jeTMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdOb25HcmVlZHlSZXF1aXJlbWVudDIuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ09wdGlvbmFsLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdPcHRpb25hbE5vbkdyZWVkeVJlcXVpcmVtZW50LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczIuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTXVsdGlwbGVQcm92aWRlci5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aXBsZVNpbmdsZXRvbi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOb1JlcXVpcmVtZW50cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVPcHRpb25hbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlT3B0aW9uYWxUZXN0Mi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVPcHRpb25hbFRlc3QzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVNpbmdsZXRvbi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShVbmluc3RhbGxFdmVyeXRoaW5nLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Bbm90aGVyU2luZ2xldG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Bbm90aGVyU2luZ2xldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTg5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQW5vdGhlclNpbmdsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFub3RoZXJTaW5nbGV0b24gZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlJSW5zdGFsbGFibGVVbml0IGEzOwotCUlJbnN0YWxsYWJsZVVuaXQgYTQ7Ci0JSUluc3RhbGxhYmxlVW5pdCB1LCB2LCB3LCB4LCB5LCB6OwotCi0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQlhMiA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjMSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJeCA9IGNyZWF0ZUlVKCJYIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7YzF9KTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMi4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCXkgPSBjcmVhdGVJVSgiWSIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2MyfSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgeCwgeX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3gsIHl9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0J1ZzIwNzMxOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQnVnMjA3MzE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NmRiYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQnVnMjA3MzE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQnVnMjA3MzE5IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGEsIGIsIGM7Ci0KLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpKTsKLQkJYiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSl9KTsKLQkJYyA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwpKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EsIGIsIGN9KTsKLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoQnVnMjA3MzE5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnN1cmVBTmV2ZXJJbnN0YWxsZWQoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Yn0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgZGlyZWN0b3IucHJvdmlzaW9uKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQiBpcyBtaXNzaW5nIiwgcHJvZmlsZSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Yn0pOwotCQlhc3NlcnROb3RJVXMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YX0sIHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCkpOwotCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxMiwgbnVsbCwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQiBhbmQgQyBhcmUgbWlzc2luZyIsIHByb2ZpbGUsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IsIGN9KTsKLQkJYXNzZXJ0Tm90SVVzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9LCBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0RlcGVuZGVuY3lPblNlbGYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0RlcGVuZGVuY3lPblNlbGYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlYWJkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9EZXBlbmRlbmN5T25TZWxmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIERlcGVuZGVuY3lPblNlbGYgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0KLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwpKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKERlcGVuZGVuY3lPblNlbGYuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvRHJvcGluc1NjZW5hcmlvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Ecm9waW5zU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0YjVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Ecm9waW5zU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBEcm9waW5zU2NlbmFyaW8gZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTA7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMDsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhczsKLQlJSW5zdGFsbGFibGVVbml0IGJzOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTAgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIwLjAuMCIpLCB0cnVlKTsKLQkJYjAgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIwLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMC4wLjAsIDEuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfTsKLQkJYXMgPSBjcmVhdGVJVSgiQVMiLCBuZXcgVmVyc2lvbigiMC4wLjAiKSwgcmVxQXMpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUJzID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlswLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSl9OwotCQlicyA9IGNyZWF0ZUlVKCJCUyIsIG5ldyBWZXJzaW9uKCIwLjAuMCIpLCByZXFCcyk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYTAsIGIwLCBhcywgYnN9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthcywgYnN9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvR3JlZWR5UmVxdWlyZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0dyZWVkeVJlcXVpcmVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWI3MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvR3JlZWR5UmVxdWlyZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBHcmVlZHlSZXF1aXJlbWVudCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUIpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFDWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFDKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJLy9UaGUgcGxhbiBjb250YWlucyBCIGJlY2F1c2UgdGhlIHJlcXVpcmVtZW50IGZyb20gQSBvbiBCIGlzIG5vbiBncmVlZHksIGJ1dCB3ZSBhcmUgaW5zdGFsbGluZyBDIHRoYXQgaGFzIGEgZ3JlZWR5IHJlcXVpcmVtZW50IG9uIHRoZSBCCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGMxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JVVdpdGhGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0lVV2l0aEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU4YTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0lVV2l0aEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBJVVdpdGhGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0KLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXVkID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdWQuc2V0SWQoIkEiKTsKLQkJaXVkLnNldFZlcnNpb24obmV3IFZlcnNpb24oIjEuMC4wIikpOwotCQlpdWQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCkpOwotCQlpdWQuc2V0QXBwbGljYWJpbGl0eUZpbHRlcigiKGludmFsaWQ9dHJ1ZSkiKTsKLQkJaXVkLnNldEZpbHRlcigiKGludmFsaWQ9dHJ1ZSkiKTsKLQkJYTEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1ZCk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZShJVVdpdGhGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVXaXRoRmlsdGVyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVXaXRoRmlsdGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTAyYmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0lVV2l0aEZpbHRlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSVVXaXRoRmlsdGVyMiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMSwgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFzWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgcmVxcyk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxc0EyID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxc0EyWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsLCB0cnVlLCBmYWxzZSk7Ci0JCWEyID0gY3JlYXRlSVUoIkEiLCByZXFzQTIpOwotCi0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgIihpbnZhbGlkPXRydWUpIiwgTk9fUFJPVklERVMpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYTIsIGIxfSk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKElVV2l0aEZpbHRlcjIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEExKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEEyKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EyfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaW5pbWFsSW5zdGFsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWluaW1hbEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwNzYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaW5pbWFsSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pbmltYWxJbnN0YWxsIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjOwotCi0JSVByb2ZpbGUgcHJvZmlsZTsKLQlJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbnVsbCkpOwotCi0JCWIxID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWIxMSA9IGNyZWF0ZUlVKCJCMSIsIG5ldyBWZXJzaW9uKCIxLjEuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDMuMC4wKSIpLCBudWxsKSwgTk9fUFJPUEVSVElFUywgdHJ1ZSk7Ci0KLQkJYyA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIHRydWUpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIxMSwgY30pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQTEoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcxYWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWlzc2luZ0RlcGVuZGVuY3kgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQkvL01pc3Npbmcgbm9uIG9wdGlvbmFsIGRlcGVuZGVuY3kKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRyYWRpY3Rpb24oKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ2YzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdEZXBlbmRlbmN5MiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxQVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxQSk7Ci0KLQkJLy9NaXNzaW5nIG9wdGlvbmFsIGRlcGVuZGVuY3kKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udHJhZGljdGlvbigpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ0RlcGVuZGVuY3kzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMDUwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nRGVwZW5kZW5jeTMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JLy9UaGlzIHRlc3RzIHRoYXQgQSBjYW4gc3RpbGwgYmUgcmVzb2x2ZWQgYW5kIGluc3RhbGxlZAotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFBWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUEpOwotCi0JCS8vTWlzc2luZyBkZXBlbmRlbmN5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250cmFkaWN0aW9uKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0NjJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMl07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJcmVxQlsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJLy9UaGUgcGxhbm5lciByZXR1cm5zIGFuIGVycm9yIGJlY2F1c2UgdGhlIHJlcXVpcmVtZW50IGZyb20gQSBvbiBCIGlzIG5vbiBncmVlZHkgYW5kIG5vIG9uZSBicmluZ3MgaW4gQgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTM0NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdOb25HcmVlZHlSZXF1aXJlbWVudDIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMl07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJcmVxQlsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQkvL1RoZSBwbGFubmVyIHJldHVybnMgYW4gZXJyb3IgYmVjYXVzZSB0aGUgcmVxdWlyZW1lbnQgZnJvbSBBIG9uIEIgaXMgbm9uIGdyZWVkeSBhbmQgbm8gb25lIGJyaW5ncyBpbiBCLgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdhZTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdPcHRpb25hbCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJZCA9IGNyZWF0ZUlVKCJEIiwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBkfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMSk7IC8vVEhJUyBNYXkgbm90IGJlIGluCi0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbE5vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxOb25HcmVlZHlSZXF1aXJlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlhOWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbE5vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWlzc2luZ09wdGlvbmFsTm9uR3JlZWR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUIpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCS8vVGhlIHBsYW4gZG9lcyBub3QgY29udGFpbnMgQiBiZWNhdXNlIHRoZSByZXF1aXJlbWVudCBmcm9tIEEgb24gQiBpcyBub24gZ3JlZWR5IGFuZCBubyBvbmUgYnJpbmdzIGluIEIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4sIGIxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGZkYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGQ7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJLy9CJ3MgZGVwZW5kZW5jeSBpcyBtaXNzaW5nCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUIgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzJdOwotCQlyZXFCWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzJdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlkID0gY3JlYXRlSVUoIkQiLCByZXEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGR9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJLy9FbnN1cmUgdGhhdCBEJ3MgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZhaWwgYmVjYXVzZSBvZiBDJ3MgYWJzZW5jZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2R9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjk2ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMiA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgb24gQyBjYW4gbm90IGJlIHNhdGlzZmllZAotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFCID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQlswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMl0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMi4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWQgPSBjcmVhdGVJVSgiRCIsIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYzEsIGMyLCBkfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWUwNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMyBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMiA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgb24gQyBjYW4gbm90IGJlIHNhdGlzZmllZAotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFCID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQlswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZCA9IGNyZWF0ZUlVKCJEIiwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMSwgYzIsIGR9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJLy9FbnN1cmUgdGhhdCBEJ3MgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZhaWwgYmVjYXVzZSBvZiBDJ3MgYWJzZW5jZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2R9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGMyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbGFuLmdldE9wZXJhbmRzKCkubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwbGFuLmdldE9wZXJhbmRzKClbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTXVsdGlwbGVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTXVsdGlwbGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM4N2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL011bHRpcGxlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTM7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTQ7Ci0KLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQjEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBudWxsKSk7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYjExID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuMS4wIiksIHRydWUpOwotCi0JCWIxMiA9IGNyZWF0ZUlVKCJCMSIsIG5ldyBWZXJzaW9uKCIxLjIuMCIpLCB0cnVlKTsKLQotCQliMTMgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS4zLjAiKSwgdHJ1ZSk7Ci0KLQkJYjE0ID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuNC4wIiksIHRydWUpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIxMSwgYjEyLCBiMTMsIGIxNH0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NdWx0aXBsZVNpbmdsZXRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTXVsdGlwbGVTaW5nbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhYzg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NdWx0aXBsZVNpbmdsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZVNpbmdsZXRvbiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGEyOwotCUlJbnN0YWxsYWJsZVVuaXQgYTM7Ci0JSUluc3RhbGxhYmxlVW5pdCBhNDsKLQlJSW5zdGFsbGFibGVVbml0IHUsIHYsIHcsIHgsIHksIHo7Ci0KLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWEyID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTMgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIzLjAuMCIpLCBmYWxzZSk7Ci0KLQkJYTQgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCI0LjAuMCIpLCBmYWxzZSk7Ci0KLQkJeCA9IGNyZWF0ZUlVKCJYIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgNC4xLjApIiksIG51bGwpKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJeSA9IGNyZWF0ZUlVKCJZIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7YzEsIGMyfSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGMzID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMy4wLjAsIDMuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzQgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIls0LjAuMCwgNC4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCXogPSBjcmVhdGVJVSgiWiIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2MzLCBjNH0pOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjNSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGM2ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMy4wLjAsIDMuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl3ID0gY3JlYXRlSVUoIlciLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjNSwgYzZ9KTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzcgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjOCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzMuMC4wLCA0LjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJdiA9IGNyZWF0ZUlVKCJWIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7Yzd9KTsKLQkJdSA9IGNyZWF0ZUlVKCJVIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7Yzh9KTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGEyLCBhMywgYTQsIHcsIHgsIHksIHp9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuTXVsdGlwbGVTaW5nbGV0b24iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3h9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QyKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3l9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QzKCkgewotCQkvL1Rlc3QgdGhhdCB3ZSBjYW4gaW5zdGFsbCBBMyBhbmQgQTQgdG9nZXRoZXIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt6fSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLQkJLy9FbnN1cmUgdGhhdCBBMSBhbmQgQTMgY2FuJ3QgYmUgaW5zdGFsbGVkIHRvZ2V0aGVyIHNpbmNlIG9uZSBpcyBzaW5nbGV0b24gYW5kIHRoZSBvdGhlciBub3QKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt3fSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0NWIoKSB7Ci0JCS8vVmFsaWRhdGUgdGhlIHNldHVwCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDVjKCkgewotCQkvL1ZhbGlkYXRlIHRoZSBzZXR1cAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3Z9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Q1KCkgewotCQkvL0Vuc3VyZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3UsIHZ9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL05vUmVxdWlyZW1lbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Ob1JlcXVpcmVtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA3ZjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL05vUmVxdWlyZW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE5vUmVxdWlyZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCi0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsKSk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZShOb1JlcXVpcmVtZW50cy5jbGFzcy5nZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc4YTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZU9wdGlvbmFsVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JLy9BIGRlcCBCIG9wLCBDLCBEIG9wIAotCS8vWCBkZXAgQgotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgaXMgbWlzc2luZwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxQVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZTk2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlT3B0aW9uYWxUZXN0MiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIzOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGQxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkMjsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgeDE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHkxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCB6MTsKLQotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQliMiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCQliMyA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjMuMC4wIiksIHRydWUpOwotCi0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0JCWMyID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJZDEgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJZDIgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQl5MSA9IGNyZWF0ZUlVKCJZIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCXoxID0gY3JlYXRlSVUoIloiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJLy9CJ3MgZGVwZW5kZW5jeSBpcyBtaXNzaW5nCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFBWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJZIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJaIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJeDEgPSBjcmVhdGVJVSgiWCIsIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjIsIGIzLCBjMSwgYzIsIGQxLCBkMiwgeDEsIHoxLCB5MX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbGF0aW9uKCkgewotCQkvL0Vuc3VyZSB0aGF0IEQncyBpbnN0YWxsYXRpb24gZG9lcyBub3QgZmFpbCBiZWNhdXNlIG9mIEMncyBhYnNlbmNlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHgxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgeTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCB6MSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIHgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmY4YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlT3B0aW9uYWxUZXN0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZU9wdGlvbmFsVGVzdDMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMzsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHgxOwotCi0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0JCWIyID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0JCWIzID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMy4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJYzIgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlkMSA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQlkMiA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgaXMgbWlzc2luZwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVszXTsKLQkJcmVxQVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcUFbMl0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxQSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQl4MSA9IGNyZWF0ZUlVKCJYIiwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBiMiwgYjMsIGMxLCBjMiwgZDEsIGQyLCB4MX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbGF0aW9uKCkgewotCQkvL0Vuc3VyZSB0aGF0IEQncyBpbnN0YWxsYXRpb24gZG9lcyBub3QgZmFpbCBiZWNhdXNlIG9mIEMncyBhYnNlbmNlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHgxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQyKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgeDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZVNpbmdsZXRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlU2luZ2xldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTllZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlU2luZ2xldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2luZ2xldG9uIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMzsKLQlJSW5zdGFsbGFibGVVbml0IGE0OwotCUlJbnN0YWxsYWJsZVVuaXQgdSwgdiwgdywgeCwgeSwgejsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTIgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJeSA9IGNyZWF0ZUlVKCJZIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7YzEsIGMyfSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgeX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3l9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1VuaW5zdGFsbEV2ZXJ5dGhpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1VuaW5zdGFsbEV2ZXJ5dGhpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ODJlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Vbmluc3RhbGxFdmVyeXRoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFVuaW5zdGFsbEV2ZXJ5dGhpbmcgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTsKLQotCUlEaXJlY3RvciBkaXJlY3RvcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIikpOwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YX0pOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZShCdWcyMDczMTkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXEsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkEgaXMgbWlzc2luZyIsIHByb2ZpbGUsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9KTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEyLnJlbW92ZUluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgZGlyZWN0b3IucHJvdmlzaW9uKHJlcTIsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnROb3RJVXMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YX0sIHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQ5YzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5zYXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgc2FyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2FyVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OGFlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2FyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLkRpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBUZXN0IHRoZSA8Y29kZT5EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW08L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1QxMUJZVEVTID0gImp1c3QxMWJ5dGVzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxFVkVOID0gSlVTVDExQllURVMuZ2V0Qnl0ZXMoKS5sZW5ndGg7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBjb25zdHJhaW50cyBvZiB0aGUgREJBT1MKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERCQU9TQ29uc3RyYWludHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKLQkJb3V0LndyaXRlKEpVU1QxMUJZVEVTLmdldEJ5dGVzKCkpOwotCQlhc3NlcnRFcXVhbHMoRUxFVkVOLCBvdXQuZ2V0QnVmZmVyTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRUxFVkVOLCBvdXQudG9CeXRlQXJyYXkoKS5sZW5ndGgpOwotCQlhc3NlcnROb3RTYW1lKG91dC50b0J5dGVBcnJheSgpLCBvdXQuZ2V0QnVmZmVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAyNCwgb3V0LmdldEJ1ZmZlcigpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhKVVNUMTFCWVRFUywgbmV3IFN0cmluZyhvdXQuZ2V0QnVmZmVyKCksIDAsIG91dC5nZXRCdWZmZXJMZW5ndGgoKSkpOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG91dC5nZXRJbnB1dFN0cmVhbSgpOwotCQlhc3NlcnRFcXVhbHMoRUxFVkVOLCBpbi5hdmFpbGFibGUoKSk7Ci0JCWJ5dGVbXSBlbGV2ZW5CeXRlcyA9IG5ldyBieXRlW0VMRVZFTl07Ci0JCWluLnJlYWQoZWxldmVuQnl0ZXMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoSlVTVDExQllURVMuZ2V0Qnl0ZXMoKSwgZWxldmVuQnl0ZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvU2FyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9TYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTcyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9TYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNhcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5TYXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdERhdGE7Ci0KLS8qKgotICogVGVzdCB0aGUgc2FyIHN0dWZmLgotICovCi1wdWJsaWMgY2xhc3MgU2FyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlc3REYXRhTkphckFuZFNhckZyb21KYXIzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUlucHV0U3RyZWFtIGphcjMyID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLmphciIpOwotCS8vCQlnZW5lcmF0ZU5KYXJBbmRTYXIoIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMCIsIGphcjMyKTsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVUZXN0RGF0YU5KYXJBbmRTYXJGcm9tSmFyMzMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vCQlJbnB1dFN0cmVhbSBqYXIzMiA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5qYXIiKTsKLQkvLwkJZ2VuZXJhdGVOSmFyQW5kU2FyKCJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAiLCBqYXIzMik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTkphckFuZFNhcihTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gamFyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vCQlGaWxlIG5qYXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKG5hbWUsICIubmphciIpOwotCS8vCQlPdXRwdXRTdHJlYW0gbmphck91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShuamFyKSk7Ci0JLy8KLQkvLwkJU2FyVXRpbC5ub3JtYWxpemUoamFyLCBuamFyT3V0KTsKLQkvLwotCS8vCQlGaWxlIHNhciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUobmFtZSwgIi5zYXIiKTsKLQkvLwkJU2FyVXRpbC56aXBUb1NhcihuamFyLCBzYXIpOwotCS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXJUb1NhckZvckpkdDMyMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGpkdDMyMEphciA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphciIpOwotCQlJbnB1dFN0cmVhbSBqZHQzMjBTYXIgPSBUZXN0RGF0YS5nZXQoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuc2FyIik7Ci0JCWRvSmFyVG9TYXIoamR0MzIwSmFyLCBqZHQzMjBTYXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXJUb0phckZvckpkdDMyMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGpkdDMyMFNhciA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIiKTsKLQkJSW5wdXRTdHJlYW0gamR0MzIwSmFyID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyIik7Ci0JCWRvU2FyVG9KYXIoamR0MzIwU2FyLCBqZHQzMjBKYXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXJUb1NhckZvckpkdDMzMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGpkdDMzMEphciA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphciIpOwotCQlJbnB1dFN0cmVhbSBqZHQzMzBTYXIgPSBUZXN0RGF0YS5nZXQoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyIik7Ci0JCWRvSmFyVG9TYXIoamR0MzMwSmFyLCBqZHQzMzBTYXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXJUb0phckZvckpkdDMzMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGpkdDMzMFNhciA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIiKTsKLQkJSW5wdXRTdHJlYW0gamR0MzMwSmFyID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5uamFyIik7Ci0JCWRvU2FyVG9KYXIoamR0MzMwU2FyLCBqZHQzMzBKYXIpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9KYXJUb1NhcihJbnB1dFN0cmVhbSBqYXIsIElucHV0U3RyZWFtIGV4cGVjdGVkU2FyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNhciA9IFRlc3REYXRhLmNyZWF0ZVRlbXBGaWxlKCJkb0phclRvU2FyLnNhciIpOwotCQlPdXRwdXRTdHJlYW0gc2FyT3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNhcikpOwotCi0JCVNhclV0aWwuemlwVG9TYXIoamFyLCBzYXJPdXQpOwotCi0JCUlucHV0U3RyZWFtIHNhckluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzYXIpKTsKLQkJVGVzdERhdGEuYXNzZXJ0RXF1YWxzKHNhckluLCBleHBlY3RlZFNhcik7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1NhclRvSmFyKElucHV0U3RyZWFtIHNhciwgSW5wdXRTdHJlYW0gZXhwZWN0ZWRKYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgamFyID0gVGVzdERhdGEuY3JlYXRlVGVtcEZpbGUoImRvU2FyVG9KYXIuamFyIik7Ci0JCU91dHB1dFN0cmVhbSBqYXJPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyKSk7Ci0KLQkJU2FyVXRpbC5zYXJUb1ppcChzYXIsIGphck91dCk7Ci0KLQkJSW5wdXRTdHJlYW0gamFySW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGphcikpOwotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMoamFySW4sIGV4cGVjdGVkSmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFppcFRvU2FyQW5kQmFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgb3JpZ2luYWxaaXBGaWxlID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJ0ZXN0LnppcCIpOwotCQlGaWxlIHNhckZpbGUgPSBUZXN0RGF0YS5jcmVhdGVUZW1wRmlsZSgidGVzdC5zYXIiKTsKLQkJRmlsZSByZWNyZWF0ZWRaaXBGaWxlID0gVGVzdERhdGEuY3JlYXRlVGVtcEZpbGUoInRlc3QuemlwIik7Ci0KLQkJbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJU2FyVXRpbC56aXBUb1NhcihvcmlnaW5hbFppcEZpbGUsIHNhckZpbGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInppcFRvU2FyIHRvb2s6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmUpKTsKLQotCQliZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJU2FyVXRpbC5zYXJUb1ppcChzYXJGaWxlLCByZWNyZWF0ZWRaaXBGaWxlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXJUb1ppcCB0b29rOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlKSk7Ci0KLQkJVGVzdERhdGEuYXNzZXJ0RXF1YWxzKG9yaWdpbmFsWmlwRmlsZSwgcmVjcmVhdGVkWmlwRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVPbkZpbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBhbGllblppcCA9IFRlc3REYXRhLmdldFRlbXBGaWxlKCJzYXIiLCAiYWxpZW4uemlwIik7Ci0KLQkJRmlsZSBub3JtYWxpemVkQWxpZW5aaXAgPSBUZXN0RGF0YS5jcmVhdGVUZW1wRmlsZSgibm9ybWFsaXplZGFsaWVuLnppcCIpOwotCQlTYXJVdGlsLm5vcm1hbGl6ZShhbGllblppcCwgbm9ybWFsaXplZEFsaWVuWmlwKTsKLQotCQlhc3NlcnRUcnVlKGFsaWVuWmlwLmxlbmd0aCgpICE9IG5vcm1hbGl6ZWRBbGllblppcC5sZW5ndGgoKSk7Ci0KLQkJRmlsZSByZW5vcm1hbGl6ZWRBbGllblppcCA9IFRlc3REYXRhLmNyZWF0ZVRlbXBGaWxlKCJyZW5vcm1hbGl6ZWRhbGllbi56aXAiKTsKLQkJU2FyVXRpbC5ub3JtYWxpemUobm9ybWFsaXplZEFsaWVuWmlwLCByZW5vcm1hbGl6ZWRBbGllblppcCk7Ci0KLQkJVGVzdERhdGEuYXNzZXJ0RXF1YWxzKG5vcm1hbGl6ZWRBbGllblppcCwgcmVub3JtYWxpemVkQWxpZW5aaXApOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplT25TdHJlYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGFsaWVuWmlwID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAiYWxpZW4uemlwIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBub3JtYWxpemVkQWxpZW5aaXAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZW5vcm1hbGl6ZWRBbGllblppcCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCVNhclV0aWwubm9ybWFsaXplKGFsaWVuWmlwLCBub3JtYWxpemVkQWxpZW5aaXApOwotCi0JCQlTYXJVdGlsLm5vcm1hbGl6ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obm9ybWFsaXplZEFsaWVuWmlwLnRvQnl0ZUFycmF5KCkpLCByZW5vcm1hbGl6ZWRBbGllblppcCk7Ci0KLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhub3JtYWxpemVkQWxpZW5aaXAudG9CeXRlQXJyYXkoKSwgcmVub3JtYWxpemVkQWxpZW5aaXAudG9CeXRlQXJyYXkoKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFsaWVuWmlwICE9IG51bGwpCi0JCQkJYWxpZW5aaXAuY2xvc2UoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2ltcGxlY29uZmlndXJhdG9yL0J1bmRsZXNUeHRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2ltcGxlY29uZmlndXJhdG9yL0J1bmRsZXNUeHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmIwNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3NpbXBsZWNvbmZpZ3VyYXRvci9CdW5kbGVzVHh0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUmVkIEhhdCwgSW5jLiAtIHRlc3RzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5zaW1wbGVjb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbWJlZGRlZGVxdWlub3guRW1iZWRkZWRFcXVpbm94OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlc1R4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0Jc3RhdGljIFN0cmluZyBCVU5ETEVfSkFSX0RJUkVDVE9SWSA9ICJidW5kbGVzVHh0IjsKLQlpbnQgbnVtQnVuZGxlcyA9IC0xOwotCUVtYmVkZGVkRXF1aW5veCBlcXVpbm94ID0gbnVsbDsKLQlCdW5kbGVDb250ZXh0IGVxdWlub3hDb250ZXh0ID0gbnVsbDsKLQlGaWxlW10gYnVuZGxlSmFycyA9IG51bGw7Ci0JRmlsZSBidW5kbGVzVHh0ID0gbnVsbDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZXF1aW5veC5zaHV0ZG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVzVHh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgc2ltcGxlY29uZmlndXJhdG9yRGF0YURpciA9IFRlc3REYXRhLmdldEZpbGUoQlVORExFX0pBUl9ESVJFQ1RPUlksICIiKTsKLQkJYnVuZGxlSmFycyA9IGdldEJ1bmRsZUphcnMoc2ltcGxlY29uZmlndXJhdG9yRGF0YURpcik7Ci0KLQkJbnVtQnVuZGxlcyA9IGJ1bmRsZUphcnMubGVuZ3RoOwotCi0JCS8vIENyZWF0ZSBhIHRlc3QgYnVuZGxlcy5pbmZvCi0JCWNyZWF0ZUJ1bmRsZXNUeHQoKTsKLQotCQkvLyBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyB0aGlzIGlzIGp1c3QgdXNpbmcgYW4gaW5zdGFsbC5hcmVhIGFuZCBjb25maWd1cmF0aW9uLmFyZWEgbG9jYXRlZAotCQkvLyBpbiB0aGUgbG9jYWwgYnVuZGxlIGRhdGEgYXJlYS4gIEZvciBwMiB0ZXN0aW5nIHlvdSB3aWxsIHdhbnQgdG8gcG9pbnQgdGhpcyB0byB5b3VyIG93biBwcm9wZXJ0aWVzCi0JCUZpbGUgaW5zdGFsbGFyZWEgPSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0RGF0YUZpbGUoImVjbGlwc2UiKTsKLQkJRmlsZSBjb25maWdhcmVhID0gbmV3IEZpbGUoaW5zdGFsbGFyZWEsICJjb25maWd1cmF0aW9uIik7Ci0KLQkJRmlsZSBzaW1wbGVDb25maWd1cmF0b3JCdW5kbGUgPSBnZXRTaW1wbGVDb25maWd1cmF0b3JCdW5kbGUoKTsKLQkJVVJMIG9zZ2lCdW5kbGUgPSBnZXRGcmFtZXdvcmtCdW5kbGUoKTsKLQotCQlNYXAgZnJhbWV3b3JrUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIG5vdGUgdGhhdCBhbnkgcHJvcGVydGllcyB5b3UgZG8gbm90IHdhbnQgdG8gYmUgaW5oZXJpdGVkIGZyb20gdGhlIGhvc3RpbmcgRXF1aW5veCB3aWxsIG5lZWQKLQkJLy8gdG8gYmUgbnVsbGVkIG91dC4gIE90aGVyd2lzZSB5b3Ugd2lsbCBwaWNrIHRoZW0gdXAgZnJvbSB0aGUgaG9zdGluZyBlbnYuCi0JCWZyYW1ld29ya1Byb3BlcnRpZXMucHV0KCJvc2dpLmZyYW1ld29yayIsIG51bGwpOwotCQlmcmFtZXdvcmtQcm9wZXJ0aWVzLnB1dCgib3NnaS5pbnN0YWxsLmFyZWEiLCBpbnN0YWxsYXJlYS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlmcmFtZXdvcmtQcm9wZXJ0aWVzLnB1dCgib3NnaS5jb25maWd1cmF0aW9uLmFyZWEiLCBjb25maWdhcmVhLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWZyYW1ld29ya1Byb3BlcnRpZXMucHV0KCJvc2dpLmJ1bmRsZXMiLCAicmVmZXJlbmNlOiIgKyBzaW1wbGVDb25maWd1cmF0b3JCdW5kbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpICsgIkAxOnN0YXJ0Iik7IC8vIHNob3VsZCBwb2ludCB0byBzaW1wbGUgY29uZmlndXJhdG9yCi0JCWZyYW1ld29ya1Byb3BlcnRpZXMucHV0KCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5jb25maWdVcmwiLCBidW5kbGVzVHh0LnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCXRyeSB7Ci0JCQllcXVpbm94ID0gbmV3IEVtYmVkZGVkRXF1aW5veChmcmFtZXdvcmtQcm9wZXJ0aWVzLCBuZXcgU3RyaW5nW10ge30sIG5ldyBVUkxbXSB7b3NnaUJ1bmRsZX0pOwotCQkJZXF1aW5veENvbnRleHQgPSBlcXVpbm94LnN0YXJ0RnJhbWV3b3JrKCk7Ci0KLQkJCS8vIHZlcmlmeSB0aGF0IGxvYWRlZCBidW5kbGVzIHNob3VsZCBiZQotCQkJQnVuZGxlW10gYnVuZGxlc0luQ29udGV4dCA9IGVxdWlub3hDb250ZXh0LmdldEJ1bmRsZXMoKTsKLQkJCS8vIGFyZSBhbGwgYnVuZGxlcyBpbiBsaXN0IG9mIGV4cGVjdGVkIGJ1bmRsZXM/Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXNJbkNvbnRleHQubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gYnVuZGxlc0luQ29udGV4dFtpXTsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJQnVuZGxlIG5vdEZvdW5kQnVuZGxlID0gYnVuZGxlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVuZGxlSmFycy5sZW5ndGg7IGorKykgewotCQkJCQlGaWxlIGV4cGVjdGVkQnVuZGxlRmlsZSA9IGJ1bmRsZUphcnNbal07Ci0JCQkJCVN0cmluZyBuYW1lID0gZ2V0TWFuaWZlc3RFbnRyeShleHBlY3RlZEJ1bmRsZUZpbGUsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQkJCWlmIChidW5kbGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICghZm91bmQpCi0JCQkJCWZhaWwoIkJ1bmRsZSBzaG91bGQgbm90IGJlIHByZXNlbnQ6ICAiICsgbm90Rm91bmRCdW5kbGUpOwotCQkJfQotCi0JCQkvLyBUT0RPOiAgc2hvdWxkIHdlIGNoZWNrIHN0YXJ0IGxldmVscz8KLQotCQkJLy8gdmVyaWZ5IHRoYXQgYWxsIGJ1bmRsZXMgZXhwZWN0ZWQgdG8gYmUgbG9hZGVkIGFyZSBpbiBmYWN0IGxvYWRlZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVKYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBidW5kbGUgPSBidW5kbGVKYXJzW2ldOwotCQkJCVN0cmluZyBuYW1lID0gZ2V0TWFuaWZlc3RFbnRyeShidW5kbGUsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVuZGxlc0luQ29udGV4dC5sZW5ndGg7IGorKykgewotCQkJCQlCdW5kbGUgbG9hZGVkQnVuZGxlID0gYnVuZGxlc0luQ29udGV4dFtqXTsKLQkJCQkJaWYgKGxvYWRlZEJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCQkJbG9hZGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFsb2FkZWQpCi0JCQkJCWZhaWwoIkJ1bmRsZSBleHBlY3RlZCB0byBiZSBsb2FkZWQgYnV0IGlzIG5vdDogICIgKyBuYW1lKTsKLQkJCX0KLQotCQkJYXNzZXJ0RXF1YWxzKCJUb28gbWFueS90b28gZmV3IGJ1bmRsZXMhISIsIG51bUJ1bmRsZXMsIGJ1bmRsZXNJbkNvbnRleHQubGVuZ3RoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVxdWlub3guc2h1dGRvd24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRTaW1wbGVDb25maWd1cmF0b3JCdW5kbGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlSmFycy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBidW5kbGVKYXIgPSBidW5kbGVKYXJzW2ldOwotCQkJaWYgKGJ1bmRsZUphci5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKSkKLQkJCQlyZXR1cm4gYnVuZGxlSmFyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdW5kbGVzVHh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnVuZGxlc1R4dCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImJ1bmRsZXMiLCAiLnR4dCIpOwotCQlidW5kbGVzVHh0LmRlbGV0ZU9uRXhpdCgpOwotCi0JCUJ1ZmZlcmVkV3JpdGVyIGJ1bmRsZXNUeHRPdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoYnVuZGxlc1R4dCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlSmFycy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBidW5kbGVKYXIgPSBidW5kbGVKYXJzW2ldOwotCQkJYnVuZGxlc1R4dE91dC53cml0ZShnZXRCdW5kbGVzVHh0RW50cnkoYnVuZGxlSmFyKSArICJcbiIpOwotCQl9Ci0KLQkJYnVuZGxlc1R4dE91dC5jbG9zZSgpOwotCi0JCS8vCQlGaWxlSW5wdXRTdHJlYW0gZiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYnVuZGxlc1R4dCk7Ci0JCS8vCQlCdWZmZXJlZElucHV0U3RyZWFtIGIgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmKTsKLQkJLy8JCURhdGFJbnB1dFN0cmVhbSBkID0gbmV3IERhdGFJbnB1dFN0cmVhbShiKTsKLQkJLy8JCXdoaWxlIChkLmF2YWlsYWJsZSgpICE9IDApIHsKLQkJLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oZC5yZWFkTGluZSgpKTsKLQkJLy8JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVzVHh0RW50cnkoRmlsZSBidW5kbGVKYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TWFuaWZlc3RFbnRyeShidW5kbGVKYXIsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBnZXRNYW5pZmVzdEVudHJ5KGJ1bmRsZUphciwgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJLy8gPG5hbWU+LDx2ZXJzaW9uPixmaWxlOjxmaWxlPiw8c3RhcnRsZXZlbD4sdHJ1ZQotCQlyZXR1cm4gbmFtZSArICIsIiArIHZlcnNpb24gKyAiLCIgKyAiZmlsZToiICsgYnVuZGxlSmFyLmdldEFic29sdXRlUGF0aCgpICsgIiwiICsgZ2V0U3RhcnRMZXZlbChuYW1lKSArICIsdHJ1ZSI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFuaWZlc3RFbnRyeShGaWxlIGJ1bmRsZUZpbGUsIFN0cmluZyBlbnRyeSkgewotCQl0cnkgewotCQkJSmFyRmlsZSBidW5kbGVKYXIgPSBuZXcgSmFyRmlsZShidW5kbGVGaWxlKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGJ1bmRsZUphci5nZXRNYW5pZmVzdCgpLmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoZW50cnkpOwotCQkJaWYgKHZhbHVlLmluZGV4T2YoIjsiKSA+IC0xKSB7Ci0JCQkJU3RyaW5nW10gdmFsdWVFbGVtZW50cyA9IHZhbHVlLnNwbGl0KCI7Iik7Ci0JCQkJcmV0dXJuIHZhbHVlRWxlbWVudHNbMF07Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBVUkwgZ2V0RnJhbWV3b3JrQnVuZGxlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUphcnMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgYnVuZGxlSmFyID0gYnVuZGxlSmFyc1tpXTsKLQkJCWlmIChidW5kbGVKYXIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLm9zZ2kiKSkKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gYnVuZGxlSmFyLnRvVVJMKCk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdGFydExldmVsKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCWludCBzdGFydExldmVsID0gNDsKLQkJLy8gc29tZSBzcGVjaWFsIGNhc2Ugc3RhcnQgbGV2ZWxzCi0JCWlmIChidW5kbGVOYW1lLm1hdGNoZXMoIm9yZy5lY2xpcHNlLm9zZ2kiKSkgewotCQkJc3RhcnRMZXZlbCA9IC0xOwotCQl9IGVsc2UgaWYgKGJ1bmRsZU5hbWUubWF0Y2hlcygib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iKSkgewotCQkJc3RhcnRMZXZlbCA9IDI7Ci0JCX0gZWxzZSBpZiAoYnVuZGxlTmFtZS5tYXRjaGVzKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKSB7Ci0JCQlzdGFydExldmVsID0gMTsKLQkJfQotCQlyZXR1cm4gc3RhcnRMZXZlbDsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBnZXRCdW5kbGVKYXJzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCUZpbGVuYW1lRmlsdGVyIGJ1bmRsZUZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpcmVjdG9yeU5hbWUsIFN0cmluZyBmaWxlbmFtZSkgewotCQkJCXJldHVybiAhZmlsZW5hbWUuc3RhcnRzV2l0aCgiLiIpICYmICFmaWxlbmFtZS5lcXVhbHMoIkNWUyIpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZGlyZWN0b3J5Lmxpc3RGaWxlcyhidW5kbGVGaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZmYzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zaW1wbGVjb25maWd1cmF0b3IvU2ltcGxlQ29uZmlndXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdHMgZm9yIG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIik7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVuZGxlc1R4dFRlc3QuY2xhc3MpOwotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy91cGRhdGVzaXRlL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvdXBkYXRlc2l0ZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWJlYTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy91cGRhdGVzaXRlL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnVwZGF0ZXNpdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgYXV0b21hdGVkIGRpcmVjdG9yIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFVwZGF0ZVNpdGVUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3VwZGF0ZXNpdGUvVXBkYXRlU2l0ZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy91cGRhdGVzaXRlL1VwZGF0ZVNpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWI0YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3VwZGF0ZXNpdGUvVXBkYXRlU2l0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnVwZGF0ZXNpdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZS5VcGRhdGVTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTaXRlVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBVcGRhdGVTaXRlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIFJ1biBhbGwgdGhlIHRlc3RzIGluIHRoaXMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShVcGRhdGVTaXRlVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZERpZ2VzdCgpIHsKLQkJLy8gVE9ETyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYSBzaXRlIHdoaWNoIGNvbnRhaW5zIGEgYmFkIGRpZ2VzdCBmaWxlCi0JCS8vIGFuZCBkZWZhdWx0IHRvIGEgZ29vZCBzaXRlLnhtbAotCi0JCS8vIFRPRE8gdGVzdCB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGEgc2l0ZSB3aGljaCBjb250YWlucyBhIGJhZCBkaWdlc3QgZmlsZQotCQkvLyBhbmQgdHJ5IGRlZmF1bHQgdG8gYSBzaXRlLnhtbCBidXQgaXQgaXMgYmFkIHRvbwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdvb2REaWdlc3QoKSB7Ci0JCS8vIFRPRE8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYSBzaXRlIHdpdGggYSBnb29kIGRpZ2VzdCBmaWxlCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZFNpdGVYTUwoKSB7Ci0JCS8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgc2l0ZS54bWwgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRTaXRlWE1MIik7Ci0JCXRyeSB7Ci0JCQlVcGRhdGVTaXRlLmxvYWQoc2l0ZS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQkJZmFpbCgiMC4yIik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZCBleGNlcHRpb24KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUZXN0IHRoZSBjYXNlIHdoZXJlIHdlIGRvbid0IGhhdmUgYSBkaWdlc3Qgb3Igc2l0ZS54bWwuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vU2l0ZSgpIHsKLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSB2YWxpZGF0ZSwgZW1wdHkgbG9jYXRpb24KLQkJRmlsZSB0ZW1wID0gZ2V0VGVtcEZvbGRlcigpOwotCQl0ZW1wLm1rZGlycygpOwotCQlVUkwgbG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbG9jYXRpb24gPSB0ZW1wLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjEiLCBlKTsKLQkJfQotCQl0cnkgewotCQkJVXBkYXRlU2l0ZS5sb2FkKGxvY2F0aW9uLCBnZXRNb25pdG9yKCkpOwotCQkJZmFpbCgiMC4yIik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBleHBlY3QgYW4gZXhjZXB0aW9uCi0JCX0KLQotCQl0cnkgewotCQkJYXNzZXJ0TnVsbCgiMS4wIiwgVXBkYXRlU2l0ZS5sb2FkKG51bGwsIGdldE1vbml0b3IoKSkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMS45OSIsIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUZXN0IGluIHdoaWNoIHdlIGxvYWQgYW4gdXBkYXRlIHNpdGUgZnJvbSBhIHZhbGlkIHNpdGUueG1sIGZpbGUuIEhhbmRsZQotCSAqIGFsbCB0aGUgdmFyaWF0aW9ucyBpbiB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZSgpIHsKLQkJRmlsZSBzaXRlTG9jYXRpb24gPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUiKTsKLQkJVXBkYXRlU2l0ZSBzaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNpdGUgPSBVcGRhdGVTaXRlLmxvYWQoc2l0ZUxvY2F0aW9uLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JCUZlYXR1cmVbXSBmZWF0dXJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCWZlYXR1cmVzID0gc2l0ZS5sb2FkRmVhdHVyZXMoKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNCIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvcnMoKSB7Ci0JCS8vIFRPRE8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgc2l0ZS54bWwgcG9pbnRzIHRvIGEgbWlycm9yIGxvY2F0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3QueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY3NzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0icDIgQXV0b21hdGVkIFRlc3RzIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCi0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uLyIgLz4KLQk8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIgLz4KLQk8cHJvcGVydHkgbmFtZT0icDJfbG9jYXRpb24iIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcDJfc25pZmZfZm9sZGVyIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciB0aGUgdGVzdHMgLS0+Ci0JPCEtLSBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQkJPGRlbGV0ZSBkaXI9IiR7cDJfbG9jYXRpb259IiBxdWlldD0idHJ1ZSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiBhZnRlciBhbGwgLS0+Ci0JPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZXMuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIC0tPgotCTwhLS0gdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icDJUZXN0cyIgZGVwZW5kcz0iaW5pdCxjbGVhbnVwIj4KLQkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3AyX2xvY2F0aW9ufSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BdXRvbWF0ZWRUZXN0cyIgLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiIGRlcGVuZHM9InAyVGVzdHMiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2Utc3VpdGUiIGRlcGVuZHM9InAyUGVyZm9ybWFuY2VUZXN0cyIgLz4KLQotCTx0YXJnZXQgbmFtZT0icDJQZXJmb3JtYW5jZVRlc3RzIj4KLQkJPCEtLSBUT0RPIC0tPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25fMy40LjAudjIwMDcwOTEwLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA3MDkxMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjJiNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25fMy40LjAudjIwMDcwOTEwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1NDI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLnYyMDA3MTAzMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLnYyMDA3MTAzMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGIwMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2Uub3NnaV8zLjQuMC52MjAwNzEwMzAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlJTQSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlJTQQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2ZmQ3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlNGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU3NGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlNGCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotU2lnbmF0dXJlLVZlcnNpb246IDEuMA0KLVNIQTEtRGlnZXN0LU1hbmlmZXN0LU1haW4tQXR0cmlidXRlczogdFBTbFJkNnNVTXU4SEdCclp6cnlFaTd4b0FJPQ0KLUNyZWF0ZWQtQnk6IDEuNS4wIChJQk0gQ29ycG9yYXRpb24pDQotU0hBMS1EaWdlc3QtTWFuaWZlc3Q6IDdDM1hvMkU3WWpublYzVHhIY1gxMWk0YzVCQT0NCi0NCi1OYW1lOiBwbHVnaW4ucHJvcGVydGllcw0KLVNIQTEtRGlnZXN0OiA1WEM3RWRNOEVPQ2ExVkFTcDRNL2JndXQybWs9DQotDQotTmFtZTogYWJvdXQuaHRtbA0KLVNIQTEtRGlnZXN0OiAzRkdsbGpXWndYYXByc0F4TlZKV05TaGtPaVE9DQotDQotTmFtZTogYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sDQotU0hBMS1EaWdlc3Q6IFlaVVYrQkZudzZYTFJkVTBlQ3YxRllkeThjUT0NCi0NCi1OYW1lOiBqdW5pdC5qYXINCi1TSEExLURpZ2VzdDogYU5LRDdnS3hwQkVqNXNEdjRjd3pXZVhSaWZRPQ0KLQ0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mDQotU0hBMS1EaWdlc3Q6IFNBcVkrNUlUQUwwbWtkWWVpamxTUmh5SWFaaz0NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTZjN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy44LjIudjIwMDcwNjExMTczOAotRXhwb3J0LVBhY2thZ2U6IGp1bml0LmF3dHVpO3ZlcnNpb249IjMuOC4yIixqdW5pdC5leHRlbnNpb25zO3ZlcnNpb249IgotIDMuOC4yIixqdW5pdC5mcmFtZXdvcms7dmVyc2lvbj0iMy44LjIiLGp1bml0LnJ1bm5lcjt2ZXJzaW9uPSIzLjguMiIsagotIHVuaXQuc3dpbmd1aTt2ZXJzaW9uPSIzLjguMiIsanVuaXQuc3dpbmd1aS5pY29uczt2ZXJzaW9uPSIzLjguMiIsanVuaQotIHQudGV4dHVpO3ZlcnNpb249IjMuOC4yIgotQ3JlYXRlZC1CeTogMi4zIChJQk0gQ29ycG9yYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuanVuaXQKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGp1bml0LmphcgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogcGx1Z2luLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBtTDl5dlhCbUFBSmk3RzF0bHM3YWt1eVBHK0E9Ci0KLU5hbWU6IGFib3V0X2ZpbGVzL2NwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IG8wYjE5Y2VaK0hRSFZYME9wczc1MUFRVmR3TT0KLQotTmFtZTogYWJvdXQuaHRtbAotU0hBMS1EaWdlc3Q6IGlQc3lKUEVZR1RRK2x1T0poaUpnVXREVllrRT0KLQotTmFtZToganVuaXQuamFyCi1TSEExLURpZ2VzdDogWStLYUNSYmJCY21UaHhEZUhBeGhyellHa3lnPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY0ZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb2Nlc3NlZCB1c2luZyBKYXJwcm9jZXNzb3IKLXBhY2syMDAuYXJncyA9IC1FNAotcGFjazIwMC5jb25kaXRpb25lZCA9IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTEzZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDI4LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgZm9yIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgZm9sbG93czo8L3A+Ci0KLTxoND5KVW5pdCAzLjguMjwvaDQ+Ci0KLTxwPlRoZSBwbHVnLWluIGlzIGFjY29tcGFuaWVkIGJ5IHNvZnR3YXJlIGRldmVsb3BlZCBieSBKVW5pdC5vcmcuICBUaGUgSlVuaXQgMy44LjIgY29kZSBpbmNsdWRlZCB3aXRoIHRoZSBwbHVnLWluIGluY2x1ZGVzIG5vIG1vZGlmaWNhdGlvbnMuCi1Zb3VyIHVzZSBvZiBKVW5pdCAzLjguMiBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IGNvZGUgZm9ybSBjb250YWluZWQgaW4gdGhlIHBsdWctaW4gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1UaGUgYmluYXJ5IGNvZGUgaXMgbG9jYXRlZCBpbiBqdW5pdC5qYXIgYW5kIHRoZSBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIHNyYy5qYXIuPC9wPgotCi08cD5pKSBJQk0gZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwPmlpKSBJQk0gZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cD5paWkpIElCTSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgQ1BMIGFyZSBvZmZlcmVkIGJ5IHRoYXQgSUJNIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dF9maWxlcy9jcGwtdjEwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVlN2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dF9maWxlcy9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvanVuaXQuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyMWZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvanVuaXQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZiOTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1KVW5pdCBUZXN0aW5nIEZyYW1ld29yawotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5XzEuMC4wLnYyMDA3MDgyNy5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5XzEuMC4wLnYyMDA3MDgyNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTEwYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeV8xLjAuMC52MjAwNzA4MjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlJTQSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlJTQQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2ZmQ3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlNGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU3NGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9FQ0xJUFNFLlNGCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotU2lnbmF0dXJlLVZlcnNpb246IDEuMA0KLVNIQTEtRGlnZXN0LU1hbmlmZXN0LU1haW4tQXR0cmlidXRlczogdFBTbFJkNnNVTXU4SEdCclp6cnlFaTd4b0FJPQ0KLUNyZWF0ZWQtQnk6IDEuNS4wIChJQk0gQ29ycG9yYXRpb24pDQotU0hBMS1EaWdlc3QtTWFuaWZlc3Q6IDdDM1hvMkU3WWpublYzVHhIY1gxMWk0YzVCQT0NCi0NCi1OYW1lOiBwbHVnaW4ucHJvcGVydGllcw0KLVNIQTEtRGlnZXN0OiA1WEM3RWRNOEVPQ2ExVkFTcDRNL2JndXQybWs9DQotDQotTmFtZTogYWJvdXQuaHRtbA0KLVNIQTEtRGlnZXN0OiAzRkdsbGpXWndYYXByc0F4TlZKV05TaGtPaVE9DQotDQotTmFtZTogYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sDQotU0hBMS1EaWdlc3Q6IFlaVVYrQkZudzZYTFJkVTBlQ3YxRllkeThjUT0NCi0NCi1OYW1lOiBqdW5pdC5qYXINCi1TSEExLURpZ2VzdDogYU5LRDdnS3hwQkVqNXNEdjRjd3pXZVhSaWZRPQ0KLQ0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mDQotU0hBMS1EaWdlc3Q6IFNBcVkrNUlUQUwwbWtkWWVpamxTUmh5SWFaaz0NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTZjN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy44LjIudjIwMDcwNjExMTczOAotRXhwb3J0LVBhY2thZ2U6IGp1bml0LmF3dHVpO3ZlcnNpb249IjMuOC4yIixqdW5pdC5leHRlbnNpb25zO3ZlcnNpb249IgotIDMuOC4yIixqdW5pdC5mcmFtZXdvcms7dmVyc2lvbj0iMy44LjIiLGp1bml0LnJ1bm5lcjt2ZXJzaW9uPSIzLjguMiIsagotIHVuaXQuc3dpbmd1aTt2ZXJzaW9uPSIzLjguMiIsanVuaXQuc3dpbmd1aS5pY29uczt2ZXJzaW9uPSIzLjguMiIsanVuaQotIHQudGV4dHVpO3ZlcnNpb249IjMuOC4yIgotQ3JlYXRlZC1CeTogMi4zIChJQk0gQ29ycG9yYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuanVuaXQKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGp1bml0LmphcgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogcGx1Z2luLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBtTDl5dlhCbUFBSmk3RzF0bHM3YWt1eVBHK0E9Ci0KLU5hbWU6IGFib3V0X2ZpbGVzL2NwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IG8wYjE5Y2VaK0hRSFZYME9wczc1MUFRVmR3TT0KLQotTmFtZTogYWJvdXQuaHRtbAotU0hBMS1EaWdlc3Q6IGlQc3lKUEVZR1RRK2x1T0poaUpnVXREVllrRT0KLQotTmFtZToganVuaXQuamFyCi1TSEExLURpZ2VzdDogWStLYUNSYmJCY21UaHhEZUhBeGhyellHa3lnPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY0ZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb2Nlc3NlZCB1c2luZyBKYXJwcm9jZXNzb3IKLXBhY2syMDAuYXJncyA9IC1FNAotcGFjazIwMC5jb25kaXRpb25lZCA9IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTEzZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDI4LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgZm9yIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgZm9sbG93czo8L3A+Ci0KLTxoND5KVW5pdCAzLjguMjwvaDQ+Ci0KLTxwPlRoZSBwbHVnLWluIGlzIGFjY29tcGFuaWVkIGJ5IHNvZnR3YXJlIGRldmVsb3BlZCBieSBKVW5pdC5vcmcuICBUaGUgSlVuaXQgMy44LjIgY29kZSBpbmNsdWRlZCB3aXRoIHRoZSBwbHVnLWluIGluY2x1ZGVzIG5vIG1vZGlmaWNhdGlvbnMuCi1Zb3VyIHVzZSBvZiBKVW5pdCAzLjguMiBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IGNvZGUgZm9ybSBjb250YWluZWQgaW4gdGhlIHBsdWctaW4gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1UaGUgYmluYXJ5IGNvZGUgaXMgbG9jYXRlZCBpbiBqdW5pdC5qYXIgYW5kIHRoZSBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIHNyYy5qYXIuPC9wPgotCi08cD5pKSBJQk0gZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwPmlpKSBJQk0gZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cD5paWkpIElCTSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgQ1BMIGFyZSBvZmZlcmVkIGJ5IHRoYXQgSUJNIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dF9maWxlcy9jcGwtdjEwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVlN2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dF9maWxlcy9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvanVuaXQuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyMWZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvanVuaXQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZiOTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1KVW5pdCBUZXN0aW5nIEZyYW1ld29yawotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZW5naW5lcmVwby5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZW5naW5lcmVwby5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjNhMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG8uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMDQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogWVZwRzJ5VitmQ0tweGpnbmMyUDdzY3dyY05VPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBVek0xTVpuYVpCemI1SkhQUVpFN3dieWRKV0E9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNhNzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUkNQCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVJpY2ggQ2xpZW50IFBsYXRmb3JtCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlZjE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmlibS5pY3UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy42LjEudjIwMDcwNDE3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAgICAgCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNDIzIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMTAwLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MDIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTI0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC5JMjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYxNC0wODAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwOC0xMTAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2FyYm9uIgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjYXJib24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgCi0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNjE1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC53cGYud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndwZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXguczM5MCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXguczM5MHgiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iczM5MHgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgICAKLSAgICAgICAgIAotCSA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgICAgICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsuc29sYXJpcy54ODYiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgucHBjIgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODZfNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuY2FyYm9uLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuYWl4LnBwYyIKLSAgICAgICAgIG9zPSJhaXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5ocHV4LlBBX1JJU0MiCi0gICAgICAgICBvcz0iaHB1eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9IlBBX1JJU0MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDVhIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LmlhNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iaWE2NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5IRUFEIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5waG90b24ucW54Lng4NiIKLSAgICAgICAgIG9zPSJxbngiCi0gICAgICAgICB3cz0icGhvdG9uIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuaHB1eC5pYTY0XzMyIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJpYTY0XzMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkhFQUQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNzA2MTIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwMzE5IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgICAgCi0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUyMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgIAotICAgICAgICAgCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUyMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InNwYXJjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYyIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4gICAgICAgICAKLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLSAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkweCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPiAKLSAgICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODZfNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjIgotICAgICAgICAgb3M9ImFpeCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQyIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0iUEFfUklTQyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzAyMTkiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPiAgICAgICAgIAotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndwZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjMiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNfMy4xLjIwMC52MjAwNzA2MDUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9FdXJvcGEvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL0V1cm9wYS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliZjAxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL0V1cm9wYS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgZGlnZXN0VVJMPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvZXVyb3BhLyIgbWlycm9yc1VSTD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3JlbGVhc2VzL2V1cm9wYS9zaXRlLnhtbCZhbXA7Zm9ybWF0PXhtbCZhbXA7cHJvdG9jb2w9aHR0cCIgcGFjazIwMD0idHJ1ZSI+Ci0KLSAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2V1cm9wYS8iPgotICAgICAgICBUaGlzIEV1cm9wYSBEaXNjb3ZlcnkgU2l0ZSBjb250YWlucyBhIG51bWJlciBvZiBFY2xpcHNlIGJhc2VkIHByb2plY3RzIAotICAgICAgICByZWxlYXNlZCBzaW11bHRhbmVvdXNseSwgSnVuZSAyMDA3LgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJDIGFuZCBDKysgRGV2ZWxvcGVtZW50IiBuYW1lPSJDIGFuZCBDKysgRGV2ZWxvcGVtZW50Ij4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkludGVncmF0ZWQgRGV2ZWxvcGVtZW50IGZvciBDIGFuZCBDKysgcHJvZ3JhbXMuPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJDaGFydGluZyBhbmQgUmVwb3J0aW5nIiBuYW1lPSJDaGFydGluZyBhbmQgUmVwb3J0aW5nIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkJ1c2luZXNzIEludGVsbGlnZW5jZSBhbmQgUmVwb3J0aW5nIFRvb2xzPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJDb2xsYWJvcmF0aW9uIFRvb2xzIiBuYW1lPSJDb2xsYWJvcmF0aW9uIFRvb2xzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ29sbGFib3JhdGlvbiBhbmQgaW50ZWdyYXRpb24gdG9vbHMgZm9yIHRoZSBFY2xpcHNlIGVudmlyb25tZW50LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkNvbW11bmljYXRpb25zIiBuYW1lPSJDb21tdW5pY2F0aW9ucyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFJlYWwtdGltZSBjb21tdW5pY2F0aW9ucyBmb3IgRWNsaXBzZS4gIFRvIHVzZSBhcHBsaWNhdGlvbnMgKGUuZy4gSU0sIHJlYWwtdGltZSBjb2xsYWIsIGV0Yy4pLCBib3RoIHRoZSBDb3JlIEFQSSBhbmQgQXBwbGljYXRpb24gZmVhdHVyZXMgYXJlIHJlcXVpcmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkRhdGFiYXNlIERldmVsb3BtZW50IiBuYW1lPSJEYXRhYmFzZSBEZXZlbG9wbWVudCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Ub29scyB0byBhbGxvdyBpbnRlZ3JhdGlvbiB3aXRoIGFuZCBlYXN5IHVzZSBvZiBEYXRhYmFzZXMuPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJHcmFwaGljYWwgRWRpdG9ycyBhbmQgRnJhbWV3b3JrcyIgbmFtZT0iR3JhcGhpY2FsIEVkaXRvcnMgYW5kIEZyYW1ld29ya3MiPgotICAgICAgICA8ZGVzY3JpcHRpb24+QSBmcmFtZXdvcmsgdG8gY3JlYXRlIGdyYXBoaWNhbCBlZGl0b3JzLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSmF2YSBEZXZlbG9wbWVudCIgbmFtZT0iSmF2YSBEZXZlbG9wbWVudCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEludGVncmF0ZWQgZGV2ZWxvcG1lbnQgdG9vbHMgZm9yIEphdmEgRGV2ZWxvcG1lbnQsIGluY2x1ZGluZyBwbHVnaW4gZGV2ZWxvcGVtZW50IHdpdGggSmF2YSwgYW5kIEoyRUUgYXBwbGljYXRpb25zLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiIG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBNb2RlbCBjcmVhdGlvbiBhbmQgbWFuaXB1bGF0aW9uIGZyYW1ld29ya3MgKGUuZy4gRU1GLCBHTUYpIGFuZCBzcGVjaWZpYyBtb2RlbHMgKFNETywgSkVNLCBYU0QgSW5mb3NldCkuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50IiBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiPgotICAgICAgICA8ZGVzY3JpcHRpb24+VG9vbHMgYW5kIEZyYW1ld29ya3MgZm9yIGFjY2Vzc2luZyBhbmQgbWFuYWdpbmcgcmVtb3RlIGNvbXB1dGVycyBvciBlbWJlZGRlZCBkZXZpY2VzPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJTT0EgRGV2ZWxvcG1lbnQiIG5hbWU9IlNPQSBEZXZlbG9wbWVudCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BIHBsYXRmb3JtIGFuZCB0b29scyBmb3IgZGV2ZWxvcGluZwotICAgICAgICBTZXJ2aWNlLU9yaWVudGVkIENvbXBvbmVudC1iYXNlZCAgQXBwbGljYXRpb25zLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiIG5hbWU9IlRlc3RpbmcgYW5kIFBlcmZvcm1hbmNlIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRvb2xzIGFuZCBGcmFtZXdvcmtzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIGF1dG9tYXRpYyB0ZXN0aW5nLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iV2ViIGFuZCBKRUUgRGV2ZWxvcG1lbnQiIG5hbWU9IldlYiBhbmQgSkVFIERldmVsb3BtZW50Ij4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkEgcGxhdGZvcm0gYW5kIHRvb2xzIGZvciBkZXZlbG9waW5nIFhNTCwgV2ViU2VydmljZXMsIGFuZCBKRUUgQXBwbGljYXRpb25zLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIiBuYW1lPSJQcm9ncmFtbWluZyBMYW5ndWFnZXMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUb29scyBhbmQgRnJhbWV3b3JrcyBzdXBwb3J0aW5nIHByb2dyYW1taW5nIGxhbmd1YWdlcyBmb3IgdGhlIEVjbGlwc2UgZW52aXJvbm1lbnQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iT3RoZXIgVG9vbHMiIG5hbWU9Ik90aGVyIFRvb2xzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgT3RoZXIgdG9vbHMgZm9yIHRoZSBFY2xpcHNlIGVudmlyb25tZW50LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVuYWJsaW5nIEZlYXR1cmVzIiBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIHByb3ZpZGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBvbmUgb3IgbW9yZSBwcm9qZWN0cywgYnV0IGRvIG5vdCBwcm92aWRlIGVuZC11c2VyIGZ1bmN0aW9uYWxpdHkgYnkKLSAgICAgICAgICAgIHRoZW1zZWx2ZXMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZWNsaXBzZW1vbmtleSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVjbGlwc2Vtb25rZXlfMS4wLjAuMjAwNzA2MDYwOTQ3LmphciIgdmVyc2lvbj0iMS4wLjAuMjAwNzA2MDYwOTQ3Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik90aGVyIFRvb2xzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuYXBhY2hlLmJhdGlrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmFwYWNoZS5iYXRpa18xLjYuMC52MjAwNjEyMjItMTIyMi0wODQyMjgzNDQ0LTM0NDQuamFyIiB2ZXJzaW9uPSIxLjYuMC52MjAwNjEyMjItMTIyMi0wODQyMjgzNDQ0LTM0NDQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLQotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjIuUjMzeF92MjAwNzEwMjItXzE5VUVrc0YtRzhZYzZiVXYzRHouamFyIiB2ZXJzaW9uPSIzLjMuMi5SMzN4X3YyMDA3MTAyMi1fMTlVRWtzRi1HOFljNmJVdjNEeiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuY3ZzIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzXzEuMC4xLlIzM3hfcjIwMDcwODAyLTdDNzlfOV9LS0ctbURNOWUzSDVELmphciIgdmVyc2lvbj0iMS4wLjEuUjMzeF9yMjAwNzA4MDItN0M3OV85X0tLRy1tRE05ZTNINUQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQ29sbGFib3JhdGlvbiBUb29scyIvPgotICAgIDwvZmVhdHVyZT4KLQotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3giIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94XzMuMy4xLlIzM3hfcjIwMDcwOTE4LTduN0xFQ2dFS1ZzTElNMWFHQk80YjAwLmphciIgdmVyc2lvbj0iMy4zLjEuUjMzeF9yMjAwNzA5MTgtN243TEVDZ0VLVnNMSU0xYUdCTzRiMDAiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJpcnQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iaXJ0XzIuMi4xLnYyMDA3MDcwOS03TTdNN0EzT1AyTXoteUFJdGlsNjRyOXowdHcwLmphciIgdmVyc2lvbj0iMi4yLjEudjIwMDcwNzA5LTdNN003QTNPUDJNei15QUl0aWw2NHI5ejB0dzAiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQ2hhcnRpbmcgYW5kIFJlcG9ydGluZyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmlydC5kb2MiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iaXJ0LmRvY18yLjIuMS52MjAwNzA3MDktMTEwLXMzMzJBdzMxMTgxXzJfLmphciIgdmVyc2lvbj0iMi4yLjEudjIwMDcwNzA5LTExMC1zMzMyQXczMTE4MV8yXyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJDaGFydGluZyBhbmQgUmVwb3J0aW5nIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIAotICAgIDxmZWF0dXJlIGlkPSJvcmcuYXBhY2hlLmRlcmJ5LmNvcmUiIHVybD0iZmVhdHVyZXMvb3JnLmFwYWNoZS5kZXJieS5jb3JlXzEwLjEuMi4xLmphciIgdmVyc2lvbj0iMTAuMS4yLjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0iY29tLmxvd2FnaWUuaXRleHQiIHVybD0iZmVhdHVyZXMvY29tLmxvd2FnaWUuaXRleHRfMS41LjIudjIwMDcwNjA4LTA0MS13MzExODE4MjEuamFyIiB2ZXJzaW9uPSIxLjUuMi52MjAwNzA2MDgtMDQxLXczMTE4MTgyMSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvZGVjIiB1cmw9ImZlYXR1cmVzL29yZy5hcGFjaGUuY29tbW9ucy5jb2RlY18xLjMuMC52MjAwNzA5MDctMDItLXczMTE4MTcyMjI4NDkuamFyIiB2ZXJzaW9uPSIxLjMuMC52MjAwNzA5MDctMDItLXczMTE4MTcyMjI4NDkiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5tb3ppbGxhLnJoaW5vIiB1cmw9ImZlYXR1cmVzL29yZy5tb3ppbGxhLnJoaW5vXzEuNi4wLnYyMDA3MDQwNi0wNS0tdzMxMTgxODIxLmphciIgdmVyc2lvbj0iMS42LjAudjIwMDcwNDA2LTA1LS13MzExODE4MjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy53M2Muc2FjIiB1cmw9ImZlYXR1cmVzL29yZy53M2Muc2FjXzEuMy4wLnYyMDA3MDQwNi0wMi0tdzMxMTgxODIxLmphciIgdmVyc2lvbj0iMS4zLjAudjIwMDcwNDA2LTAyLS13MzExODE4MjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmNkdCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmNkdF80LjAuMS4yMDA3MDkyNDEyMDIuamFyIiB2ZXJzaW9uPSI0LjAuMS4yMDA3MDkyNDEyMDIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQyBhbmQgQysrIERldmVsb3BlbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0XzMuMy4xLnIzMzFfdjIwMDcwNjI5LTdvN2pFNzJFRGxYQWJxQWNuYm15ZzFyZjhSSUwuamFyIiB2ZXJzaW9uPSIzLjMuMS5yMzMxX3YyMDA3MDYyOS03bzdqRTcyRURsWEFicUFjbmJteWcxcmY4UklMIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkphdmEgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBkZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMi5SMzN4X3IyMDA3MTAyMi03TjdNNENZV0xCQ3oteUhrTUl1SE4uamFyIiB2ZXJzaW9uPSIzLjMuMi5SMzN4X3IyMDA3MTAyMi03TjdNNENZV0xCQ3oteUhrTUl1SE4iPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iSmF2YSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4zLjAudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4wLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNka18yLjMuMC52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjAudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS54c2QiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHNkLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zZGtfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmNvbW1vbl8yLjMuMC52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjAudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5jb21tb24udWlfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZV8yLjMuMS52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjEudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdF8yLjMuMC52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjAudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWRpdF8yLjMuMS52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjEudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWRpdC51aV8yLjMuMS52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjEudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHNkLmVkaXQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZWRpdF8yLjMuMC52MjAwNzA5MjUyMTM1LmphciIgdmVyc2lvbj0iMi4zLjAudjIwMDcwOTI1MjEzNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mcXR2LmFsbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lbWZxdHYuYWxsXzEuMS4xLnYyMDA3MDcyNTIwMzYtNjUyX3NJUkh0dG9IaG1kcFRZUmVYVi0yS0VaWi5qYXIiIHZlcnNpb249IjEuMS4xLnYyMDA3MDcyNTIwMzYtNjUyX3NJUkh0dG9IaG1kcFRZUmVYVi0yS0VaWiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mcXR2LmFsbC5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZW1mcXR2LmFsbC5zZGtfMS4xLjEudjIwMDcwNzI1MjAzNi03QTdfM0RqZlVBNVhpbjhkei05YUdOVklIWWxLLmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzI1MjAzNi03QTdfM0RqZlVBNVhpbjhkei05YUdOVklIWWxLIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5xdWVyeSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5xdWVyeV8xLjEuMC52MjAwNzA2MDcxNzEyLTEwLTd3MzExODE3MTgyODIzLmphciIgdmVyc2lvbj0iMS4xLjAudjIwMDcwNjA3MTcxMi0xMC03dzMxMTgxNzE4MjgyMyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5Lm9jbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5xdWVyeS5vY2xfMS4xLjAudjIwMDcwNjA3MTcxMi0xMC03dzMxMTgxNzE4MjgyMy5qYXIiIHZlcnNpb249IjEuMS4wLnYyMDA3MDYwNzE3MTItMTAtN3czMTE4MTcxODI4MjMiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb25fMS4xLjEudjIwMDcwODE2MTQ0NS0zMThaOW9BNTVQNU82TzhJQ18uamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA4MTYxNDQ1LTMxOFo5b0E1NVA1TzZPOElDXyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ub2NsIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ub2NsXzEuMS4wLnYyMDA3MDYwNzE1MjAtMTAtN3czMTE4MTcxODI2MzEuamFyIiB2ZXJzaW9uPSIxLjEuMC52MjAwNzA2MDcxNTIwLTEwLTd3MzExODE3MTgyNjMxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24iIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb25fMS4xLjEudjIwMDcwODIzMTk0OC0yMDhaOHM3MzNHM0c1QzVJOUQuamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA4MjMxOTQ4LTIwOFo4czczM0czRzVDNUk5RCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2VfMS4xLjEudjIwMDcwNzI1MjAzNi0yMDhaOHM3MzNHM0Y1RTZfOEIuamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA3MjUyMDM2LTIwOFo4czczM0czRjVFNl84QiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICAKLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamV0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamV0XzAuOC4xLnYyMDA3MDkxMy0xN0UxOW9BNTVQNVZfOC5qYXIiIHZlcnNpb249IjAuOC4xLnYyMDA3MDkxMy0xN0UxOW9BNTVQNVZfOCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZXQuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamV0LnNka18wLjguMS52MjAwNzA5MTMtMDdVMTgyVFo3Y2pXRUdrQnVKSC5qYXIiIHZlcnNpb249IjAuOC4xLnYyMDA3MDkxMy0wN1UxODJUWjdjaldFR2tCdUpIIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZ21mLmV1cm9wYSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmdtZi5ldXJvcGFfMi4wLjEudjIwMDcwODA5LTAwMDAtN1g3N19fRUluLWh6MFlTZlJ5OEhKTkFNVEZmay5qYXIiIHZlcnNpb249IjIuMC4xLnYyMDA3MDgwOS0wMDAwLTdYNzdfX0VJbi1oejBZU2ZSeThISk5BTVRGZmsiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLQotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lb2RtIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW9kbV8wLjkuMS52MjAwNzEwMDkwMzAyLmphciIgdmVyc2lvbj0iMC45LjEudjIwMDcxMDA5MDMwMiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lb2RtLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVvZG0uc2RrXzAuOS4xLnYyMDA3MTAwOTAzMDIuamFyIiB2ZXJzaW9uPSIwLjkuMS52MjAwNzEwMDkwMzAyIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm9jbC5hbGwiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5vY2wuYWxsXzEuMS4xLnYyMDA3MDcxMzE0MTUtMzIyN183NVRoTEJCa0JrRlJHZFFaLmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzEzMTQxNS0zMjI3Xzc1VGhMQkJrQmtGUkdkUVoiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uub2NsLmFsbC5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5vY2wuYWxsLnNka18xLjEuMS52MjAwNzA3MTMxNDE1LTY1M18tSkFZUFJnbU1kei1ZWFJEbGduS29uQmsuamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA3MTMxNDE1LTY1M18tSkFZUFJnbU1kei1ZWFJEbGduS29uQmsiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotCTwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uub2NsIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uub2NsXzEuMS4xLnYyMDA3MDcxMzE0MTUtMzIwOW9BNTVQNU43RjhKREguamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA3MTMxNDE1LTMyMDlvQTU1UDVON0Y4SkRIIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5vY2wudW1sIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uub2NsLnVtbF8xLjEuMS52MjAwNzA3MTMxNDE1LTEwMDd3MzExODE4MjQyNTI2LmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzEzMTQxNS0xMDA3dzMxMTgxODI0MjUyNiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLm9jbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5vY2xfMS4xLjEudjIwMDcwOTEyMTk1Ni0xMDA3dzMxMTgxXzIzMl82Ny5qYXIiIHZlcnNpb249IjEuMS4xLnYyMDA3MDkxMjE5NTYtMTAwN3czMTE4MV8yMzJfNjciPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVtbDIiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51bWwyXzIuMS4xLnYyMDA3MDgzMDEyMjIuamFyIiB2ZXJzaW9uPSIyLjEuMS52MjAwNzA4MzAxMjIyIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVtbDIuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudW1sMi5zZGtfMi4xLjEudjIwMDcwODMwMTIyMi5qYXIiIHZlcnNpb249IjIuMS4xLnYyMDA3MDgzMDEyMjIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudW1sMnRvb2xzIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudW1sMnRvb2xzXzAuNy4xLnYyMDA3MTAwMTA1MzQuamFyIiB2ZXJzaW9uPSIwLjcuMS52MjAwNzEwMDEwNTM0Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVtbDJ0b29scy5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51bWwydG9vbHMuc2RrXzAuNy4xLnYyMDA3MTAwMTA1MzQuamFyIiB2ZXJzaW9uPSIwLjcuMS52MjAwNzEwMDEwNTM0Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudHB0cC5iaXJ0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudHB0cC5iaXJ0XzQuNC4xLnYyMDA3MDYxMzIxMTYtN0k3R19CLWh0aHJNcExTWlVZcHRDVHotY1YtRS5qYXIiIHZlcnNpb249IjQuNC4xLnYyMDA3MDYxMzIxMTYtN0k3R19CLWh0aHJNcExTWlVZcHRDVHotY1YtRSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJUZXN0aW5nIGFuZCBQZXJmb3JtYW5jZSIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudHB0cC53dHAiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50cHRwLnd0cF80LjQuMS52MjAwNzA5MjYxNzUyLTc3NDhhLUNJSGxBWjhsSUhBbENxSmZKZVJGLmphciIgdmVyc2lvbj0iNC40LjEudjIwMDcwOTI2MTc1Mi03NzQ4YS1DSUhsQVo4bElIQWxDcUpmSmVSRiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJUZXN0aW5nIGFuZCBQZXJmb3JtYW5jZSIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudHB0cC5tb25pdG9yaW5nLnJ1bnRpbWUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50cHRwLm1vbml0b3JpbmcucnVudGltZV80LjQuMS52MjAwNzA2MTMyMTE2LTdVN1JfRS13YXZuSUdIN0tGaHJtNXowOFpzOFQuamFyIiB2ZXJzaW9uPSI0LjQuMS52MjAwNzA2MTMyMTE2LTdVN1JfRS13YXZuSUdIN0tGaHJtNXowOFpzOFQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAucGxhdGZvcm0ucnVudGltZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRwdHAucGxhdGZvcm0ucnVudGltZV80LjQuMS52MjAwNzA2MTMyMTE2LThJODNFSVgxSk5LN2R3dDd0SG50cmo2eG5IODQuamFyIiB2ZXJzaW9uPSI0LjQuMS52MjAwNzA2MTMyMTE2LThJODNFSVgxSk5LN2R3dDd0SG50cmo2eG5IODQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAudGVzdC5ydW50aW1lIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudHB0cC50ZXN0LnJ1bnRpbWVfNC4zLjEwMS52MjAwNzA5MjYxNzUyLTdFN19Bay1RaEtVQVk2N3RhMjFtTzg5R19HWE8uamFyIiB2ZXJzaW9uPSI0LjMuMTAxLnYyMDA3MDkyNjE3NTItN0U3X0FrLVFoS1VBWTY3dGEyMW1PODlHX0dYTyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJUZXN0aW5nIGFuZCBQZXJmb3JtYW5jZSIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudHB0cC50cmFjZS5ydW50aW1lIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudHB0cC50cmFjZS5ydW50aW1lXzQuMy4xLnYyMDA3MDkyNjE3NTItN0U3ODMtVVVFTkJtTTNSaVE0VXhWei1lWkQ4LmphciIgdmVyc2lvbj0iNC4zLjEudjIwMDcwOTI2MTc1Mi03RTc4My1VVUVOQm1NM1JpUTRVeFZ6LWVaRDgiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZV8yLjAuMS52MjAwNzA5MTEwNjUwLTdBMUVDR0NuYmNrejBibnI1d0NwOEtOQWppcFIuamFyIiB2ZXJzaW9uPSIyLjAuMS52MjAwNzA5MTEwNjUwLTdBMUVDR0NuYmNrejBibnI1d0NwOEtOQWppcFIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iV2ViIGFuZCBKRUUgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLndzdF8yLjAuMS52MjAwNzA5MTEwNTEwLTdDLTc3OGswSldOcjkzV0VJSHZwbFNWb2pXZWwuamFyIiB2ZXJzaW9uPSIyLjAuMS52MjAwNzA5MTEwNTEwLTdDLTc3OGswSldOcjkzV0VJSHZwbFNWb2pXZWwiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iV2ViIGFuZCBKRUUgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpzdCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdF8yLjAuMS52MjAwNzA5MTEwNTEwLTdCLTY4ZERUTkltYXowZGlfVHZrczFKeURQVmUuamFyIiB2ZXJzaW9uPSIyLjAuMS52MjAwNzA5MTEwNTEwLTdCLTY4ZERUTkltYXowZGlfVHZrczFKeURQVmUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iV2ViIGFuZCBKRUUgRGV2ZWxvcG1lbnQiLz4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkphdmEgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmVfMS4wLjEudjIwMDcwOTEzMDAwMC03Ny01Q1lRQ0N6LUQ3TFFDQ0NELmphciIgdmVyc2lvbj0iMS4wLjEudjIwMDcwOTEzMDAwMC03Ny01Q1lRQ0N6LUQ3TFFDQ0NEIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IldlYiBhbmQgSkVFIERldmVsb3BtZW50Ii8+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJKYXZhIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmVfMi4wLjEudjIwMDcwOTExMDYyMi03QzVFSDJFOVJ2VFZuaWpyc3BWejBiZ09tZnotLmphciIgdmVyc2lvbj0iMi4wLjEudjIwMDcwOTExMDYyMi03QzVFSDJFOVJ2VFZuaWpyc3BWejBiZ09tZnotIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPiAgICAgICAgCi0gICAgCi0gICAgCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmdlZiIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmdlZl8zLjMuMS52MjAwNzA4MTQuamFyIiB2ZXJzaW9uPSIzLjMuMS52MjAwNzA4MTQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR3JhcGhpY2FsIEVkaXRvcnMgYW5kIEZyYW1ld29ya3MiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmdlZi5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5nZWYuc2RrXzMuMy4xLnYyMDA3MDgxNC5qYXIiIHZlcnNpb249IjMuMy4xLnYyMDA3MDgxNCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJHcmFwaGljYWwgRWRpdG9ycyBhbmQgRnJhbWV3b3JrcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICAKLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuZGVzaWduZXIuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLmRlc2lnbmVyLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlciIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlcl8xLjUuMS4yMDA3MTAxNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MTAxNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmFwYWNoZS5kZXJieS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuYXBhY2hlLmRlcmJ5LmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmhzcWxkYi5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuaHNxbGRiLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5pYm0uZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmlibS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamRiYy5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamRiYy5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamR0LmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5qZHQuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm1zZnQuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm1zZnQuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm15c3FsLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub2RhLmRlc2lnbmVyLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vZGEuZGVzaWduZXIuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9kYS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub2RhLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQucG9zdGdyZXNxbC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQucG9zdGdyZXNxbC5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuc3liYXNlLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5zeWJhc2UuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5pbnRybyIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5pbnRyb18xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2UuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2UuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zZGsuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5zZGsuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5kYXRhLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZGF0YS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmRkbC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmRkbC5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5wYXJzZXJzLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMucGFyc2Vycy5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLnJlc3VsdHMuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5yZXN1bHRzLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIAotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5yc2UiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5yc2VfMi4wLjIudjIwMDcxMDMwLTdELTY4bUpJa1I5V0F2aXFWOHowVTl2ei1DLmphciIgdmVyc2lvbj0iMi4wLjIudjIwMDcxMDMwLTdELTY4bUpJa1I5V0F2aXFWOHowVTl2ei1DIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucnNlLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnJzZS5zZGtfMi4wLjIudjIwMDcxMDMwLTdKLTc5RTdab0hQUDVab2VaLW9VZTF6LXdKbmwuamFyIiB2ZXJzaW9uPSIyLjAuMi52MjAwNzEwMzAtN0otNzlFN1pvSFBQNVpvZVotb1VlMXotd0pubCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnJzZS5yZW1vdGVjZHQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5yc2UucmVtb3RlY2R0XzIuMC4xLnYyMDA3MDkyNi00LTE4czczM0czSzVILmphciIgdmVyc2lvbj0iMi4wLjEudjIwMDcwOTI2LTQtMThzNzMzRzNLNUgiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS50bS50ZXJtaW5hbC5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50bS50ZXJtaW5hbC5zZGtfMS4wLjIudjIwMDcxMDMwLTdfLTdDQXZOS3dOYWJXRExoUWdsaE5ERG1HU0wuamFyIiB2ZXJzaW9uPSIxLjAuMi52MjAwNzEwMzAtN18tN0NBdk5Ld05hYldETGhRZ2xoTkREbUdTTCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRtLmRpc2NvdmVyeSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRtLmRpc2NvdmVyeV8yLjAuMC52MjAwNzA2MTEtN0otLUU4TWNJSk5KQ1ByLmphciIgdmVyc2lvbj0iMi4wLjAudjIwMDcwNjExLTdKLS1FOE1jSUpOSkNQciI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGQuZHNmLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRkLmRzZi5zZGtfMC45LjAudjIwMDcwNjE1LmphciIgdmVyc2lvbj0iMC45LjAudjIwMDcwNjE1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGQuZHNmLmdkYiIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRkLmRzZi5nZGJfMC45LjAudjIwMDcwNjE1LmphciIgdmVyc2lvbj0iMC45LjAudjIwMDcwNjE1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGQuZGVidWcubWVtb3J5LnJlbmRlcmluZ3MiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kZC5kZWJ1Zy5tZW1vcnkucmVuZGVyaW5nc18wLjkuMC52MjAwNzA2MTUuamFyIiB2ZXJzaW9uPSIwLjkuMC52MjAwNzA2MTUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kZC5pcHhhY3QiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kZC5pcHhhY3RfMC4yLjAudjIwMDcwNjE1LmphciIgdmVyc2lvbj0iMC4yLjAudjIwMDcwNjE1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lY2YuY29yZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVjZi5jb3JlXzEuMi4wLnYyMDA3MTAxOS0xMzAwLmphciIgdmVyc2lvbj0iMS4yLjAudjIwMDcxMDE5LTEzMDAiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQ29tbXVuaWNhdGlvbnMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVjZi5leGFtcGxlcyIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVjZi5leGFtcGxlc18xLjIuMC52MjAwNzEwMTktMTMwMC5qYXIiIHZlcnNpb249IjEuMi4wLnYyMDA3MTAxOS0xMzAwIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkNvbW11bmljYXRpb25zIi8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmFqZHQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5hamR0XzEuNS4wLjIwMDcwNjA3MDYxOS5qYXIiIHZlcnNpb249IjEuNS4wLjIwMDcwNjA3MDYxOSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJKYXZhIERldmVsb3BtZW50Ii8+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJQcm9ncmFtbWluZyBMYW5ndWFnZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRsdGsuY29yZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRsdGsuY29yZV8wLjkuMS5yMDlfdjIwMDcwOTIwLTA4TzJFOEFXanBrT3lTeTVWQVBCLmphciIgdmVyc2lvbj0iMC45LjEucjA5X3YyMDA3MDkyMC0wOE8yRThBV2pwa095U3k1VkFQQiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kbHRrLnJ1YnkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kbHRrLnJ1YnlfMC45LjEucjA5X3YyMDA3MDkyMC0wN3EyQk1Fa3J6LUlNQ2Q3Z0VLLmphciIgdmVyc2lvbj0iMC45LjEucjA5X3YyMDA3MDkyMC0wN3EyQk1Fa3J6LUlNQ2Q3Z0VLIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlByb2dyYW1taW5nIExhbmd1YWdlcyIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kbHRrLnRjbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRsdGsudGNsXzAuOS4xLnIwOV92MjAwNzA5MjAtMDd6MUNRTVVZWEdnSnQzSzczLmphciIgdmVyc2lvbj0iMC45LjEucjA5X3YyMDA3MDkyMC0wN3oxQ1FNVVlYR2dKdDNLNzMiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIi8+Ci0gICAgPC9mZWF0dXJlPgotCi0KLQkgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYnVja21pbnN0ZXIuY29yZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLmNvcmUuZmVhdHVyZV8wLjIuMC5yMzYzNi5qYXIiIHZlcnNpb249IjAuMi4wLnIzNjM2Ij4KLQkgICAgICA8Y2F0ZWdvcnkgbmFtZT0iT3RoZXIgVG9vbHMiLz4KLQkgICA8L2ZlYXR1cmU+Ci0JICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLmN2cy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLmN2cy5mZWF0dXJlXzAuMi4wLnIzMzgzLmphciIgdmVyc2lvbj0iMC4yLjAucjMzODMiPgotCSAgICAgIDxjYXRlZ29yeSBuYW1lPSJPdGhlciBUb29scyIvPgotCSAgIDwvZmVhdHVyZT4KLQkgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYnVja21pbnN0ZXIubWF2ZW4uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5idWNrbWluc3Rlci5tYXZlbi5mZWF0dXJlXzAuMi4wLnIzMzg4LmphciIgdmVyc2lvbj0iMC4yLjAucjMzODgiPgotCSAgICAgIDxjYXRlZ29yeSBuYW1lPSJPdGhlciBUb29scyIvPgotCSAgIDwvZmVhdHVyZT4KLQkgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYnVja21pbnN0ZXIucDQuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5idWNrbWluc3Rlci5wNC5mZWF0dXJlXzAuMi4wLnIzMzgxLmphciIgdmVyc2lvbj0iMC4yLjAucjMzODEiPgotCSAgICAgIDxjYXRlZ29yeSBuYW1lPSJPdGhlciBUb29scyIvPgotCSAgIDwvZmVhdHVyZT4KLQkgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYnVja21pbnN0ZXIucGRlLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYnVja21pbnN0ZXIucGRlLmZlYXR1cmVfMC4yLjAucjM2MzYuamFyIiB2ZXJzaW9uPSIwLjIuMC5yMzYzNiI+Ci0JICAgICAgPGNhdGVnb3J5IG5hbWU9Ik90aGVyIFRvb2xzIi8+Ci0JICAgPC9mZWF0dXJlPgotCi0gICAgICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik15bHluIiBuYW1lPSJNeWx5biIvPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm15bHluX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW5fZmVhdHVyZV8yLjEuMC52MjAwNzA5MjctMDkwMC5qYXIiIHZlcnNpb249IjIuMS4wLnYyMDA3MDkyNy0wOTAwIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJNeWx5biIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm15bHluLmNvbnRleHRfZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5teWx5bi5jb250ZXh0X2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi5pZGVfZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5teWx5bi5pZGVfZmVhdHVyZV8yLjEuMC52MjAwNzA5MjctMDkwMC5qYXIiIHZlcnNpb249IjIuMS4wLnYyMDA3MDkyNy0wOTAwIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJNeWx5biIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm15bHluLmphdmFfZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5teWx5bi5qYXZhX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi5wZGVfZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5teWx5bi5wZGVfZmVhdHVyZV8yLjEuMC52MjAwNzA5MjctMDkwMC5qYXIiIHZlcnNpb249IjIuMS4wLnYyMDA3MDkyNy0wOTAwIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJNeWx5biIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm15bHluLmJ1Z3ppbGxhX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4uYnVnemlsbGFfZmVhdHVyZV8yLjEuMC52MjAwNzA5MjctMDkwMC5qYXIiIHZlcnNpb249IjIuMS4wLnYyMDA3MDkyNy0wOTAwIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJNeWx5biIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm15bHluLnRyYWNfZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5teWx5bi50cmFjX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLQotICAgPCEtLSBTT0EgVG9vbHMgLS0+Ci0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLmIyai5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5iMmouZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdDLTc3MzNHNTM1RTUzQ0EuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdDLTc3MzNHNTM1RTUzQ0EiPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuYnBtbi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5icG1uLmZlYXR1cmVfMC43LjAuMjAwNzEwMTYxMDU0LTA3US03RTc3WUE3QVVBN1FNLmphciIgdmVyc2lvbj0iMC43LjAuMjAwNzEwMTYxMDU0LTA3US03RTc3WUE3QVVBN1FNIj4KLSAgICAgPGNhdGVnb3J5IG5hbWU9IlNPQSBEZXZlbG9wbWVudCIvPgotICAgPC9mZWF0dXJlPgotCi0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLmNvcmUuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5zdHAuY29yZS5mZWF0dXJlXzAuNy4wLjIwMDcxMDE2MTA1NC0wN1EtN0U3N1lBN0FVQTdRTS5qYXIiIHZlcnNpb249IjAuNy4wLjIwMDcxMDE2MTA1NC0wN1EtN0U3N1lBN0FVQTdRTSI+Ci0gICAgIDxjYXRlZ29yeSBuYW1lPSJTT0EgRGV2ZWxvcG1lbnQiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIAotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnN0cC5zZXJ2aWNlY3JlYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLnNlcnZpY2VjcmVhdGlvbl8wLjcuMC4yMDA3MTAxNjEwNTQtMDdsLTdNQUFxR0FHa0dBZVkuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdsLTdNQUFxR0FHa0dBZVkiPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuc2MuamF4d3MuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5zdHAuc2MuamF4d3MuZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkcuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkciPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuc2Muc2NhLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLnNjLnNjYS5mZWF0dXJlXzAuNy4wLjIwMDcxMDE2MTA1NC0wN0otN0E1NVA4NThNODVKRy5qYXIiIHZlcnNpb249IjAuNy4wLjIwMDcxMDE2MTA1NC0wN0otN0E1NVA4NThNODVKRyI+Ci0gICAgIDxjYXRlZ29yeSBuYW1lPSJTT0EgRGV2ZWxvcG1lbnQiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIAotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnN0cC5zb2FzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLnNvYXMuZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdlLTdNQUFxR0FHa0dBZVkuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdlLTdNQUFxR0FHa0dBZVkiPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuc29hcy5ydW50aW1lLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLnNvYXMucnVudGltZS5mZWF0dXJlXzAuNy4wLjIwMDcxMDE2MTA1NC0wN0otN0E1NVA4NThNODVKRy5qYXIiIHZlcnNpb249IjAuNy4wLjIwMDcxMDE2MTA1NC0wN0otN0E1NVA4NThNODVKRyI+Ci0gICAgIDxjYXRlZ29yeSBuYW1lPSJTT0EgRGV2ZWxvcG1lbnQiLz4KLSAgIDwvZmVhdHVyZT4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjU2YjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBqTmZUd0FvTS9EMjlkWFFGMnk1ak5obkNSbmM9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IEFlSmNNSlRwUUJObGMwMFQ4Q1lsRjcvMkdsND0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTk1NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBDVlMgQ2xpZW50IFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BUEkgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlIGNvZGUgemlwcyBmb3IgRWNsaXBzZSBDVlMgY2xpZW50LgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTM3ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgIGlkPSJvcmcuZWNsaXBzZS5jdnMuc291cmNlIiAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5jdnMuc291cmNlIiB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZSIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTJiZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogSGFjUTl0M3YybkxNQ2lzb0dzSEZVTGR5akRnPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBDZlZ4Z0FHTUdKQW5YM0R2dElzQVBxV3RpTTQ9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjMzgwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgQ1ZTIENsaWVudAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgInNlY29uZGFyeVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUV1cm9wYSBEaXNjb3ZlcnkgU2l0ZQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIENWUyBDbGllbnQuIChCaW5hcnkgcnVudGltZSBhbmQgdXNlciBkb2N1bWVudGF0aW9uLikKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzRhYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZSIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuMy4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLkkyMDA2MTIwOCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNzA2MDQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgCi0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZkNjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IEFYRi8xSitpU21lNFJLSEEzOE1vRXYra3FSUT0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogeUcwd2ZSN1BXZjR6S3JSaW9jMWRJc1hZOTJVPQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWRlOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIEpEVCBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMgZm9yIEVjbGlwc2UgSmF2YSBkZXZlbG9wbWVudCB0b29scy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyMjJkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIiPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiIHVucGFjaz0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5qZHQuZG9jLmlzdiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEzIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuanVuaXQuc291cmNlIiB2ZXJzaW9uPSIzLjguMi52MjAwNzA2MTExNzM4Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIi8+Ci0JPHBsdWdpbiB3cz0iY2FyYm9uIiAgb3M9Im1hY29zeCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZS5tYWNvc3guY2FyYm9uLnBwYyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUiIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTlkMmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogblhsSFdsaTBLWkpSWml6Y1lGTEhXdy8ramVBPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBNZE1SR2hoeWFkWklwSVpreGlsWFNxekk5OHc9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjQzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgSmF2YSBEZXZlbG9wbWVudCBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIEphdmEgZGV2ZWxvcG1lbnQgdG9vbHMuIChCaW5hcnkgcnVudGltZSBhbmQgdXNlciBkb2N1bWVudGF0aW9uLikKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWQyM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjMuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTEzMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MTEiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTEyMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuYXB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDQzMC0xMTM1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyOS0yMTAwIiAgICAgICAgIAotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgIAotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLmFwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MTAtMjAwMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudl83NzEiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52Xzc3MSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUzMS0xODAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUzMGEiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0NC5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4xMDAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qdW5pdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjguMi52MjAwNzA2MTExNzM4Ii8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuanVuaXQ0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjQuMy4xIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA4LTEzMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4xMDAudjIwMDYxMjExIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNTE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiAzS0tBb0lMQjM0UVZGUDgvVmZDMU4xT21HQzg9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IEg5QTZDdFNiVTdiRkxsRmdJRjU0RDIwWWowST0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IEl5ZEwzbG5RUVFGOE9WbU83Q1o2dWVhOFQwaz0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTgyNmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQREUgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgcGx1Zy1pbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmQzMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxjb3B5cmlnaHQgPgotCQklY29weXJpZ2h0Ci0JPC9jb3B5cmlnaHQ+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wZGUuc291cmNlIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmRlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBnZFNjR1JQNVg2aU9TajVSN1Q0anlXNHFJTmM9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IFdEdmFPb2MwdkFUbS9udEpnbTNxZFVVenZtMD0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNDU2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbHVnLWluIERldmVsb3BtZW50IEVudmlyb25tZW50Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgcGx1Zy1pbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjkwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucGRlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwOC0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmJ1aWxkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMiIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA4LTEzMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDgtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwOC0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwOC0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxNC0wODAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDgtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkYzJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogQzMxK3ZLam1mQjM5QW5UU2VYc0JYSnJRM2U0PQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiB1L3Q4NWpvSVNteTBwV3BXY0pxdUhyOVZzeVU9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBlYmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNvbW1vbiBPUy1pbmRlcGVuZGVudCBBUEkgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlIGNvZGUgemlwcyBmb3IgdGhlIEVjbGlwc2UgUGxhdGZvcm0uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljYjRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSIgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y29weXJpZ2h0ID4KLQkJJWNvcHlyaWdodAotCTwvY29weXJpZ2h0PgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL2V1cm9wYSIvPgotCTwvdXJsPgotCTxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZSIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiIHVucGFjaz0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MjEiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9ImphdmF4LnNlcnZsZXQuc291cmNlIiB2ZXJzaW9uPSIyLjQuMC52MjAwNzA2MTExNzM4Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UiIHZlcnNpb249IjIuMC4wLnYyMDA3MDYxOTE2MDMiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5hcGFjaGUuamFzcGVyLnNvdXJjZSIgdmVyc2lvbj0iNS41LjE3LnYyMDA3MDYxMTE3MjQiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbC5zb3VyY2UiIHZlcnNpb249IjEuMC4wLnYyMDA3MDYxMTE3MjQiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4wLjQudjIwMDcwNjExMTcyNCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmFwYWNoZS5hbnQuc291cmNlIiB2ZXJzaW9uPSIxLjcuMC52MjAwNzA2MDgwODQyIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UiIHZlcnNpb249IjEuOS4xLnYyMDA3MDYxMTE3MjQiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnNvdXJjZSIgdmVyc2lvbj0iMS45LjEudjIwMDcwNjE4MTYxMCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLm1vcnRiYXkuamV0dHkuc291cmNlIiB2ZXJzaW9uPSI1LjEuMTEudjIwMDcwNjExMTcyNCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NF8zMiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmhwdXgubW90aWYuaWE2NF8zMiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5pYTY0IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJwaG90b24iICBvcz0icW54IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UucW54LnBob3Rvbi54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5wcGMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImhwdXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJQQV9SSVNDIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UuaHB1eC5tb3RpZi5QQV9SSVNDIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJ3cGYiICBvcz0id2luMzIiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS53aW4zMi53cGYueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODZfNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsueDg2XzY0IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGM2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5wcGM2NCIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9InNvbGFyaXMiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJzcGFyYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLnNvbGFyaXMuZ3RrLnNwYXJjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJjYXJib24iICBvcz0ibWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubWFjb3N4LmNhcmJvbi5wcGMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9IndpbjMyIiAgb3M9IndpbjMyIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uud2luMzIud2luMzIueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJzb2xhcmlzIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ic3BhcmMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5zb2xhcmlzLm1vdGlmLnNwYXJjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJ3aW4zMiIgIG9zPSJ3Y2VfcHBjIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iYXJtIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uud2NlX3BwYy53aW4zMi5hcm0iIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubGludXgubW90aWYueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg5NWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IGJMTWF5dEcyaXRiZEtKc1R0V3RLK1dHaGwwWT0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDoga0VXaTRHK2RSUkhVUjhkcUZiR2g5M2h6bHhvPQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmY0MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAic2Vjb25kYXJ5U2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWU9RXVyb3BhIERpc2NvdmVyeSBTaXRlCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNvbW1vbiBPUy1pbmRlcGVuZGVudCBiYXNlIG9mIHRoZSBFY2xpcHNlIHBsYXRmb3JtLiAoQmluYXJ5IHJ1bnRpbWUgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4pCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTc0YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL2V1cm9wYSIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uamNyYWZ0LmpzY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4xLjMxIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnNlcnZsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi40LjAudjIwMDcwNjExMTczOCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnNlcnZsZXQuanNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wLnYyMDA3MDYxOTE2MDMiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmphc3BlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI1LjUuMTcudjIwMDcwNjExMTcyNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MTExNzI0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjQudjIwMDcwNjExMTcyNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuNy4wLnYyMDA3MDYwODA4NDIiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuOS4xLnYyMDA3MDYxMTE3MjQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjkuMS52MjAwNzA2MTgxNjEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjIwMC52MjAwNzA1MjIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuYm9vdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMTAwLnYyMDA2MDYwMyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4xLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNTMxIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29tcGF0aWJpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUwMiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjIwMC52MjAwNzA1MDIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNjA1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNjA1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDcwNDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctMTgwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy0xODAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwOCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNTEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTMiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYxNS0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2VhcmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjQuMS4yMzAudjIwMDcwNTMxIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzY2guY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA0MjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc2NoLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLkkyMDA3MDUyNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDcwNTMwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNTMwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNTMwQSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTA3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3NlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUyNEEiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA1LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNS0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLkkyMDA3MDUxNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNzAzMTktMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MTEiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNDE2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYyMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcHBsaWNhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA1MzAtMDEwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAuSTIwMDcwMzE5LTAwMTAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNjE1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDYxNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDYxNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLkkyMDA3MDMxOS0wMDEwIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5ocHV4LmlhNjRfMzIiCi0gICAgICAgICBvcz0iaHB1eCIKLSAgICAgICAgIGFyY2g9ImlhNjRfMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDYwNjAzIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uaHB1eC5QQV9SSVNDIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICBhcmNoPSJQQV9SSVNDIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA2MDYwMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4LnBwYyIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMTAwLnYyMDA3MDQzMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC52MjAwNzA0MTYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5saW51eC54ODZfNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICBhcmNoPSJ4ODZfNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjEwMC52MjAwNzA1MTAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICBhcmNoPSJzcGFyYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMTAwLnYyMDA3MDQyNSIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDYwNjAzIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ucW54Lng4NiIKLSAgICAgICAgIG9zPSJxbngiCi0gICAgICAgICB3cz0icGhvdG9uIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA2MDYwMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC52MjAwNzA1MTAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyIgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDIyNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDcwNjE1IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDYxNSIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA1LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDMxNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcubW9ydGJheS5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI1LjEuMTEudjIwMDcwNjExMTcyNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gIAotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2ZjNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBkTW5PaHZ4cGhXSWNUVnhOTHNGZEo1NEhqZnc9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IEtRRzdMeEFzYlNmRlIwTFRyVHVVM3h0OWpOND0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmYmIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBSQ1AgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBFY2xpcHNlIFJDUC4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjlkNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZSIgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y29weXJpZ2h0ID4KLQkJJWNvcHlyaWdodAotCTwvY29weXJpZ2h0PgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0iY29tLmlibS5pY3Uuc291cmNlIiB2ZXJzaW9uPSIzLjYuMS52MjAwNzA0MTciLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImhwdXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJpYTY0XzMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmhwdXgubW90aWYuaWE2NF8zMiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5saW51eC5ndGsuaWE2NCIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0icGhvdG9uIiAgb3M9InFueCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5xbngucGhvdG9uLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmxpbnV4Lmd0ay5wcGMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImhwdXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJQQV9SSVNDIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmhwdXgubW90aWYuUEFfUklTQyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0id3BmIiAgb3M9IndpbjMyIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLndpbjMyLndwZi54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4Nl82NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5saW51eC5ndGsueDg2XzY0IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ic29sYXJpcyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InNwYXJjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLnNvbGFyaXMuZ3RrLnNwYXJjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJjYXJib24iICBvcz0ibWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLm1hY29zeC5jYXJib24ucHBjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UubGludXguZ3RrLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0iYWl4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmFpeC5tb3RpZi5wcGMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9IndpbjMyIiAgb3M9IndpbjMyIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLndpbjMyLndpbjMyLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0ic29sYXJpcyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InNwYXJjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLnNvbGFyaXMubW90aWYuc3BhcmMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmxpbnV4Lm1vdGlmLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEwNDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBZVnBHMnlWK2ZDS3B4amduYzJQN3Njd3JjTlU9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IFV6TTFNWm5hWkJ6YjVKSFBRWkU3d2J5ZEpXQT0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2E3MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBSQ1AKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UmljaCBDbGllbnQgUGxhdGZvcm0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVmMTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmljdSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjYuMS52MjAwNzA0MTciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNS0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgICAKLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuam9icyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA0MjMiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4xMDAudjIwMDcwNTMwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUwMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTMwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MjQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMS4wLkkyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjE0LTA4MDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA4LTExMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jYXJib24iCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgd3M9ImNhcmJvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLkkyMDA3MDYwNS0wMDEwIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAKLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA2MTUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LndwZi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id3BmIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC5zMzkwIgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InMzOTAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC5zMzkweCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkweCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgIAotICAgICAgICAgCi0JIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLnNvbGFyaXMuc3BhcmMiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzcGFyYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICAgICAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5zb2xhcmlzLng4NiIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC5wcGMiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4Nl82NCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODZfNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5jYXJib24ubWFjb3N4IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjYXJib24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5haXgucHBjIgotICAgICAgICAgb3M9ImFpeCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLmhwdXguUEFfUklTQyIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0iUEFfUklTQyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NWEiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXguaWE2NCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJpYTY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkhFQUQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJzcGFyYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnBob3Rvbi5xbngueDg2IgotICAgICAgICAgb3M9InFueCIKLSAgICAgICAgIHdzPSJwaG90b24iCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5ocHV4LmlhNjRfMzIiCi0gICAgICAgICBvcz0iaHB1eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9ImlhNjRfMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSEVBRCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA3MDYxMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzAzMTkiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAgICAgICAKLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA0MjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNTIyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgCi0gICAgICAgICAKLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTIyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjYXJib24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjIgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPiAgICAgICAgIAotICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLSAgICAgICAgIAotICAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwIgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InMzOTAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InMzOTB4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyNCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+IAotICAgICAgICAgICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4Nl82NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMiCi0gICAgICAgICBvcz0iYWl4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyNCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5QQV9SSVNDIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJQQV9SSVNDIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDIxOSIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id3BmIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNTIzIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDI5OGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IHlmcGNsQXh4YmVva29YRGUzcTR0ODBXaU5aZz0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogK1R3amNzU0JBSFo5aFNUN1hhZU10UldJbUdNPQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNka18zLjMuMC52MjAwNzA2MDctN003Si1CSW9sei1PY3hXeHZXQVBTZkxQcWV2Ty9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWExN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNka18zLjMuMC52MjAwNzA2MDctN003Si1CSW9sei1PY3hXeHZXQVBTZkxQcWV2Ty9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFByb2plY3QgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAic2Vjb25kYXJ5U2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgdXBkYXRlIHNpdGUKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUV1cm9wYSBEaXNjb3ZlcnkgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U0RLIGZvciBFY2xpcHNlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU5YWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZGsiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8iCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLSAgIAotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+ICAKLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvZXVyb3BhIi8+ICAKLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY3ZzIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY3ZzLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQyIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQyIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2RrIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMyIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvcmVhZG1lLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkzZGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBkYXRhIGZvciBhdXRvbWF0ZWQgdGVzdGluZyBvZiB0aGUgZ2VuZXJhdG9yLiBTcGVjaWZpY2FsbHksCi10aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZmVhdHVyZSBkYXRhIGZyb20gdmVyc2lvbiAzLjMuMCBvZiB0aGUgRWNsaXBzZSBTREsuCi1UaGUgY29ycmVzcG9uZGluZyBnZW5lcmF0b3IgdGVzdCBlbnN1cmVzIHRoYXQgY29ycmVjdCBtZXRhZGF0YSBpcyBnZW5lcmF0ZWQKLWZvciB0aGVzZSBmZWF0dXJlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvamFycHJvY2Vzc29yLmphci5wYWNrLmd6IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2phcnByb2Nlc3Nvci5qYXIucGFjay5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkZjQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvamFycHJvY2Vzc29yLmphci5wYWNrLmd6CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvMV82L29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvMV82L29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUyYWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5negorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4yLTMuMy5qYmRpZmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi0zLjMuamJkaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFjNzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4yLTMuMy5qYmRpZmYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi5leGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjZkMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjMuZXhlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjMuZXhlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNkOGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4zLmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4MDllZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2ZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLTMuMy4wLmpiZGlmZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLTMuMy4wLmpiZGlmZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLm5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWU0N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLm5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVlYzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS0yLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEtMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTU0NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS0yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTdmOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4yLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1YjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYWFhXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2FhYV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZmM0YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYWFhXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYi5saW51eF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmIubGludXhfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU3MWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYi5saW51eF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmIud2luMzJfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiLndpbjMyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxM2NkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmIud2luMzJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Y2ZiYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2NjY18xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9jY2NfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjhkOWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2NjY18xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9jY2NfMi4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxM2NiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9jY2NfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVEaXJlY3RvcnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjhmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVEaXJlY3RvcnkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luIGlkPSJvbGRCdW5kbGVEaXJlY3RvcnkiIG5hbWU9InRlc3QgcGx1Zy1pbiIgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Ii4iPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5VHdvL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ0YzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5VHdvL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5VHdvL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE3ZmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5VHdvL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbiBpZD0ib2xkQnVuZGxlRGlyZWN0b3J5VHdvIiBuYW1lPSJ0ZXN0IHBsdWctaW4iIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSIuIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVKQVIuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVKQVIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmYwMWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSVHdvLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSVHdvLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiMmQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUlR3by5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvc2FyL2FsaWVuLnppcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvYWxpZW4uemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODcyMjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvYWxpZW4uemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc0YWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiZmUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWVjMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJiYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLnNhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvdGVzdC56aXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvc2FyL3Rlc3QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU4Yjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9zYXIvdGVzdC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRTaXRlWE1ML3NpdGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkU2l0ZVhNTC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyZWMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRTaXRlWE1ML3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUKLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvZmVhdHVyZXMvYS5mXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvZmVhdHVyZXMvYS5mXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0YTk1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL2ZlYXR1cmVzL2EuZl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL2ZlYXR1cmVzL2IuZl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL2ZlYXR1cmVzL2IuZl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTQwOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9mZWF0dXJlcy9iLmZfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9wbHVnaW5zL2FfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9wbHVnaW5zL2FfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I4NWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvcGx1Z2lucy9hXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvcGx1Z2lucy9iXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvcGx1Z2lucy9iXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzM2Y0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3BsdWdpbnMvYl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3NpdGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhNDBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9hLmZfMS4wLjAuamFyIiBpZD0iYS5mIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iYSIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9iLmZfMS4wLjAuamFyIiBpZD0iYi5mIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iYiIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJhIiBsYWJlbD0iQ2F0ZWdvcnkgT25lIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGNhdGVnb3J5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJiIiBsYWJlbD0iQ2F0ZWdvcnkgVHdvIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjYXRlZ29yeS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2I0ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJmNjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YWE4MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0jRnJpIEZlYiAyMiAxMToxMToxNyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOTlkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU4OjU3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzA0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBKdWwgMzAgMTQ6NTI6MjkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI2ZTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1JbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSIyLjQuMCIsCi0gamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IjIuNC4wIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuNC4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmh0dHA7dmVyc2lvbj0iMS4yLjAiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHMuQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJkOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3AyIHRvb2xzIC0gZmlsZSBzZXJ2ZXIubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3AyIHRvb2xzIC0gZmlsZSBzZXJ2ZXIubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2VjYmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wMiB0b29scyAtIGZpbGUgc2VydmVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9ImM6XHByb3ZccDJcUHJvdkFkbWluVUkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImV4ZWNFbnZpcm9ubWVudCIgdmFsdWU9IkoyU0UtMS41Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLmZpbGVzZXJ2ZXJBcHBsaWNhdGlvbiYjMTM7JiMxMDstcmVzb3VyY2UgL2FydGlmYWN0IGZpbGU6YzovcHJvdi9wMi9zZXJ2ZXJzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLURlY2xpcHNlLnAyLmRhdGEuYXJlYT1jOi9wcm92L3AyL2FnZW50RGF0YS8mIzEzOyYjMTA7LURvc2dpLm5vU2h1dGRvd249dHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJqYXZheC5zZXJ2bGV0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZ0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eUBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaUA6LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5tb3J0YmF5LmpldHR5QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2ZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZUBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29sc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3JAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmJiYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IHAyIFRvb2xzIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yzc0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBpZD0iZmlsZXNlcnZlckFwcGxpY2F0aW9uIiAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uIGNhcmRpbmFsaXR5PSIxIiB0aHJlYWQ9Im1haW4iIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29scy5GaWxlU2VydmVyQXBwbGljYXRpb24iLz4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIGlkPSJhcHBsaWNhdGlvbiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPiAKLSAgICAgIDxhcHBsaWNhdGlvbj4gCi0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvb2xzLlVwZGF0ZUNoZWNrZXJBcHBsaWNhdGlvbiIvPiAKLSAgICAgIDwvYXBwbGljYXRpb24+IAotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDIzZTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvb2xzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGJ1bmRsZUNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlidW5kbGVDb250ZXh0ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvRmlsZVNlcnZlckFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvRmlsZVNlcnZlckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODNhOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL0ZpbGVTZXJ2ZXJBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsZVNlcnZlckFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQlwcml2YXRlIE1hcCByZXNvdXJjZXMgPSBuZXcgSGFzaE1hcCgxMCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlU3lzdGVtQ29udGV4dCBpbXBsZW1lbnRzIEh0dHBDb250ZXh0IHsKLQkJcHJpdmF0ZSBTdHJpbmcgYmFzZTsKLQotCQlwdWJsaWMgRmlsZVN5c3RlbUNvbnRleHQoU3RyaW5nIGJhc2UpIHsKLQkJCXRoaXMuYmFzZSA9IGJhc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoYmFzZSArIG5hbWUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhbmRsZVNlY3VyaXR5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsKLQkJcmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVzb3VyY2VzKE1hcCBsaXN0KSB7Ci0JCUh0dHBTZXJ2aWNlIGh0dHAgPSAoSHR0cFNlcnZpY2UpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBIdHRwU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSByZXNvdXJjZXMuZ2V0KGtleSk7Ci0JCQl0cnkgewotCQkJCWh0dHAucmVnaXN0ZXJSZXNvdXJjZXMoa2V5LCAiLyIsIG5ldyBGaWxlU3lzdGVtQ29udGV4dCh2YWx1ZSkpOwotCQkJfSBjYXRjaCAoTmFtZXNwYWNlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCQkJLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1yYXciKSkKLQkJCS8vCQkJCXJhdyA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGggcGFyYW1ldGVycy4gSWYgd2UgYXJlIGF0IHRoZSBsYXN0IGFyZ3VtZW50IG9yIAotCQkJLy8gaWYgdGhlIG5leHQgb25lIGhhcyBhICctJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHdlIGNhbid0IGhhdmUgCi0JCQkvLyBhbiBhcmcgd2l0aCBhIHBhcmFtIHNvIGNvbnRpbnVlLgotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1yZXNvdXJjZSIpKQotCQkJCXJlc291cmNlcy5wdXQoYXJnLCBhcmdzWysraV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL01ldGFkYXRhQ29tcGFyZUFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvTWV0YWRhdGFDb21wYXJlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ZDI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvTWV0YWRhdGFDb21wYXJlQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29sczsKLQotLy9pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotLy9pbXBvcnQgamF2YS5uZXQuVVJMOwotLy9pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUNvbXBhcmVBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0KLQkvLwlwcml2YXRlIFN0cmluZyBzb3VyY2U7Ci0JLy8JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0OwotCS8vCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlID0gZmFsc2U7Ci0JLy8JcHJpdmF0ZSBib29sZWFuIGxpc3QgPSBmYWxzZTsKLQkvLwlwcml2YXRlIFN0cmluZyB0eXBlID0gIm1ldGEiOwotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLwkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsKLQkJLy8KLQkJLy8JCWlmIChjb21wYXJlKQotCQkvLwkJCWNvbXBhcmVNZXRhZGF0YVJlcG9zaXRvcmllcyhuZXcgVVJMKHNvdXJjZSksIG5ldyBVUkwodGFyZ2V0KSk7Ci0JCS8vCQlpZiAobGlzdCkgewotCQkvLwkJCWxpc3Qoc291cmNlKTsKLQkJLy8JCQlsaXN0KHRhcmdldCk7Ci0JCS8vCQl9Ci0JCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9PSzsKLQl9Ci0KLQkvLwlwcml2YXRlIHZvaWQgbGlzdChTdHJpbmcgc291cmNlTG9jYXRpb24pIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCS8vCQlpZiAoc291cmNlTG9jYXRpb24gPT0gbnVsbCkKLQkvLwkJCXJldHVybjsKLQkvLwkJSVF1ZXJ5YWJsZSBzb3VyY2UgPSBudWxsOwotCS8vCQlpZiAodHlwZS5lcXVhbHMoIm1ldGEiKSkgewotCS8vCQkJVVJMIGxvY2F0aW9uOwotCS8vCQkJdHJ5IHsKLQkvLwkJCQlsb2NhdGlvbiA9IG5ldyBVUkwoc291cmNlTG9jYXRpb24pOwotCS8vCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkvLwkJCQlyZXR1cm47Ci0JLy8JCQl9Ci0JLy8JCQlQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkvLwkJCXNvdXJjZSA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRNZXRhZGF0YVJlcG9zaXRvcnkobG9jYXRpb24pOwotCS8vCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCS8vCQkJCXJldHVybjsKLQkvLwkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygicHJvZmlsZSIpKSB7Ci0JLy8JCQlzb3VyY2UgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0UHJvZmlsZShzb3VyY2VMb2NhdGlvbik7Ci0JLy8JCQlpZiAoc291cmNlID09IG51bGwpCi0JLy8JCQkJcmV0dXJuOwotCS8vCQl9Ci0JLy8JCUlJbnN0YWxsYWJsZVVuaXRbXSBzb3VyY2VJVXMgPSBzb3VyY2UucXVlcnkobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIG51bGwpOwotCS8vCQlzb3VyY2VJVXMgPSBzb3J0KHNvdXJjZUlVcywgdHJ1ZSk7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlSVVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQlTeXN0ZW0ub3V0LnByaW50KHNvdXJjZUlVc1tpXSk7Ci0JLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlSVVzW2ldLmlzRnJhZ21lbnQoKSA/ICIgKGZyYWdtZW50KSIgOiAiIik7Ci0JLy8JCX0KLQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbDogIiArIHNvdXJjZUlVcy5sZW5ndGgpOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgdm9pZCBjb21wYXJlTWV0YWRhdGFSZXBvc2l0b3JpZXMoVVJMIHNvdXJjZSwgVVJMIHRhcmdldCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JLy8JCVByb3Zpc2lvbmluZ0hlbHBlci5hZGRNZXRhZGF0YVJlcG9zaXRvcnkoc291cmNlKTsKLQkvLwkJSU1ldGFkYXRhUmVwb3NpdG9yeSBzb3VyY2VSZXBvID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldE1ldGFkYXRhUmVwb3NpdG9yeShzb3VyY2UpOwotCS8vCQlpZiAoc291cmNlUmVwbyA9PSBudWxsKQotCS8vCQkJcmV0dXJuOwotCS8vCQlQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KHRhcmdldCk7Ci0JLy8JCUlNZXRhZGF0YVJlcG9zaXRvcnkgdGFyZ2V0UmVwbyA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRNZXRhZGF0YVJlcG9zaXRvcnkodGFyZ2V0KTsKLQkvLwkJaWYgKHRhcmdldFJlcG8gPT0gbnVsbCkKLQkvLwkJCXJldHVybjsKLQkvLwotCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIHNvdXJjZS50b0V4dGVybmFsRm9ybSgpICsgIiAtPiAiICsgdGFyZ2V0LnRvRXh0ZXJuYWxGb3JtKCkpOwotCS8vCQljb21wYXJlKHNvdXJjZVJlcG8sIHRhcmdldFJlcG8pOwotCS8vCi0JLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgdGFyZ2V0LnRvRXh0ZXJuYWxGb3JtKCkgKyAiIC0+ICIgKyBzb3VyY2UudG9FeHRlcm5hbEZvcm0oKSk7Ci0JLy8JCWNvbXBhcmUodGFyZ2V0UmVwbywgc291cmNlUmVwbyk7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoSVF1ZXJ5YWJsZSBzb3VyY2VSZXBvLCBJUXVlcnlhYmxlIHRhcmdldFJlcG8pIHsKLQkvLwkJSVF1ZXJ5YWJsZVtdIHRhcmdldCA9IG5ldyBJUXVlcnlhYmxlW10ge3RhcmdldFJlcG99OwotCS8vCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gc291cmNlUmVwby5xdWVyeShudWxsLCBudWxsLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0JLy8JCWl1cyA9IHNvcnQoaXVzLCB0cnVlKTsKLQkvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspIHsKLQkvLwkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBpdXNbaV07Ci0JLy8JCQlJdGVyYXRvciByZXN1bHQgPSBRdWVyeS5nZXRJdGVyYXRvcih0YXJnZXQsIGl1LmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2UoaXUuZ2V0VmVyc2lvbigpLCB0cnVlLCBpdS5nZXRWZXJzaW9uKCksIHRydWUpLCBudWxsLCBmYWxzZSk7Ci0JLy8JCQlpZiAoIXJlc3VsdC5oYXNOZXh0KCkpCi0JLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKGl1KTsKLQkvLwkJCWVsc2UgewotCS8vCQkJCVN0cmluZyBjb21wYXJpc29uID0gY29tcGFyZShpdSwgKElJbnN0YWxsYWJsZVVuaXQpIHJlc3VsdC5uZXh0KCkpOwotCS8vCQkJCWlmIChjb21wYXJpc29uLmxlbmd0aCgpID4gMCkKLQkvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGl1ICsgY29tcGFyaXNvbik7Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGJvb2xlYW4gY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkvLwkJaWYgKGEgPT0gbnVsbCkKLQkvLwkJCXJldHVybiBiID09IG51bGw7Ci0JLy8JCXJldHVybiBhLmVxdWFscyhiKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGJvb2xlYW4gY29tcGFyZShPYmplY3RbXSBhLCBPYmplY3QgYltdKSB7Ci0JLy8JCWlmIChhID09IG51bGwpCi0JLy8JCQlyZXR1cm4gYiA9PSBudWxsOwotCS8vCQlyZXR1cm4gQXJyYXlzLmVxdWFscyhhLCBiKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIFN0cmluZyBjb21wYXJlKElJbnN0YWxsYWJsZVVuaXQgaXUsIElJbnN0YWxsYWJsZVVuaXQgbmV4dCkgewotCS8vCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JLy8JCWlmICghaXUuZXF1YWxzKG5leHQpKQotCS8vCQkJcmVzdWx0ICs9ICIgaXUiOwotCS8vCQlpZiAoIWNvbXBhcmUoaXUuZ2V0QXBwbGljYWJpbGl0eUZpbHRlcigpLCBuZXh0LmdldEFwcGxpY2FiaWxpdHlGaWx0ZXIoKSkpCi0JLy8JCQlyZXN1bHQgKz0gIiBhcHBsaWNhYmlsaXR5RmlsdGVyIjsKLQkvLwkJaWYgKCFjb21wYXJlKGl1LmdldEFydGlmYWN0cygpLCBuZXh0LmdldEFydGlmYWN0cygpKSkKLQkvLwkJCXJlc3VsdCArPSAiIGFydGlmYWN0TG9jYXRvcnMiOwotCS8vCQlpZiAoIWNvbXBhcmUoaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSwgbmV4dC5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpKSkKLQkvLwkJCXJlc3VsdCArPSAiIHByb3ZpZGVkQ2FwYWJpbGl0aWVzIjsKLQkvLwkJaWYgKCFjb21wYXJlUmVxdWlyZXMoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSwgbmV4dC5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKSkKLQkvLwkJCXJlc3VsdCArPSAiIHJlcXVpcmVkQ2FwYWJpbGl0aWVzIjsKLQkvLwkJaWYgKCFjb21wYXJlKGl1LmdldFRvdWNocG9pbnRUeXBlKCksIG5leHQuZ2V0VG91Y2hwb2ludFR5cGUoKSkpCi0JLy8JCQlyZXN1bHQgKz0gIiB0b3VjaHBvaW50VHlwZSI7Ci0JLy8KLQkvLwkJaWYgKGl1LmlzRnJhZ21lbnQoKSkgewotCS8vCQkJaWYgKCgoSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIGl1KS5nZXRIb3N0SWQoKSA9PSBudWxsIHx8ICgoSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIGl1KS5nZXRIb3N0VmVyc2lvblJhbmdlKCkgPT0gbnVsbCkKLQkvLwkJCQlyZXR1cm4gcmVzdWx0OwotCS8vCQkJaWYgKCEoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBpdSkuZ2V0SG9zdElkKCkuZXF1YWxzKCgoSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIG5leHQpLmdldEhvc3RJZCgpKSkKLQkvLwkJCQlyZXN1bHQgKz0gIiBob3N0aWQiOwotCS8vCQkJaWYgKCEoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBpdSkuZ2V0SG9zdFZlcnNpb25SYW5nZSgpLmVxdWFscygoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBuZXh0KS5nZXRIb3N0VmVyc2lvblJhbmdlKCkpKQotCS8vCQkJCXJlc3VsdCArPSAiIGhvc3R2ZXJzaW9uUmFuZ2UiOwotCS8vCQl9Ci0JLy8JCXJldHVybiByZXN1bHQ7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVSZXF1aXJlcyhSZXF1aXJlZENhcGFiaWxpdHlbXSBhLCBSZXF1aXJlZENhcGFiaWxpdHlbXSBiKSB7Ci0JLy8JCWlmIChhID09IG51bGwpCi0JLy8JCQlyZXR1cm4gYiA9PSBudWxsOwotCS8vCQlpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpCi0JLy8JCQlyZXR1cm4gZmFsc2U7Ci0JLy8JCWlmIChhID09IGIpCi0JLy8JCQlyZXR1cm4gdHJ1ZTsKLQkvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQotCS8vCQkJaWYgKGZpbmRDYXBhYmlsaXR5KGFbaV0sIGIpID09IG51bGwpCi0JLy8JCQkJcmV0dXJuIGZhbHNlOwotCS8vCQlyZXR1cm4gdHJ1ZTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSBmaW5kQ2FwYWJpbGl0eShSZXF1aXJlZENhcGFiaWxpdHkgdGFyZ2V0LCBSZXF1aXJlZENhcGFiaWxpdHlbXSBiKSB7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgewotCS8vCQkJUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkgPSBiW2ldOwotCS8vCQkJaWYgKHRhcmdldC5lcXVhbHMoY2FwYWJpbGl0eSkpCi0JLy8JCQkJcmV0dXJuIGNhcGFiaWxpdHk7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIG51bGw7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gc29ydChJSW5zdGFsbGFibGVVbml0W10gaXVzLCBib29sZWFuIGNsb25lKSB7Ci0JLy8JCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCS8vCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkvLwkJCQlJSW5zdGFsbGFibGVVbml0IHNvdXJjZUlVID0gKElJbnN0YWxsYWJsZVVuaXQpIHNvdXJjZTsKLQkvLwkJCQlJSW5zdGFsbGFibGVVbml0IHRhcmdldElVID0gKElJbnN0YWxsYWJsZVVuaXQpIHRhcmdldDsKLQkvLwkJCQlpbnQgaWQgPSBzb3VyY2VJVS5nZXRJZCgpLmNvbXBhcmVUbyh0YXJnZXRJVS5nZXRJZCgpKTsKLQkvLwkJCQlpZiAoaWQgIT0gMCkKLQkvLwkJCQkJcmV0dXJuIGlkOwotCS8vCQkJCWludCB2ZXJzaW9uID0gc291cmNlSVUuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyh0YXJnZXRJVS5nZXRWZXJzaW9uKCkpOwotCS8vCQkJCWlmICh2ZXJzaW9uICE9IDApCi0JLy8JCQkJCXJldHVybiB2ZXJzaW9uOwotCS8vCQkJCXJldHVybiAwOwotCS8vCQkJfQotCS8vCQl9OwotCS8vCQlJSW5zdGFsbGFibGVVbml0W10gcmVzdWx0ID0gaXVzOwotCS8vCQlpZiAoY2xvbmUpIHsKLQkvLwkJCXJlc3VsdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRbaXVzLmxlbmd0aF07Ci0JLy8JCQlTeXN0ZW0uYXJyYXljb3B5KGl1cywgMCwgcmVzdWx0LCAwLCBpdXMubGVuZ3RoKTsKLQkvLwkJfQotCS8vCQlBcnJheXMuc29ydChyZXN1bHQsIGNvbXBhcmF0b3IpOwotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCS8vCQlpZiAoYXJncyA9PSBudWxsKQotCS8vCQkJcmV0dXJuOwotCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkvLwkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLQkvLwotCS8vCQkJLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItc29ydCIpKQotCS8vCQkJLy8JCQkJc29ydCA9IHRydWU7Ci0JLy8KLQkvLwkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1tZXRhIikpCi0JLy8JCQkJdHlwZSA9ICJtZXRhIjsKLQkvLwotCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLWNvbXBhcmUiKSkKLQkvLwkJCQljb21wYXJlID0gdHJ1ZTsKLQkvLwotCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLXByb2ZpbGUiKSkKLQkvLwkJCQl0eXBlID0gInByb2ZpbGUiOwotCS8vCi0JLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbGlzdCIpKQotCS8vCQkJCWxpc3QgPSB0cnVlOwotCS8vCi0JLy8JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmd1bWVudCBvcgotCS8vCQkJLy8gaWYgdGhlIG5leHQgb25lCi0JLy8JCQkvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoCi0JLy8JCQkvLyBhIHBhcm0gc28gY29udGludWUuCi0JLy8JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JLy8JCQkJY29udGludWU7Ci0JLy8KLQkvLwkJCVN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0JLy8KLQkvLwkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItc291cmNlIikpCi0JLy8JCQkJc291cmNlID0gYXJnOwotCS8vCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi10YXJnZXQiKSkKLQkvLwkJCQl0YXJnZXQgPSBhcmc7Ci0JLy8JCX0KLQkvLwl9Ci0JLy8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL1VwZGF0ZUNoZWNrZXJBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL1VwZGF0ZUNoZWNrZXJBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZhODhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9VcGRhdGVDaGVja2VyQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29sczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZWNoZWNrZXIuVXBkYXRlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuKjsKLQotLyoqCi0gKiBBIGxpdHRsZSBhcHAgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlZ2lzdGVyIGZvciBhdXRvbWF0aWMgdXBkYXRlIGNoZWNrcyBvbgotICogYSBwcm9maWxlLgotICogCi0gKiAgLXByb2ZpbGUgcHJvZmlsZUlEIChzcGVjaWZpZXMgdGhlIHByb2ZpbGUgaWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMpCi0gKiAgLWRlbGF5IGxvbmcgKHNwZWNpZmllcyBhIGxvbmcgd2hpY2ggaXMgdGhlIGluaXRpYWwgZGVsYXkgYmVmb3JlIGJlZ2lubmluZyBwb2xsaW5nKQotICogIC1wb2xsIGxvbmcgKHNwZWNpZmllcyBhIGxvbmcgd2hpY2ggaXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdXBkYXRlIHBvbGwpCi0gKiAgLWRlYnVnLCAtdHJhY2UgY2FuIGJlIHVzZWQgdG8gc2hvdyB5b3Ugd2hhdCdzIGdvaW5nIG9uLgotICogIAotICogICBUaGlzIGNoZWNrZXIgc2ltcGx5IHdyaXRlcyB0byBzeXN0ZW0ub3V0IHdoZW4gdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGFuZCBsaXN0cyB0aGUKLSAqICAgSVUncyB0aGF0IGhhdmUgdXBkYXRlcyBhdmFpbGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDaGVja2VyQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFSR19QUk9GSUxFID0gIi1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBUkdfUE9MTCA9ICItcG9sbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVJHX0RFTEFZID0gIi1kZWxheSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVJHX0RFQlVHID0gIi1kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVJHX1RSQUNFID0gIi10cmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgcHJvZmlsZUlkOwotCWxvbmcgZGVsYXkgPSBJVXBkYXRlQ2hlY2tlci5PTkVfVElNRV9DSEVDSzsKLQlsb25nIHBvbGwgPSBJVXBkYXRlQ2hlY2tlci5PTkVfVElNRV9DSEVDSzsKLQlJVXBkYXRlQ2hlY2tlciBjaGVja2VyOwotCUlVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJVXBkYXRlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlc0F2YWlsYWJsZShVcGRhdGVFdmVudCBldmVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGVzIGF2YWlsYWJsZSBmb3IgIiArIHByb2ZpbGVJZCk7IC8vJE5PTi1OTFMtMSQKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXMgPSBldmVudC5nZXRJVXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXVzLmxlbmd0aDsgaSsrKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpdXNbaV0udG9TdHJpbmcoKSk7Ci0JCX0KLQotCX07Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdGFydChvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY2hlY2tlciA9IChJVXBkYXRlQ2hlY2tlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElVcGRhdGVDaGVja2VyLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChjaGVja2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVXBkYXRlIGNoZWNrZXIgY291bGQgbm90IGJlIGxvYWRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocHJvZmlsZUlkID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTXVzdCBzcGVjaWZ5IGEgcHJvZmlsZSBpZCB1c2luZyAtcHJvZmlsZSBhcmciKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJY2hlY2tlci5hZGRVcGRhdGVDaGVjayhwcm9maWxlSWQsIEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgZGVsYXksIHBvbGwsIGxpc3RlbmVyKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWNoZWNrZXIucmVtb3ZlVXBkYXRlQ2hlY2sobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcmdzW2ldLmVxdWFscyhBUkdfREVCVUcpKQotCQkJCVVwZGF0ZUNoZWNrZXIuREVCVUcgPSB0cnVlOwotCQkJZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoQVJHX1RSQUNFKSkKLQkJCQlVcGRhdGVDaGVja2VyLlRSQUNFID0gdHJ1ZTsKLQotCQkJLy8gVGhlIHJlbWFpbmluZyBhcmdzIGhhdmUgcGFyYW1ldGVycy4gIElmIHdlIGFyZSBhdCB0aGUKLQkJCS8vIGxhc3QgYXJndW1lbnQsIG9yIGlmIHRoZSBuZXh0IG9uZSBzdGFydHMgd2l0aCBhICctJywKLQkJCS8vIHRoZW4gdGhlcmUgd29uJ3QgYmUgYSBwYXJtLCBzbyBza2lwIHRoaXMgb25lLgotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShBUkdfUFJPRklMRSkpCi0JCQkJcHJvZmlsZUlkID0gYXJnOwotCQkJZWxzZSBpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShBUkdfUE9MTCkpCi0JCQkJcG9sbCA9IGdldExvbmcoQVJHX1BPTEwsIGFyZywgSVVwZGF0ZUNoZWNrZXIuT05FX1RJTUVfQ0hFQ0spOwotCQkJZWxzZSBpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShBUkdfREVMQVkpKQotCQkJCWRlbGF5ID0gZ2V0TG9uZyhBUkdfREVMQVksIGFyZywgSVVwZGF0ZUNoZWNrZXIuT05FX1RJTUVfQ0hFQ0spOwotCi0JCX0KLQl9Ci0KLQlsb25nIGdldExvbmcoU3RyaW5nIGFyZ05hbWUsIFN0cmluZyB2YWx1ZSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIGZvciAiICsgYXJnTmFtZSArICIoIiArIHZhbHVlICsgIikgaXMgbm90IGEgbG9uZy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvdXBkYXRlY2hlY2tlciBhcHAubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3VwZGF0ZWNoZWNrZXIgYXBwLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1OGZlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvdXBkYXRlY2hlY2tlciBhcHAubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5FcXVpbm94TGF1bmNoZXIiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS91cGRhdGVjaGVja2VyIGFwcCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIuYXBwLmFwcGxpY2F0aW9uJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpjOi9wcm92L3AyL3NlcnZlcnMvbWV0YWRhdGFSZXBvc2l0b3J5LyAmIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmM6L3Byb3YvcDIvc2VydmVycy9hcnRpZmFjdFJlcG9zaXRvcnkvICYjMTM7JiMxMDstcHJvZmlsZSBUZXN0JiMxMzsmIzEwOy1kZWxheSA1MDAwJiMxMzsmIzEwOy1wb2xsIDEwMDAwJiMxMzsmIzEwOy10cmFjZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1EZWNsaXBzZS5wMi5kYXRhLmFyZWE9YzovcHJvdi9wMi9hZ2VudERhdGEiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2lAOixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9ImpyZTEuNS4wXzExIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJjb20udGhvdWdodHdvcmtzLnhzdHJlYW1AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3hAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlckA1OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLmFwcEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yQGRlZmF1bHQ6dHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJiN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3NThmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhYTVkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0jRnJpIEZlYiAyMiAxMToyNDoyMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzAxOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTk6MDMgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzcxNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2U7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5wYXJzZXJzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtjb21tb249c3BsaXQsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlcjt2ZXJzaW9uPSIxLjIuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMiIsCi0gb3JnLnczYy5kb20sCi0gb3JnLnhtbC5zYXgKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJkOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRjOTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIEVjbGlwc2UgVG91Y2hwb2ludCAoSW5jdWJhdGlvbikKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTk2OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS50b3VjaHBvaW50cyIgaWQ9ImVjbGlwc2UiIG5hbWU9IkVjbGlwc2UgVG91Y2hwb2ludCI+Ci0JCTx0b3VjaHBvaW50IAotCQkJdHlwZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpIiAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludCIKLQkJCXZlcnNpb249IjEuMC4wIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci5tYXJrc2V0cHJvdmlkZXJzIgotCQkJaWQ9IkVjbGlwc2VUb3VjaHBvaW50Ij4KLQkJCTxydW4gCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLk1hcmtTZXRQcm92aWRlciIvPgotCTwvZXh0ZW5zaW9uPgotCTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmNTUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY3R4OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBBY3RpdmF0b3IuY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL0FnZ3JlZ2F0ZWRCdW5kbGVSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9BZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE4NTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL0FnZ3JlZ2F0ZWRCdW5kbGVSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeTsKLQotcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZWRCdW5kbGVSZXBvc2l0b3J5IGV4dGVuZHMgQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9UWVBFID0gQWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBidW5kbGVSZXBvc2l0b3JpZXM7Ci0KLQlwdWJsaWMgQWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkoQ29sbGVjdGlvbiBidW5kbGVSZXBvc2l0b3JpZXMpIHsKLQkJc3VwZXIoUkVQT1NJVE9SWV9UWVBFLCBSRVBPU0lUT1JZX1RZUEUsICIxLjAiLCBudWxsLCBudWxsLCBudWxsKTsKLQkJdGhpcy5idW5kbGVSZXBvc2l0b3JpZXMgPSBidW5kbGVSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGJ1bmRsZVJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlGaWxlIGFydGlmYWN0RmlsZSA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RGaWxlKGtleSk7Ci0JCQlpZiAoYXJ0aWZhY3RGaWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIGFydGlmYWN0RmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBidW5kbGVSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJRmlsZSBhcnRpZmFjdEZpbGUgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQkJCWlmIChhcnRpZmFjdEZpbGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXJ0aWZhY3RGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnVuZGxlUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXBvc2l0b3J5LmNvbnRhaW5zKGRlc2NyaXB0b3IpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBidW5kbGVSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJaWYgKHJlcG9zaXRvcnkuY29udGFpbnMoa2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnVuZGxlUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpCi0JCQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkZXNjcmlwdG9ycykpOwotCQl9Ci0JCXJldHVybiAoSUFydGlmYWN0RGVzY3JpcHRvcltdKSBhcnRpZmFjdERlc2NyaXB0b3JzLnRvQXJyYXkobmV3IElBcnRpZmFjdERlc2NyaXB0b3JbYXJ0aWZhY3REZXNjcmlwdG9ycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RLZXlzKCkgewotCQlTZXQgYXJ0aWZhY3RLZXlzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGJ1bmRsZVJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKTsKLQkJCWlmIChrZXlzICE9IG51bGwpCi0JCQkJYXJ0aWZhY3RLZXlzLmFkZEFsbChBcnJheXMuYXNMaXN0KGtleXMpKTsKLQkJfQotCQlyZXR1cm4gKElBcnRpZmFjdEtleVtdKSBhcnRpZmFjdEtleXMudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W2FydGlmYWN0S2V5cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IGFydGlmYWN0IHJldHJpZXZhbCIpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0cyhJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlcG9zaXRvcnkgZG9lcyBub3Qgc3VwcG9ydCBhcnRpZmFjdCByZXRyaWV2YWwiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9FY2xpcHNlVG91Y2hwb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvRWNsaXBzZVRvdWNocG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiZDE1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9FY2xpcHNlVG91Y2hwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVRvdWNocG9pbnQgZXh0ZW5kcyBUb3VjaHBvaW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIFRPVUNIUE9JTlRfVFlQRSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpIiwgbmV3IFZlcnNpb24oIjEuMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvLyBUT0RPOiBwaGFzZSBpZCBjb25zdGFudHMgc2hvdWxkIGJlIGRlZmluZWQgZWxzZXdoZXJlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExfUEhBU0VfSUQgPSAiaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklOU1RBTExfUEhBU0VfSUQgPSAidW5pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9QUk9QX0xBVU5DSEVSX05BTUUgPSAiZWNsaXBzZS50b3VjaHBvaW50LmxhdW5jaGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX01BTklQVUxBVE9SID0gIm1hbmlwdWxhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fUExBVEZPUk1fQ09ORklHVVJBVElPTiA9ICJwbGF0Zm9ybUNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9TT1VSQ0VfQlVORExFUyA9ICJzb3VyY2VCdW5kbGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fSVUgPSAiaXUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9JTlNUQUxMX0ZPTERFUiA9ICJpbnN0YWxsRm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgY29tcGxldGVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHRvdWNocG9pbnRQYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE1lc3NhZ2VzLmVycm9yX3NhdmluZ19tYW5pcHVsYXRvciwgZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE1lc3NhZ2VzLmVycm9yX3NhdmluZ19tYW5pcHVsYXRvciwgZSk7Ci0JCX0KLQotCQlpZiAoSU5TVEFMTF9QSEFTRV9JRC5lcXVhbHMocGhhc2VJZCkgfHwgVU5JTlNUQUxMX1BIQVNFX0lELmVxdWFscyhwaGFzZUlkKSkgewotCQkJUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlciBjb25maWd1cmF0aW9uID0gKFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIpIHRvdWNocG9pbnRQYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX1BMQVRGT1JNX0NPTkZJR1VSQVRJT04pOwotCQkJdHJ5IHsKLQkJCQljb25maWd1cmF0aW9uLnNhdmUoKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBwZSkgewotCQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE1lc3NhZ2VzLmVycm9yX3NhdmluZ19wbGF0Zm9ybV9jb25maWd1cmF0aW9uLCBwZSk7Ci0JCQl9Ci0JCX0KLQotCQlTb3VyY2VNYW5pcHVsYXRvciBtID0gKFNvdXJjZU1hbmlwdWxhdG9yKSB0b3VjaHBvaW50UGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9TT1VSQ0VfQlVORExFUyk7Ci0JCXRyeSB7Ci0JCQltLnNhdmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX3NvdXJjZV9idW5kbGVzX2xpc3QsIGUpOwotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgZ2V0Q29uZmlndXJhdGlvblVSTChJUHJvZmlsZSBwcm9maWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgY29uZmlnRGlyID0gVXRpbC5nZXRDb25maWd1cmF0aW9uRm9sZGVyKHByb2ZpbGUpOwotCQlVUkwgY29uZmlnVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbmZpZ1VSTCA9IGNvbmZpZ0Rpci50b1VSSSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihVdGlsLmNyZWF0ZUVycm9yKCJDb25maWd1cmF0aW9uIGRpcmVjdG9yeSBpcyBub3QgYWJzb2x1dGUuIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihVdGlsLmNyZWF0ZUVycm9yKCJObyBVUkwgcHJvdG9jb2wgaGFuZGxlci4iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY29uZmlnVVJMOwotCX0KLQotCXB1YmxpYyBQcm92aXNpb25pbmdBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gQWN0aW9uRmFjdG9yeS5jcmVhdGUoYWN0aW9uSWQpOwotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJLy9UT0RPIHRoaXMgZGF0YSBwcm9iYWJseSBuZWVkcyB0byBjb21lIGZyb20gdGhlIFhNTAotCQlyZXR1cm4gVE9VQ0hQT0lOVF9UWVBFOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMpIHsKLQkJdG91Y2hwb2ludFBhcmFtZXRlcnMucHV0KFBBUk1fSU5TVEFMTF9GT0xERVIsIFV0aWwuZ2V0SW5zdGFsbEZvbGRlcihwcm9maWxlKSk7Ci0JCUxhenlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IG5ldyBMYXp5TWFuaXB1bGF0b3IocHJvZmlsZSk7Ci0JCXRvdWNocG9pbnRQYXJhbWV0ZXJzLnB1dChQQVJNX01BTklQVUxBVE9SLCBtYW5pcHVsYXRvcik7Ci0JCXRvdWNocG9pbnRQYXJhbWV0ZXJzLnB1dChQQVJNX1NPVVJDRV9CVU5ETEVTLCBuZXcgU291cmNlTWFuaXB1bGF0b3IocHJvZmlsZSkpOwotCQl0cnkgewotCQkJVVJMIGNvbmZpZ1VSTCA9IGdldENvbmZpZ3VyYXRpb25VUkwocHJvZmlsZSk7Ci0JCQlVUkwgcG9vbFVSTCA9IFV0aWwuZ2V0QnVuZGxlUG9vbExvY2F0aW9uKHByb2ZpbGUpOwotCQkJdG91Y2hwb2ludFBhcmFtZXRlcnMucHV0KFBBUk1fUExBVEZPUk1fQ09ORklHVVJBVElPTiwgbmV3IFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIoY29uZmlnVVJMLCBwb29sVVJMLCBtYW5pcHVsYXRvcikpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl0b3VjaHBvaW50UGFyYW1ldGVycy5wdXQoUEFSTV9QTEFURk9STV9DT05GSUdVUkFUSU9OLCBuZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlcihudWxsLCBudWxsLCBudWxsKSk7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9jb25zdHJ1Y3RpbmdfcGxhdGZvcm1fY29uZmlndXJhdGlvbl91cmwsIGNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycykgewotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fSVUpOwotCQlpZiAoaXUgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2YoaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BBUlRJQUxfSVUpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdCBwcmVwYXJlZElVID0gcHJlcGFyZUlVKGl1LCBwcm9maWxlKTsKLQkJCWlmIChwcmVwYXJlZElVID09IG51bGwpCi0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX3ByZXBhcmVJVSwgaXUpKTsKLQotCQkJcGFyYW1ldGVycy5wdXQoUEFSTV9JVSwgcHJlcGFyZWRJVSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHByZXBhcmVJVShJSW5zdGFsbGFibGVVbml0IGl1LCBJUHJvZmlsZSBwcm9maWxlKSB7Ci0KLQkJQ2xhc3MgYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGMgIT0gbnVsbCkKLQkJCQljID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlBsYXRmb3JtQWRtaW4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZ2VuZXJhdG9yX25vdF9hdmFpbGFibGUsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCX0KLQotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGl1OwotCi0JCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0JCQlpZiAoYXJ0aWZhY3RLZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gaXU7Ci0KLQkJCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJCWlmIChidW5kbGVGaWxlID09IG51bGwpIHsKLQkJCQlMb2dIZWxwZXIubG9nKFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5LnRvU3RyaW5nKCkpKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gTWV0YWRhdGFHZW5lcmF0b3JVdGlscy5jcmVhdGVCdW5kbGVJVShhcnRpZmFjdEtleSwgYnVuZGxlRmlsZSk7Ci0JCX0KLQotCQkvLyBzaG91bGQgbm90IG9jY3VyCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3RhdGU6IHByZXBhcmVJVSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGxvYWRNYW5pcHVsYXRvcihNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgewotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcik7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9sb2FkaW5nX21hbmlwdWxhdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcik7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTGF6eU1hbmlwdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9MYXp5TWFuaXB1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5ZTg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9MYXp5TWFuaXB1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBMYXp5TWFuaXB1bGF0b3IgaW1wbGVtZW50cyBNYW5pcHVsYXRvciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMVEVSX09CSkVDVENMQVNTID0gIigiICsgQ29uc3RhbnRzLk9CSkVDVENMQVNTICsgJz0nICsgRnJhbWV3b3JrQWRtaW4uY2xhc3MuZ2V0TmFtZSgpICsgJyknOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZpbHRlckZ3TmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRSArICI9RXF1aW5veCkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyTGF1bmNoZXJOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9OQU1FICsgIj1FY2xpcHNlLmV4ZSkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmlsdGVyRndBZG1pbiA9ICIoJiIgKyBGSUxURVJfT0JKRUNUQ0xBU1MgKyBmaWx0ZXJGd05hbWUgKyBmaWx0ZXJMYXVuY2hlck5hbWUgKyAnKSc7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwcml2YXRlIE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yOwotCXByaXZhdGUgZmluYWwgSVByb2ZpbGUgcHJvZmlsZTsKLQotCXB1YmxpYyBMYXp5TWFuaXB1bGF0b3IoSVByb2ZpbGUgcHJvZmlsZSkgewotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGVsZWdhdGUoKSB7Ci0JCWlmIChtYW5pcHVsYXRvciAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW1hbmlwdWxhdG9yID0gZ2V0RnJhbWV3b3JrTWFuaXB1bGF0b3IoKTsKLQkJaWYgKG1hbmlwdWxhdG9yID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgYWNxdWlyZSB0aGUgZnJhbWV3b3JrIG1hbmlwdWxhdG9yIHNlcnZpY2UuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKFV0aWwuZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihwcm9maWxlKSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihVdGlsLmdldExhdW5jaGVyUGF0aChwcm9maWxlKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMikgewotCQkJLy8gVE9ETyBpZiBmd0phciBpcyBub3QgaW5jbHVkZWQsIHRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBCdXQgaWdub3JlIGl0LiAKLQkJCS8vCQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gZTIpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJLy9UT0RPIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgYnkgYSBjb25maWd1cmF0aW9uIHVuaXQgKGJ1ZyAyMDQxMjQpCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AoImVjbGlwc2UucDIucHJvZmlsZSIsIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AoImVjbGlwc2UucDIuZGF0YS5hcmVhIiwgVXRpbC5jb21wdXRlUmVsYXRpdmVBZ2VudExvY2F0aW9uKHByb2ZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRnJhbWV3b3JrQWRtaW4gZ2V0RnJhbWV3b3JrQWRtaW4oKSB7Ci0JCVNlcnZpY2VUcmFja2VyIGZ3QWRtaW5UcmFja2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbHRlciBmaWx0ZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmNyZWF0ZUZpbHRlcihmaWx0ZXJGd0FkbWluKTsKLQkJCWZ3QWRtaW5UcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIGZpbHRlciwgbnVsbCk7Ci0JCQlmd0FkbWluVHJhY2tlci5vcGVuKCk7Ci0JCQlGcmFtZXdvcmtBZG1pbiBmd0FkbWluID0gKEZyYW1ld29ya0FkbWluKSBmd0FkbWluVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCQlyZXR1cm4gZndBZG1pbjsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0Nhbid0IGhhcHBlbiB3ZSBhcmUgd3JpdGluZyB0aGUgZmlsdGVyIG91cnNlbHZlcwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZndBZG1pblRyYWNrZXIgIT0gbnVsbCkKLQkJCQlmd0FkbWluVHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNYW5pcHVsYXRvciBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndBZG1pbiA9IGdldEZyYW1ld29ya0FkbWluKCk7Ci0JCWlmIChmd0FkbWluICE9IG51bGwpCi0JCQlyZXR1cm4gZndBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCWlmIChtYW5pcHVsYXRvciAhPSBudWxsKQotCQkJbWFuaXB1bGF0b3Iuc2F2ZShiYWNrdXApOwotCX0KLQotCS8vIERFTEVHQVRFIE1FVEhPRFMKLQotCXB1YmxpYyBCdW5kbGVzU3RhdGUgZ2V0QnVuZGxlc1N0YXRlKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCWxvYWREZWxlZ2F0ZSgpOwotCQlyZXR1cm4gbWFuaXB1bGF0b3IuZ2V0QnVuZGxlc1N0YXRlKCk7Ci0JfQotCi0JcHVibGljIENvbmZpZ0RhdGEgZ2V0Q29uZmlnRGF0YSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJcmV0dXJuIG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEV4cGVjdGVkU3RhdGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCXJldHVybiBtYW5pcHVsYXRvci5nZXRFeHBlY3RlZFN0YXRlKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaGVyRGF0YSBnZXRMYXVuY2hlckRhdGEoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCXJldHVybiBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRUaW1lU3RhbXAoKSB7Ci0JCWxvYWREZWxlZ2F0ZSgpOwotCQlyZXR1cm4gbWFuaXB1bGF0b3IuZ2V0VGltZVN0YW1wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCW1hbmlwdWxhdG9yLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnRGF0YShDb25maWdEYXRhIGNvbmZpZ0RhdGEpIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCW1hbmlwdWxhdG9yLnNldENvbmZpZ0RhdGEoY29uZmlnRGF0YSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXJEYXRhKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEpIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCW1hbmlwdWxhdG9yLnNldExhdW5jaGVyRGF0YShsYXVuY2hlckRhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL01hcmtTZXRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWFya1NldFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjAzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWFya1NldFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvci5JTWFya1NldFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvci5NYXJrU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBJTWFya1NldFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgRWNsaXBzZVRvdWNoUG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrU2V0UHJvdmlkZXIgaW1wbGVtZW50cyBJTWFya1NldFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfQ0xBU1NJRklFUl9PU0dJX0JVTkRMRSA9ICJvc2dpLmJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfQ0xBU1NJRklFUl9GRUFUVVJFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5mZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFydGlmYWN0S2V5TGlzdCA9IG51bGw7Ci0KLQlwdWJsaWMgTWFya1NldFtdIGdldE1hcmtTZXRzKElQcm9maWxlIGluUHJvZmlsZSkgewotCQlhcnRpZmFjdEtleUxpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnlUb0dDID0gVXRpbC5nZXRCdW5kbGVQb29sUmVwb3NpdG9yeShpblByb2ZpbGUpOwotCQlhZGRBcnRpZmFjdEtleXMoaW5Qcm9maWxlKTsKLQkJSVByb2ZpbGUgY3VycmVudFByb2ZpbGUgPSBnZXRDdXJyZW50UHJvZmlsZSgpOwotCQlpZiAoY3VycmVudFByb2ZpbGUgIT0gbnVsbCAmJiBpblByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkuZXF1YWxzKGN1cnJlbnRQcm9maWxlLmdldFByb2ZpbGVJZCgpKSkgewotCQkJYWRkUnVubmluZ0J1bmRsZXMocmVwb3NpdG9yeVRvR0MpOwotCQkJYWRkUnVubmluZ0ZlYXR1cmVzKGluUHJvZmlsZSwgcmVwb3NpdG9yeVRvR0MpOwotCQl9Ci0JCXJldHVybiBuZXcgTWFya1NldFtdIHtuZXcgTWFya1NldCgoSUFydGlmYWN0S2V5W10pIGFydGlmYWN0S2V5TGlzdC50b0FycmF5KG5ldyBJQXJ0aWZhY3RLZXlbMF0pLCByZXBvc2l0b3J5VG9HQyl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSdW5uaW5nRmVhdHVyZXMoSVByb2ZpbGUgcHJvZmlsZSwgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5VG9HQykgewotCQl0cnkgewotCQkJTGlzdCBhbGxGZWF0dXJlcyA9IGdldEFsbEZlYXR1cmVzKENvbmZpZ3VyYXRpb24ubG9hZChuZXcgRmlsZShVdGlsLmdldENvbmZpZ3VyYXRpb25Gb2xkZXIocHJvZmlsZSksICJvcmcuZWNsaXBzZS51cGRhdGUvcGxhdGZvcm0ueG1sIiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlGZWF0dXJlIGYgPSAoRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlBcnRpZmFjdEtleSBtYXRjaCA9IHNlYXJjaEFydGlmYWN0KGYuZ2V0SWQoKSwgbmV3IFZlcnNpb24oZi5nZXRWZXJzaW9uKCkpLCBBUlRJRkFDVF9DTEFTU0lGSUVSX0ZFQVRVUkUsIHJlcG9zaXRvcnlUb0dDKTsKLQkJCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCQkJYXJ0aWZhY3RLZXlMaXN0LmFkZChtYXRjaCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QWxsRmVhdHVyZXMoQ29uZmlndXJhdGlvbiBjZmcpIHsKLQkJaWYgKGNmZyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3Qgc2l0ZXMgPSBjZmcuZ2V0U2l0ZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNpdGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVNpdGUgb2JqZWN0ID0gKFNpdGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUZlYXR1cmVbXSBmZWF0dXJlcyA9IG9iamVjdC5nZXRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZXNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZmlsZSBnZXRDdXJyZW50UHJvZmlsZSgpIHsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHIgPSAoSVByb2ZpbGVSZWdpc3RyeSkgQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHNyKTsKLQkJaWYgKHByID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2Uoc3IpOwotCQlyZXR1cm4gcHIuZ2V0UHJvZmlsZShJUHJvZmlsZVJlZ2lzdHJ5LlNFTEYpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBcnRpZmFjdEtleXMoSVByb2ZpbGUgYVByb2ZpbGUpIHsKLQkJSXRlcmF0b3IgaW5zdGFsbGFibGVVbml0cyA9IGFQcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaW5zdGFsbGFibGVVbml0cy5oYXNOZXh0KCkpIHsKLQkJCUlBcnRpZmFjdEtleVtdIGtleXMgPSAoKElJbnN0YWxsYWJsZVVuaXQpIGluc3RhbGxhYmxlVW5pdHMubmV4dCgpKS5nZXRBcnRpZmFjdHMoKTsKLQkJCWlmIChrZXlzID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcnRpZmFjdEtleUxpc3QuYWRkKGtleXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShJUHJvZmlsZSBhUHJvZmlsZSkgewotCQlyZXR1cm4gVXRpbC5nZXRCdW5kbGVQb29sUmVwb3NpdG9yeShhUHJvZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJ1bm5pbmdCdW5kbGVzKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbykgewotCQlhcnRpZmFjdEtleUxpc3QuYWRkQWxsKGZpbmRDb3JyZXNwb25kaW5BcnRpZmFjdHMobmV3IFdoYXRJc1J1bm5pbmcoKS5nZXRCdW5kbGVzQmVpbmdSdW4oKSwgcmVwbykpOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0S2V5IHNlYXJjaEFydGlmYWN0KFN0cmluZyBzZWFyY2hlZElkLCBWZXJzaW9uIHNlYXJjaGVkVmVyc2lvbiwgU3RyaW5nIGNsYXNzaWZpZXIsIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbykgewotCQkvL1RoaXMgaXMgc29tZXdoYXQgY2hlYXRpbmcgc2luY2Ugbm9ybWFsbHkgd2Ugc2hvdWxkIGdldCB0aGUgYXJ0aWZhY3Qga2V5IGZyb20gdGhlIElVcyB0aGF0IHdlcmUgcmVwcmVzZW50aW5nIHRoZSBydW5uaW5nIHN5c3RlbSAoZS5nLiB3ZSBjb3VsZCBnZXQgdGhhdCBpbmZvIGZyb20gdGhlIHJvbGxiYWNrIHJlcG8pCi0JCUlBcnRpZmFjdEtleVtdIGtleXMgPSByZXBvLmdldEFydGlmYWN0S2V5cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChrZXlzW2ldLmdldENsYXNzaWZpZXIoKS5lcXVhbHMoY2xhc3NpZmllcikpIHsKLQkJCQlTdHJpbmcgaWQgPSBrZXlzW2ldLmdldElkKCk7Ci0JCQkJVmVyc2lvbiB2ID0ga2V5c1tpXS5nZXRWZXJzaW9uKCk7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKHNlYXJjaGVkSWQpICYmIHYgIT0gbnVsbCAmJiB2LmVxdWFscyhzZWFyY2hlZFZlcnNpb24pKQotCQkJCQlyZXR1cm4ga2V5c1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL0ZpbmQgZm9yIGVhY2ggYnVuZGxlIGluZm8gYSBjb3JyZXNwb25kaW5nIGFydGlmYWN0IGluIHJlcG8gCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmluZENvcnJlc3BvbmRpbkFydGlmYWN0cyhCdW5kbGVJbmZvW10gYmlzLCBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8pIHsKLQkJQXJyYXlMaXN0IHRvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IG1hdGNoID0gc2VhcmNoQXJ0aWZhY3QoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBuZXcgVmVyc2lvbihiaXNbaV0uZ2V0VmVyc2lvbigpKSwgQVJUSUZBQ1RfQ0xBU1NJRklFUl9PU0dJX0JVTkRMRSwgcmVwbyk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCQl0b1JldGFpbi5hZGQobWF0Y2gpOwotCQl9Ci0JCXJldHVybiB0b1JldGFpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhNDc2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVQb29sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZF9wcmVwYXJlSVU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3Jfc2F2aW5nX21hbmlwdWxhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3NhdmluZ19wbGF0Zm9ybV9jb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3NhdmluZ19zb3VyY2VfYnVuZGxlc19saXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX2NvbnN0cnVjdGluZ19wbGF0Zm9ybV9jb25maWd1cmF0aW9uX3VybDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0b3Jfbm90X2F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9maWxlX25vdF9mb3VuZDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWV0YWRhdGFHZW5lcmF0b3JVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWV0YWRhdGFHZW5lcmF0b3JVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZmZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL01ldGFkYXRhR2VuZXJhdG9yVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5CdW5kbGVEZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUdlbmVyYXRvclV0aWxzIHsKLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCdW5kbGVJVShJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXksIEZpbGUgYnVuZGxlRmlsZSkgewotCQlCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGluaXRpYWxpemVCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoQWN0aXZhdG9yLmdldENvbnRleHQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZURlc2NyaXB0aW9uID0gZmFjdG9yeS5nZXRCdW5kbGVEZXNjcmlwdGlvbihidW5kbGVGaWxlKTsKLQkJcmV0dXJuIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUlVKGJ1bmRsZURlc2NyaXB0aW9uLCAoTWFwKSBidW5kbGVEZXNjcmlwdGlvbi5nZXRVc2VyT2JqZWN0KCksIGJ1bmRsZUZpbGUuaXNEaXJlY3RvcnkoKSwgYXJ0aWZhY3RLZXkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBpbml0aWFsaXplQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCi0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGxhdGZvcm1BZG1pbiBub3QgcmVnaXN0ZXJlZC4iKTsKLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAocGxhdGZvcm1BZG1pbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGxhdGZvcm1BZG1pbiBub3QgcmVnaXN0ZXJlZC4iKTsKLQotCQl0cnkgewotCQkJU3RhdGVPYmplY3RGYWN0b3J5IHN0YXRlT2JqZWN0RmFjdG9yeSA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCQkJcmV0dXJuIG5ldyBCdW5kbGVEZXNjcmlwdGlvbkZhY3Rvcnkoc3RhdGVPYmplY3RGYWN0b3J5LCBudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1BsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1BsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5MTcxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotLyoqCQotICogCVRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHBsYXRmb3JtLnhtbC4KLSAqIAotICogCU9ubHkgYSBtaW5pbWFsIHNldCBvZiBvcGVyYXRpb25zIGlzIGV4cG9zZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQlwcml2YXRlIFNpdGUgcG9vbFNpdGUgPSBudWxsOwotCXByaXZhdGUgRmlsZSBjb25maWdGaWxlOwotCXByaXZhdGUgVVJMIHBvb2xVUkw7Ci0JcHJpdmF0ZSBNYW5pcHVsYXRvciBtYW5pcHVsYXRvcjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0T1NHaUluc3RhbGxBcmVhKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yKSB7Ci0JCWZpbmFsIFN0cmluZyBPU0dJID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUluZm9bXSBiaXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlTdHJpbmcgc2VhcmNoRm9yID0gIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhzZWFyY2hGb3IpKSB7Ci0JCQkJaWYgKGJpc1tpXS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChiaXNbaV0uZ2V0TG9jYXRpb24oKS5zdGFydHNXaXRoKCJmaWxlOiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIGZyb21PU0dpSmFyVG9PU0dpSW5zdGFsbEFyZWEoYmlzW2ldLmdldExvY2F0aW9uKCkuc3Vic3RyaW5nKDUpKS50b1VSTCgpOwotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNlYXJjaEZvci5lcXVhbHMoT1NHSSkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXNlYXJjaEZvciA9IE9TR0k7Ci0JCQkJaSA9IC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGUgZnJvbU9TR2lKYXJUb09TR2lJbnN0YWxsQXJlYShTdHJpbmcgcGF0aCkgewotCQlJUGF0aCBwYXJlbnRGb2xkZXIgPSBuZXcgUGF0aChwYXRoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWlmIChwYXJlbnRGb2xkZXIubGFzdFNlZ21lbnQoKS5lcXVhbHMoInBsdWdpbnMiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBhcmVudEZvbGRlci5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9GaWxlKCk7Ci0JCXJldHVybiBwYXJlbnRGb2xkZXIudG9GaWxlKCk7Ci0JfQotCi0JcHVibGljIFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIoVVJMIGNvbmZpZ0RpciwgVVJMIGZlYXR1cmVQb29sLCBNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgewotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQl0aGlzLmNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShjb25maWdEaXIuZ2V0RmlsZSgpLCAiL29yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnBvb2xVUkwgPSBmZWF0dXJlUG9vbDsKLQkJdGhpcy5tYW5pcHVsYXRvciA9IG1hbmlwdWxhdG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGVsZWdhdGUoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWlmIChjb25maWdGaWxlLmV4aXN0cygpKSB7Ci0JCQkJY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ubG9hZChjb25maWdGaWxlLCBnZXRPU0dpSW5zdGFsbEFyZWEobWFuaXB1bGF0b3IpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBwZSkgewotCQkJLy8gVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBtZXNzYWdlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIik7IC8vJE5PTi1OTFMtMSQ7Ci0JCX0KLQotCQlwb29sU2l0ZSA9IGdldFNpdGUocG9vbFVSTCk7Ci0JCWlmIChwb29sU2l0ZSA9PSBudWxsKSB7Ci0JCQlwb29sU2l0ZSA9IGNyZWF0ZVNpdGUocG9vbFVSTCk7Ci0JCQljb25maWd1cmF0aW9uLmFkZChwb29sU2l0ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgc2l0ZSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgU2l0ZSBjcmVhdGVTaXRlKFVSTCBsb2NhdGlvbikgewotCQlTaXRlIHJlc3VsdCA9IG5ldyBTaXRlKCk7Ci0JCXJlc3VsdC5zZXRVcmwobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCXJlc3VsdC5zZXRQb2xpY3koU2l0ZS5QT0xJQ1lfTUFOQUdFRF9PTkxZKTsKLQkJcmVzdWx0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdGhlIHNpdGUgb2JqZWN0IHdob3NlIGxvY2F0aW9uIG1hdGNoZXMKLQkgKiB0aGUgZ2l2ZW4gVVJMLiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KLQkgKi8KLQlwcml2YXRlIFNpdGUgZ2V0U2l0ZShVUkwgdXJsKSB7Ci0JCUxpc3Qgc2l0ZXMgPSBjb25maWd1cmF0aW9uLmdldFNpdGVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2l0ZSBuZXh0U2l0ZSA9IChTaXRlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuZXh0VVJMID0gbmV4dFNpdGUuZ2V0VXJsKCk7Ci0JCQlpZiAobmV3IFBhdGgobmV4dFVSTCkuZXF1YWxzKG5ldyBQYXRoKHVybC50b0V4dGVybmFsRm9ybSgpKSkpIHsKLQkJCQlyZXR1cm4gbmV4dFNpdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdGhlIHNpdGUgd2hpY2ggY29udGFpbnMgdGhlIGZlYXR1cmUKLQkgKiB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uLiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCXByaXZhdGUgU2l0ZSBnZXRTaXRlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJTGlzdCBzaXRlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0U2l0ZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2l0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTaXRlIHNpdGUgPSAoU2l0ZSkgaXRlci5uZXh0KCk7Ci0JCQlGZWF0dXJlW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyhmZWF0dXJlc1tpXS5nZXRJZCgpKSAmJiB2ZXJzaW9uLmVxdWFscyhmZWF0dXJlc1tpXS5nZXRWZXJzaW9uKCkpKQotCQkJCQlyZXR1cm4gc2l0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uI2NyZWF0ZUZlYXR1cmVFbnRyeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLm5ldC5VUkxbXSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBhZGRGZWF0dXJlRW50cnkoRmlsZSBmaWxlLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcGx1Z2luSWRlbnRpZmllciwgU3RyaW5nIHBsdWdpblZlcnNpb24sIGJvb2xlYW4gcHJpbWFyeSwgU3RyaW5nIGFwcGxpY2F0aW9uLCBVUkxbXSByb290KSB7Ci0JCWxvYWREZWxlZ2F0ZSgpOwotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsICJQbGF0Zm9ybSBjb25maWd1cmF0aW9uIG5vdCBhdmFpbGFibGUuIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlVUkwgZmlsZVVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZlYXR1cmVEaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChmZWF0dXJlRGlyID09IG51bGwgfHwgIWZlYXR1cmVEaXIuZ2V0TmFtZSgpLmVxdWFscygiZmVhdHVyZXMiKSkKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJQYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZSBcImZlYXR1cmVzXCI6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsKTsKLQkJCUZpbGUgbG9jYXRpb25EaXIgPSBmZWF0dXJlRGlyLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChsb2NhdGlvbkRpciA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIlVuYWJsZSB0byBjYWxjdWxhdGUgZXh0ZW5zaW9uIGxvY2F0aW9uIGZvcjogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQlmaWxlVVJMID0gbG9jYXRpb25EaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsKTsKLQkJfQotCQlTaXRlIHNpdGUgPSBnZXRTaXRlKGZpbGVVUkwpOwotCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQlzaXRlID0gY3JlYXRlU2l0ZShmaWxlVVJMKTsKLQkJCWNvbmZpZ3VyYXRpb24uYWRkKHNpdGUpOwotCQl9Ci0JCUZlYXR1cmUgYWRkZWRGZWF0dXJlID0gbmV3IEZlYXR1cmUoc2l0ZSk7Ci0JCWFkZGVkRmVhdHVyZS5zZXRJZChpZCk7Ci0JCWFkZGVkRmVhdHVyZS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlhZGRlZEZlYXR1cmUuc2V0VXJsKG1ha2VGZWF0dXJlVVJMKGlkLCB2ZXJzaW9uKSk7Ci0JCXNpdGUuYWRkRmVhdHVyZShhZGRlZEZlYXR1cmUpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uI2ZpbmRDb25maWd1cmVkRmVhdHVyZUVudHJ5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVtb3ZlRmVhdHVyZUVudHJ5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgIlBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gbm90IGF2YWlsYWJsZS4iLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCVNpdGUgc2l0ZSA9IGdldFNpdGUoaWQsIHZlcnNpb24pOwotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJc2l0ZSA9IHBvb2xTaXRlOwotCQlGZWF0dXJlIHJlbW92ZWRGZWF0dXJlID0gc2l0ZS5yZW1vdmVGZWF0dXJlKG1ha2VGZWF0dXJlVVJMKGlkLCB2ZXJzaW9uKSk7Ci0JCXJldHVybiAocmVtb3ZlZEZlYXR1cmUgIT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkEgZmVhdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQgd2FzIG5vdCBmb3VuZC4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uI3NhdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJY29uZmlnRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQljb25maWd1cmF0aW9uLnNhdmUoY29uZmlnRmlsZSwgZ2V0T1NHaUluc3RhbGxBcmVhKG1hbmlwdWxhdG9yKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUZlYXR1cmVVUkwoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gRkVBVFVSRVMgKyBpZCArICJfIiArIHZlcnNpb24gKyAiLyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJDsKLQl9Ci0KLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1NvdXJjZU1hbmlwdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9Tb3VyY2VNYW5pcHVsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFmNDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1NvdXJjZU1hbmlwdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IuU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vL1RoaXMgY2xhc3MgZGVhbHMgd2l0aCBzb3VyY2UgYnVuZGxlcyBhbmQgaG93IHRoZWlyIGFkZGl0aW9uIHRvIHRoZSBzb3VyY2VyY2UuaW5mbwotcHVibGljIGNsYXNzIFNvdXJjZU1hbmlwdWxhdG9yIHsKLQlwcml2YXRlIExpc3Qgc291cmNlQnVuZGxlczsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwdWJsaWMgU291cmNlTWFuaXB1bGF0b3IoSVByb2ZpbGUgcHJvZmlsZSkgewotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZShGaWxlIGJ1bmRsZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VCdW5kbGVzID09IG51bGwpCi0JCQlsb2FkKCk7Ci0JCXNvdXJjZUJ1bmRsZXMuYWRkKG5ldyBCdW5kbGVJbmZvKGJ1bmRsZUZpbGUudG9VUkwoKS50b1N0cmluZygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlKEZpbGUgYnVuZGxlRmlsZSwgU3RyaW5nIGJ1bmRsZUlkLCBWZXJzaW9uIGJ1bmRsZVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VCdW5kbGVzID09IG51bGwpCi0JCQlsb2FkKCk7Ci0JCUJ1bmRsZUluZm8gc291cmNlSW5mbyA9IG5ldyBCdW5kbGVJbmZvKGJ1bmRsZUZpbGUudG9VUkwoKS50b1N0cmluZygpKTsKLQkJc291cmNlSW5mby5zZXRTeW1ib2xpY05hbWUoYnVuZGxlSWQpOwotCQlzb3VyY2VJbmZvLnNldFZlcnNpb24oYnVuZGxlVmVyc2lvbi50b1N0cmluZygpKTsKLQkJc291cmNlQnVuZGxlcy5hZGQoc291cmNlSW5mbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlKEZpbGUgYnVuZGxlRmlsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoc291cmNlQnVuZGxlcyA9PSBudWxsKQotCQkJbG9hZCgpOwotCQlzb3VyY2VCdW5kbGVzLnJlbW92ZShuZXcgQnVuZGxlSW5mbyhidW5kbGVGaWxlLnRvVVJMKCkudG9TdHJpbmcoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc291cmNlQnVuZGxlcyAhPSBudWxsKQotCQkJU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsLnNhdmVDb25maWd1cmF0aW9uKHNvdXJjZUJ1bmRsZXMsIGdldEZpbGVMb2NhdGlvbigpLCBnZXRMYXVuY2hlckxvY2F0aW9uKCksIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGdldEZpbGVMb2NhdGlvbigpLmV4aXN0cygpKQotCQkJc291cmNlQnVuZGxlcyA9IFNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbC5yZWFkQ29uZmlndXJhdGlvbihnZXRGaWxlTG9jYXRpb24oKS50b1VSTCgpLCBnZXRMYXVuY2hlckxvY2F0aW9uKCkpOwotCQllbHNlCi0JCQlzb3VyY2VCdW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRmlsZShVdGlsLmdldENvbmZpZ3VyYXRpb25Gb2xkZXIocHJvZmlsZSksICJvcmcuZWNsaXBzZS5lcXVpbm94LnNvdXJjZS9zb3VyY2UuaW5mbyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldExhdW5jaGVyTG9jYXRpb24oKSB7Ci0JCXJldHVybiBVdGlsLmdldEluc3RhbGxGb2xkZXIocHJvZmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQ1OTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUmVkIEhhdCBJbmNvcnBvcmF0ZWQgLSBmaXggZm9yIGJ1ZyAyMjUxNDUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlRvdWNocG9pbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQotCS8qKgotCSAqIFRPRE8gImNhY2hlIiBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IHRlcm0gZm9yIHRoaXMgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ORklHX0ZPTERFUiA9ICJlY2xpcHNlLmNvbmZpZ3VyYXRpb25Gb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfVFlQRSA9IElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYVEVOU0lPTlMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jYWNoZS5leHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBFID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIEFnZW50TG9jYXRpb24gZ2V0QWdlbnRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpIHsKLQkJcmV0dXJuIChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0QnVuZGxlUG9vbExvY2F0aW9uKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfQ0FDSEUpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPIHRoaXMgaXMgYSBoYWNrIGZvciBub3cuCi0JCQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLnRvVVJMKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gRG8gbm90aGluZyBhbmQgdXNlIHRoZSBkZWZhdWx0IGFwcHJvYWNoCi0JCQl9Ci0JCUFnZW50TG9jYXRpb24gbG9jYXRpb24gPSBnZXRBZ2VudExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBsb2NhdGlvbi5nZXREYXRhQXJlYShBY3RpdmF0b3IuSUQpOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlVUkwgbG9jYXRpb24gPSBnZXRCdW5kbGVQb29sTG9jYXRpb24ocHJvZmlsZSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vdGhlIHJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCwgc28gZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IE1lc3NhZ2VzLkJ1bmRsZVBvb2w7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGJ1bmRsZVBvb2wgPSBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sIHJlcG9zaXRvcnlOYW1lLCBSRVBPU0lUT1JZX1RZUEUpOwotCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KGJ1bmRsZVBvb2wuZ2V0TG9jYXRpb24oKSk7Ci0JCQlidW5kbGVQb29sLnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBidW5kbGVQb29sOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhlKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1bmRsZSBwb29sIHJlcG9zaXRvcnkgbm90IHdyaXRlYWJsZTogIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeShJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCVNldCBidW5kbGVSZXBvc2l0b3JpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlidW5kbGVSZXBvc2l0b3JpZXMuYWRkKFV0aWwuZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkocHJvZmlsZSkpOwotCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IGdldExpc3RQcm9maWxlUHJvcGVydHkocHJvZmlsZSwgQ0FDSEVfRVhURU5TSU9OUyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRlbnNpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlVUkwgZXh0ZW5zaW9uVVJMID0gbmV3IFVSTChleHRlbnNpb24pOwotCQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkoZXh0ZW5zaW9uVVJMLCBudWxsKTsKLQkJCQlpZiAocmVwb3NpdG9yeSAhPSBudWxsKQotCQkJCQlidW5kbGVSZXBvc2l0b3JpZXMuYWRkKHJlcG9zaXRvcnkpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NraXAgcmVwb3NpdG9yaWVzIHRoYXQgY291bGQgbm90IGJlIHJlYWQKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdW5leHBlY3RlZCwgVVJMcyBzaG91bGQgYmUgcHJlLWNoZWNrZWQKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgQWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkoYnVuZGxlUmVwb3NpdG9yaWVzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldExpc3RQcm9maWxlUHJvcGVydHkoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIGtleSkgewotCQlMaXN0IGxpc3RQcm9wZXJ0eSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGRyb3BpblJlcG9zaXRvcmllcyA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKGRyb3BpblJlcG9zaXRvcmllcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkcm9waW5SZXBvc2l0b3JpZXMsIFBJUEUpOwotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlsaXN0UHJvcGVydHkuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3RQcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUluZm8gY3JlYXRlQnVuZGxlSW5mbyhGaWxlIGJ1bmRsZUZpbGUsIFN0cmluZyBtYW5pZmVzdCkgewotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBuZXcgQnVuZGxlSW5mbygpOwotCQl0cnkgewotCQkJaWYgKGJ1bmRsZUZpbGUgIT0gbnVsbCkKLQkJCQlidW5kbGVJbmZvLnNldExvY2F0aW9uKGJ1bmRsZUZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlIHNpbmNlIHdlIGFyZSBjcmVhdGluZyB0aGUgVVJMIGZyb20gdGhlIGZpbGUKLQkJfQotCi0JCWJ1bmRsZUluZm8uc2V0TWFuaWZlc3QobWFuaWZlc3QpOwotCQl0cnkgewotCQkJSGVhZGVycyBoZWFkZXJzID0gSGVhZGVycy5wYXJzZU1hbmlmZXN0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYW5pZmVzdC5nZXRCeXRlcygpKSk7Ci0JCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50ID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKCJic24iLCAoU3RyaW5nKSBoZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlidW5kbGVJbmZvLnNldFN5bWJvbGljTmFtZShlbGVtZW50WzBdLmdldFZhbHVlKCkpOwotCi0JCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJYnVuZGxlSW5mby5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJLy8gdW5leHBlY3RlZAotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBidW5kbGVJbmZvOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5LCBJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGFnZ3JlZ2F0ZWRWaWV3ID0gZ2V0QWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkocHJvZmlsZSk7Ci0JCUZpbGUgYnVuZGxlSmFyID0gYWdncmVnYXRlZFZpZXcuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5KTsKLQkJcmV0dXJuIGJ1bmRsZUphcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCVN0cmluZyBjb25maWcgPSBwcm9maWxlLmdldFByb3BlcnR5KENPTkZJR19GT0xERVIpOwotCQlpZiAoY29uZmlnICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IEZpbGUoY29uZmlnKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGdldEluc3RhbGxGb2xkZXIocHJvZmlsZSksICJjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0SW5zdGFsbEZvbGRlcihJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiBuZXcgRmlsZShwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0TGF1bmNoZXJQYXRoKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGdldEluc3RhbGxGb2xkZXIocHJvZmlsZSksIGdldExhdW5jaGVyTmFtZShwcm9maWxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBhcHBsaWNhdGlvbiBsYXVuY2hlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGF1bmNoZXJOYW1lKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBwcm9maWxlLmdldFByb3BlcnR5KEVjbGlwc2VUb3VjaHBvaW50LlBST0ZJTEVfUFJPUF9MQVVOQ0hFUl9OQU1FKTsKLQotCQlTdHJpbmcgb3MgPSBnZXRPU0Zyb21Qcm9maWxlKHByb2ZpbGUpOwotCQlpZiAob3MgPT0gbnVsbCkgewotCQkJRW52aXJvbm1lbnRJbmZvIGluZm8gPSAoRW52aXJvbm1lbnRJbmZvKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRW52aXJvbm1lbnRJbmZvLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCW9zID0gaW5mby5nZXRPUygpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gImVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG9zLmVxdWFscyhvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX01BQ09TWCkpIHsKLQkJCXJldHVybiBuYW1lICsgIi5hcHAvQ29udGVudHMvTWFjT1MvIiArIG5hbWUudG9Mb3dlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRPU0Zyb21Qcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIGVudmlyb25tZW50cyA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQlpZiAoZW52aXJvbm1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbnZpcm9ubWVudHMsICIsIik7IHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKTspIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVudHJ5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaW50IGkgPSBlbnRyeS5pbmRleE9mKCc9Jyk7Ci0JCQlTdHJpbmcga2V5ID0gZW50cnkuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKTsKLQkJCWlmICgha2V5LmVxdWFscygib3NnaS5vcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlyZXR1cm4gZW50cnkuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFuaWZlc3QoVG91Y2hwb2ludERhdGFbXSBkYXRhKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG1hbmlmZXN0ID0gZGF0YVtpXS5nZXRJbnN0cnVjdGlvbnMoIm1hbmlmZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0Lmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWdlbnQgbG9jYXRpb24sIGlmIHBvc3NpYmxlIGFzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29uZmlndXJhdGlvbgotCSAqIGRpcmVjdG9yeSB1c2luZyB0aGUgQGNvbmZpZy5kaXIgc3Vic3RpdHV0aW9uIHZhcmlhYmxlLiBBZ2VudExvY2F0aW9uIHdpbGwKLQkgKiBzdWJzdGl0dXRlIHRoaXMgdmFyaWFibGUgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBmb2xkZXIgbG9jYXRpb24gb24gc3RhcnR1cC4KLQkgKiBJZiB0aGUgYWdlbnQgbG9jYXRpb24gaXMgbm90IGEgc3ViLWRpcmVjdG9yeSBvZiB0aGUgY29uZmlndXJhdGlvbiBmb2xkZXIsIHRoaXMKLQkgKiBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGFic29sdXRlIGFnZW50IGxvY2F0aW9uIGV4cHJlc3NlZCBhcyBhIFVSTC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUmVsYXRpdmVBZ2VudExvY2F0aW9uKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJVVJMIGFnZW50VVJMID0gVXRpbC5nZXRBZ2VudExvY2F0aW9uKCkuZ2V0VVJMKCk7Ci0JCS8vVE9ETyBoYW5kbGUgcHJvcGVyIHBhdGgvdXJsIGNvbnZlcnNpb24KLQkJSVBhdGggYWdlbnRQYXRoID0gbmV3IFBhdGgoYWdlbnRVUkwuZ2V0UGF0aCgpKTsKLQkJSVBhdGggY29uZmlnUGF0aCA9IG5ldyBQYXRoKFV0aWwuZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihwcm9maWxlKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChjb25maWdQYXRoLmlzUHJlZml4T2YoYWdlbnRQYXRoKSkKLQkJCXJldHVybiAiQGNvbmZpZy5kaXIvIiArIGFnZW50UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvbmZpZ1BhdGguc2VnbWVudENvdW50KCkpLm1ha2VSZWxhdGl2ZSgpLnNldERldmljZShudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYWdlbnRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5lcXVhbHMoY29uZmlnUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpKQotCQkJcmV0dXJuICJAY29uZmlnLmRpci8uLi8iICsgYWdlbnRQYXRoLmxhc3RTZWdtZW50KCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGFnZW50VVJMLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvcihtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9XaGF0SXNSdW5uaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9XaGF0SXNSdW5uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWFhOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvV2hhdElzUnVubmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotCi1wdWJsaWMgY2xhc3MgV2hhdElzUnVubmluZyB7Ci0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRCdW5kbGVzQmVpbmdSdW4oKSB7Ci0JCXJldHVybiBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBNYW5pcHVsYXRvciBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndBZG1pbiA9IExhenlNYW5pcHVsYXRvci5nZXRGcmFtZXdvcmtBZG1pbigpOwotCQlpZiAoZndBZG1pbiAhPSBudWxsKQotCQkJcmV0dXJuIGZ3QWRtaW4uZ2V0UnVubmluZ01hbmlwdWxhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk4NjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotcHVibGljIGNsYXNzIEFjdGlvbkNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0FSVElGQUNUID0gIkBhcnRpZmFjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0FSVElGQUNUX1JFUVVFU1RTID0gImFydGlmYWN0UmVxdWVzdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9CVU5ETEUgPSAiYnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fRkVBVFVSRV9JRCA9ICJmZWF0dXJlSWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9GRUFUVVJFX1ZFUlNJT04gPSAiZmVhdHVyZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9KVk1fQVJHID0gImp2bUFyZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX09QRVJBTkQgPSAib3BlcmFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BSRVZJT1VTX1NUQVJUX0xFVkVMID0gInByZXZpb3VzU3RhcnRMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BSRVZJT1VTX1NUQVJURUQgPSAicHJldmlvdXNTdGFydGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fUFJFVklPVVNfVkFMVUUgPSAicHJldmlvdXNWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BST0ZJTEUgPSAicHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BST0dSQU1fQVJHID0gInByb2dyYW1BcmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9QX05BTUUgPSAicHJvcE5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9QX1ZBTFVFID0gInByb3BWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1NUQVJUX0xFVkVMID0gInN0YXJ0TGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9TVEFSVEVEID0gInN0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9ERUZBVUxUX1ZBTFVFID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9MQVVOQ0hFUk5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9BY3Rpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNmZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFjdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGFjdGlvbnM7Ci0KLQlzdGF0aWMgewotCQlhY3Rpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJYWN0aW9ucy5wdXQoQ29sbGVjdEFjdGlvbi5JRCwgQ29sbGVjdEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KEluc3RhbGxCdW5kbGVBY3Rpb24uSUQsIEluc3RhbGxCdW5kbGVBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChVbmluc3RhbGxCdW5kbGVBY3Rpb24uSUQsIFVuaW5zdGFsbEJ1bmRsZUFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KEFkZFNvdXJjZUJ1bmRsZUFjdGlvbi5JRCwgQWRkU291cmNlQnVuZGxlQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoUmVtb3ZlU291cmNlQnVuZGxlQWN0aW9uLklELCBSZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChJbnN0YWxsRmVhdHVyZUFjdGlvbi5JRCwgSW5zdGFsbEZlYXR1cmVBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChVbmluc3RhbGxGZWF0dXJlQWN0aW9uLklELCBVbmluc3RhbGxGZWF0dXJlQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoU2V0TGF1bmNoZXJOYW1lQWN0aW9uLklELCBTZXRMYXVuY2hlck5hbWVBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChBZGRQcm9ncmFtQXJndW1lbnRBY3Rpb24uSUQsIEFkZFByb2dyYW1Bcmd1bWVudEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFJlbW92ZVByb2dyYW1Bcmd1bWVudEFjdGlvbi5JRCwgUmVtb3ZlUHJvZ3JhbUFyZ3VtZW50QWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoU2V0U3RhcnRMZXZlbEFjdGlvbi5JRCwgU2V0U3RhcnRMZXZlbEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KE1hcmtTdGFydGVkQWN0aW9uLklELCBNYXJrU3RhcnRlZEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFNldEZyYW1ld29ya0RlcGVuZGVudFByb3BlcnR5QWN0aW9uLklELCBTZXRGcmFtZXdvcmtEZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFNldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24uSUQsIFNldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChTZXRQcm9ncmFtUHJvcGVydHlBY3Rpb24uSUQsIFNldFByb2dyYW1Qcm9wZXJ0eUFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KEFkZEpWTUFyZ3VtZW50QWN0aW9uLklELCBBZGRKVk1Bcmd1bWVudEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFJlbW92ZUpWTUFyZ3VtZW50QWN0aW9uLklELCBSZW1vdmVKVk1Bcmd1bWVudEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KE1rZGlyQWN0aW9uLklELCBNa2RpckFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFJtZGlyQWN0aW9uLklELCBSbWRpckFjdGlvbi5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm92aXNpb25pbmdBY3Rpb24gY3JlYXRlKFN0cmluZyBhY3Rpb25JZCkgewotCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgYWN0aW9ucy5nZXQoYWN0aW9uSWQpOwotCQlpZiAoY2xhenogIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFByb3Zpc2lvbmluZ0FjdGlvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2coVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hY3Rpb25fbm90X2luc3RhbnRpYXRlZCwgYWN0aW9uSWQpLCBlKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYWN0aW9uX25vdF9pbnN0YW50aWF0ZWQsIGFjdGlvbklkKSwgZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkSlZNQXJndW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkSlZNQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZEpWTUFyZ3VtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRKVk1Bcmd1bWVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiYWRkSnZtQXJnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBqdm1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9KVk1fQVJHKTsKLQkJaWYgKGp2bUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmFkZEp2bUFyZyhqdm1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIGp2bUFyZyA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcpOwotCQlpZiAoanZtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fSlZNX0FSRywgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlSnZtQXJnKGp2bUFyZyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9BZGRQcm9ncmFtQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmOWJjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQcm9ncmFtQXJndW1lbnRBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImFkZFByb2dyYW1BcmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb2dyYW1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRyk7Ci0JCWlmIChwcm9ncmFtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcsIElEKSk7Ci0KLQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCi0JCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IGFydGlmYWN0c1swXTsKLQotCQkJRmlsZSBmaWxlTG9jYXRpb24gPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSwgcHJvZmlsZSk7Ci0JCQlpZiAoZmlsZUxvY2F0aW9uID09IG51bGwgfHwgIWZpbGVMb2NhdGlvbi5leGlzdHMoKSkKLQkJCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQkJCXByb2dyYW1BcmcgPSBmaWxlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQltYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5hZGRQcm9ncmFtQXJnKHByb2dyYW1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb2dyYW1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRyk7Ci0JCWlmIChwcm9ncmFtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcsIElEKSk7Ci0KLQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0KLQkJCUZpbGUgZmlsZUxvY2F0aW9uID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQkJaWYgKGZpbGVMb2NhdGlvbiA9PSBudWxsIHx8ICFmaWxlTG9jYXRpb24uZXhpc3RzKCkpCi0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5KSk7Ci0JCQlwcm9ncmFtQXJnID0gZmlsZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkU291cmNlQnVuZGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjkwYzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkU291cmNlQnVuZGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFkZFNvdXJjZUJ1bmRsZUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiYWRkU291cmNlQnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gQWRkU291cmNlQnVuZGxlQWN0aW9uLmFkZFNvdXJjZUJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBSZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24ucmVtb3ZlU291cmNlQnVuZGxlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBhZGRTb3VyY2VCdW5kbGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCVNvdXJjZU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKFNvdXJjZU1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX1NPVVJDRV9CVU5ETEVTKTsKLQkJU3RyaW5nIGJ1bmRsZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFKTsKLQkJaWYgKGJ1bmRsZUlkID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFLCBJRCkpOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnRpZmFjdHNbaV0udG9TdHJpbmcoKS5lcXVhbHMoYnVuZGxlSWQpKSB7Ci0JCQkJYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFydGlmYWN0S2V5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLm5vX21hdGNoaW5nX2FydGlmYWN0LCBidW5kbGVJZCkpOwotCi0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5hZGRCdW5kbGUoYnVuZGxlRmlsZSwgYXJ0aWZhY3RLZXkuZ2V0SWQoKSwgYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuY2Fubm90X2NvbmZpZ3VyZV9zb3VyY2VfYnVuZGxlLCBhcnRpZmFjdEtleSkpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0NvbGxlY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ29sbGVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhlNTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ29sbGVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJjb2xsZWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0ZPTERFUiA9ICJhcnRpZmFjdC5mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fT1BFUkFORCk7Ci0JCUlBcnRpZmFjdFJlcXVlc3RbXSByZXF1ZXN0cyA9IENvbGxlY3RBY3Rpb24uY29sbGVjdChvcGVyYW5kLnNlY29uZCgpLCBwcm9maWxlKTsKLQotCQlDb2xsZWN0aW9uIGFydGlmYWN0UmVxdWVzdHMgPSAoQ29sbGVjdGlvbikgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQVJUSUZBQ1RfUkVRVUVTVFMpOwotCQlhcnRpZmFjdFJlcXVlc3RzLmFkZChyZXF1ZXN0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gbm90aGluZyB0byBkbyBmb3Igbm93Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ppcHBlZChUb3VjaHBvaW50RGF0YVtdIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkYXRhW2ldLmdldEluc3RydWN0aW9ucygiemlwcGVkIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yUHJvcGVydGllcyhJSW5zdGFsbGFibGVVbml0IGluc3RhbGxhYmxlVW5pdCkgewotCQlQcm9wZXJ0aWVzIGRlc2NyaXB0b3JQcm9wZXJ0aWVzID0gbnVsbDsKLQkJaWYgKENvbGxlY3RBY3Rpb24uaXNaaXBwZWQoaW5zdGFsbGFibGVVbml0LmdldFRvdWNocG9pbnREYXRhKCkpKSB7Ci0JCQlkZXNjcmlwdG9yUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlkZXNjcmlwdG9yUHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb2xsZWN0QWN0aW9uLkFSVElGQUNUX0ZPTERFUiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yUHJvcGVydGllczsKLQl9Ci0KLQkvLyBUT0RPOiBIZXJlIHdlIG1heSB3YW50IHRvIGNvbnN1bHQgbXVsdGlwbGUgY2FjaGVzCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXF1ZXN0W10gY29sbGVjdChJSW5zdGFsbGFibGVVbml0IGluc3RhbGxhYmxlVW5pdCwgSVByb2ZpbGUgcHJvZmlsZSkgewotCQlJQXJ0aWZhY3RLZXlbXSB0b0Rvd25sb2FkID0gaW5zdGFsbGFibGVVbml0LmdldEFydGlmYWN0cygpOwotCQlpZiAodG9Eb3dubG9hZCA9PSBudWxsIHx8IHRvRG93bmxvYWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuTk9fQVJUSUZBQ1RfUkVRVUVTVDsKLQotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGFnZ3JlZ2F0ZWRSZXBvc2l0b3J5VmlldyA9IFV0aWwuZ2V0QWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkocHJvZmlsZSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgYnVuZGxlUG9vbCA9IFV0aWwuZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkocHJvZmlsZSk7Ci0JCUxpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Eb3dubG9hZC5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IGtleSA9IHRvRG93bmxvYWRbaV07Ci0JCQlpZiAoIWFnZ3JlZ2F0ZWRSZXBvc2l0b3J5Vmlldy5jb250YWlucyhrZXkpKSB7Ci0JCQkJUHJvcGVydGllcyByZXBvc2l0b3J5UHJvcGVydGllcyA9IENvbGxlY3RBY3Rpb24uY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yUHJvcGVydGllcyhpbnN0YWxsYWJsZVVuaXQpOwotCQkJCXJlcXVlc3RzLmFkZChVdGlsLmdldEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5jcmVhdGVNaXJyb3JSZXF1ZXN0KGtleSwgYnVuZGxlUG9vbCwgbnVsbCwgcmVwb3NpdG9yeVByb3BlcnRpZXMpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXF1ZXN0cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuTk9fQVJUSUZBQ1RfUkVRVUVTVDsKLQotCQlJQXJ0aWZhY3RSZXF1ZXN0W10gcmVzdWx0ID0gKElBcnRpZmFjdFJlcXVlc3RbXSkgcmVxdWVzdHMudG9BcnJheShuZXcgSUFydGlmYWN0UmVxdWVzdFtyZXF1ZXN0cy5zaXplKCldKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9JbnN0YWxsQnVuZGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxCdW5kbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmYzEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxCdW5kbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEluc3RhbGxCdW5kbGVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImluc3RhbGxCdW5kbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBJbnN0YWxsQnVuZGxlQWN0aW9uLmluc3RhbGxCdW5kbGUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gVW5pbnN0YWxsQnVuZGxlQWN0aW9uLnVuaW5zdGFsbEJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgaW5zdGFsbEJ1bmRsZShNYXAgcGFyYW1ldGVycykgewotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9CVU5ETEUpOwotCQlpZiAoYnVuZGxlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9CVU5ETEUsIElEKSk7Ci0KLQkJLy9UT0RPOiBldmVudHVhbGx5IHJlbW92ZSB0aGlzLiBXaGF0IGlzIGEgZnJhZ21lbnQgZG9pbmcgaGVyZT8/Ci0JCWlmIChpdS5pc0ZyYWdtZW50KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdCBpcyBhIGZyYWdtZW50IGRvaW5nIGhlcmUhISEgLS0gIiArIGl1KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJ0aWZhY3RzW2ldLnRvU3RyaW5nKCkuZXF1YWxzKGJ1bmRsZUlkKSkgewotCQkJCWFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhcnRpZmFjdEtleSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5ub19tYXRjaGluZ19hcnRpZmFjdCwgYnVuZGxlSWQpKTsKLQotCQlGaWxlIGJ1bmRsZUZpbGUgPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSwgcHJvZmlsZSk7Ci0JCWlmIChidW5kbGVGaWxlID09IG51bGwgfHwgIWJ1bmRsZUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQotCQkvL0J5IG5vdyB3ZSBhbHdheXMgaGF2ZSB0aGUgbWFuaWZlc3QgaW4gdGhlIHRvdWNocG9pbnQgZGF0YQotCQlTdHJpbmcgbWFuaWZlc3QgPSBVdGlsLmdldE1hbmlmZXN0KGl1LmdldFRvdWNocG9pbnREYXRhKCkpOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLm1pc3NpbmdfbWFuaWZlc3QsIGl1KSk7Ci0KLQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gVXRpbC5jcmVhdGVCdW5kbGVJbmZvKGJ1bmRsZUZpbGUsIG1hbmlmZXN0KTsKLQkJaWYgKGJ1bmRsZUluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmZhaWxlZF9idW5kbGVpbmZvLCBpdSkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGJ1bmRsZUluZm8pOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjc4ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9JbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEluc3RhbGxGZWF0dXJlQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpbnN0YWxsRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIEluc3RhbGxGZWF0dXJlQWN0aW9uLmluc3RhbGxGZWF0dXJlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24udW5pbnN0YWxsRmVhdHVyZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgaW5zdGFsbEZlYXR1cmUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlciBjb25maWd1cmF0aW9uID0gKFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fUExBVEZPUk1fQ09ORklHVVJBVElPTik7Ci0JCVN0cmluZyBmZWF0dXJlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRSk7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX0lEKTsKLQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRV9WRVJTSU9OKTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJ0aWZhY3RzW2ldLnRvU3RyaW5nKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQkJYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRV9JRCwgSUQpKTsKLQkJZWxzZSBpZiAoQWN0aW9uQ29uc3RhbnRzLlBBUk1fREVGQVVMVF9WQUxVRS5lcXVhbHMoZmVhdHVyZUlkKSkgewotCQkJZmVhdHVyZUlkID0gYXJ0aWZhY3RLZXkuZ2V0SWQoKTsKLQkJfQotCi0JCWlmIChmZWF0dXJlVmVyc2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkVfVkVSU0lPTiwgSUQpKTsKLQkJZWxzZSBpZiAoQWN0aW9uQ29uc3RhbnRzLlBBUk1fREVGQVVMVF9WQUxVRS5lcXVhbHMoZmVhdHVyZVZlcnNpb24pKSB7Ci0JCQlmZWF0dXJlVmVyc2lvbiA9IGFydGlmYWN0S2V5LmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQl9Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCUZpbGUgZmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5KSk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb24uYWRkRmVhdHVyZUVudHJ5KGZpbGUsIGZlYXR1cmVJZCwgZmVhdHVyZVZlcnNpb24sIGFydGlmYWN0S2V5LmdldElkKCksIGFydGlmYWN0S2V5LmdldFZlcnNpb24oKS50b1N0cmluZygpLCAvKnByaW1hcnkqL2ZhbHNlLCAvKmFwcGxpY2F0aW9uKi9udWxsLCAvKnJvb3QqL251bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01hcmtTdGFydGVkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01hcmtTdGFydGVkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDYwOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9NYXJrU3RhcnRlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWFya1N0YXJ0ZWRBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm1hcmtTdGFydGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlTdHJpbmcgc3RhcnRlZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1NUQVJURUQpOwotCQlpZiAoc3RhcnRlZCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1NUQVJURUQsIElEKSk7Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChidW5kbGVzW2ldLmVxdWFscyhidW5kbGVJbmZvKSkgewotCQkJCWdldE1lbWVudG8oKS5wdXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfU1RBUlRFRCwgbmV3IEJvb2xlYW4oYnVuZGxlc1tpXS5pc01hcmtlZEFzU3RhcnRlZCgpKSk7Ci0JCQkJYnVuZGxlc1tpXS5zZXRNYXJrZWRBc1N0YXJ0ZWQoQm9vbGVhbi52YWx1ZU9mKHN0YXJ0ZWQpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChidW5kbGVzW2ldLmVxdWFscyhidW5kbGVJbmZvKSkgewotCQkJCUJvb2xlYW4gcHJldmlvdXNTdGFydGVkID0gKEJvb2xlYW4pIGdldE1lbWVudG8oKS5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfU1RBUlRFRCk7Ci0JCQkJaWYgKHByZXZpb3VzU3RhcnRlZCAhPSBudWxsKQotCQkJCQlidW5kbGVzW2ldLnNldE1hcmtlZEFzU3RhcnRlZChwcmV2aW91c1N0YXJ0ZWQuYm9vbGVhblZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWIxZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbl9ub3RfaW5zdGFudGlhdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcmFtZXRlcl9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl1X2NvbnRhaW5zX25vX2FyaWZhY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vX21hdGNoaW5nX2FydGlmYWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdfbWFuaWZlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkX2J1bmRsZWluZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90X2NvbmZpZ3VyZV9zb3VyY2VfYnVuZGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3BhcnNpbmdfc3RhcnRsZXZlbDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Na2RpckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Na2RpckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYyZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWtkaXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWtkaXJBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm1rZGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BBVEgsIElEKSk7Ci0JCW5ldyBGaWxlKHBhdGgpLm1rZGlyKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRILCBJRCkpOwotCQluZXcgRmlsZShwYXRoKS5kZWxldGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvUmVtb3ZlSlZNQXJndW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvUmVtb3ZlSlZNQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyODE1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZUpWTUFyZ3VtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVKVk1Bcmd1bWVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAicmVtb3ZlSnZtQXJnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBqdm1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9KVk1fQVJHKTsKLQkJaWYgKGp2bUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLnJlbW92ZUp2bUFyZyhqdm1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIGp2bUFyZyA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcpOwotCQlpZiAoanZtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fSlZNX0FSRywgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuYWRkSnZtQXJnKGp2bUFyZyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MzkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInJlbW92ZVByb2dyYW1BcmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb2dyYW1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRyk7Ci0JCWlmIChwcm9ncmFtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcsIElEKSk7Ci0KLQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0KLQkJCUZpbGUgZmlsZUxvY2F0aW9uID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQkJaWYgKGZpbGVMb2NhdGlvbiA9PSBudWxsIHx8ICFmaWxlTG9jYXRpb24uZXhpc3RzKCkpCi0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5KSk7Ci0JCQlwcm9ncmFtQXJnID0gZmlsZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9ncmFtQXJnID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcpOwotCQlpZiAocHJvZ3JhbUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0dSQU1fQVJHLCBJRCkpOwotCi0JCWlmIChwcm9ncmFtQXJnLmVxdWFscyhBY3Rpb25Db25zdGFudHMuUEFSTV9BUlRJRkFDVCkpIHsKLQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzWzBdOwotCi0JCQlGaWxlIGZpbGVMb2NhdGlvbiA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCB8fCAhZmlsZUxvY2F0aW9uLmV4aXN0cygpKQotCQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCQkJcHJvZ3JhbUFyZyA9IGZpbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmFkZFByb2dyYW1BcmcocHJvZ3JhbUFyZyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMGI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInJlbW92ZVNvdXJjZUJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFJlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5yZW1vdmVTb3VyY2VCdW5kbGUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gQWRkU291cmNlQnVuZGxlQWN0aW9uLmFkZFNvdXJjZUJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgcmVtb3ZlU291cmNlQnVuZGxlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlTb3VyY2VNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChTb3VyY2VNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9TT1VSQ0VfQlVORExFUyk7Ci0JCVN0cmluZyBidW5kbGVJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSk7Ci0JCWlmIChidW5kbGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSwgSUQpKTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJ0aWZhY3RzW2ldLnRvU3RyaW5nKCkuZXF1YWxzKGJ1bmRsZUlkKSkgewotCQkJCWFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhcnRpZmFjdEtleSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5ub19tYXRjaGluZ19hcnRpZmFjdCwgYnVuZGxlSWQpKTsKLQotCQlGaWxlIGJ1bmRsZUZpbGUgPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSwgcHJvZmlsZSk7Ci0JCWlmIChidW5kbGVGaWxlID09IG51bGwgfHwgIWJ1bmRsZUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IucmVtb3ZlQnVuZGxlKGJ1bmRsZUZpbGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5jYW5ub3RfY29uZmlndXJlX3NvdXJjZV9idW5kbGUsIGFydGlmYWN0S2V5KSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvUm1kaXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvUm1kaXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkYzM3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JtZGlyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFJtZGlyQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJybWRpciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRILCBJRCkpOwotCQluZXcgRmlsZShwYXRoKS5kZWxldGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BBVEgsIElEKSk7Ci0JCW5ldyBGaWxlKHBhdGgpLm1rZGlyKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldEZyYW1ld29ya0RlcGVuZGVudFByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldEZyYW1ld29ya0RlcGVuZGVudFByb3BlcnR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDk4MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRGcmFtZXdvcmtEZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgU2V0RnJhbWV3b3JrRGVwZW5kZW50UHJvcGVydHlBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNldEZ3RGVwZW5kZW50UHJvcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUpOwotCQlpZiAocHJvcE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUsIElEKSk7Ci0JCVN0cmluZyBwcm9wVmFsdWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX1ZBTFVFKTsKLQkJaWYgKHByb3BWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfVkFMVUUsIElEKSk7Ci0JCWdldE1lbWVudG8oKS5wdXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfVkFMVUUsIG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRGd0RlcGVuZGVudFByb3AocHJvcE5hbWUpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSk7Ci0JCWlmIChwcm9wTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSwgSUQpKTsKLQkJU3RyaW5nIHByZXZpb3VzVmFsdWUgPSAoU3RyaW5nKSBnZXRNZW1lbnRvKCkuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFKTsKLQkJaWYgKHByZXZpb3VzVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSwgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJldmlvdXNWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0RnJhbWV3b3JrSW5kZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNmZjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0RnJhbWV3b3JrSW5kZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgU2V0RnJhbWV3b3JrSW5kZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAic2V0RndJbmRlcGVuZGVudFByb3AiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb3BOYW1lID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FKTsKLQkJaWYgKHByb3BOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FLCBJRCkpOwotCQlTdHJpbmcgcHJvcFZhbHVlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9WQUxVRSk7Ci0JCWlmIChwcm9wVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX1ZBTFVFLCBJRCkpOwotCQlnZXRNZW1lbnRvKCkucHV0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndEZXBlbmRlbnRQcm9wKHByb3BOYW1lKSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0luZGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSk7Ci0JCWlmIChwcm9wTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSwgSUQpKTsKLQkJU3RyaW5nIHByZXZpb3VzVmFsdWUgPSAoU3RyaW5nKSBnZXRNZW1lbnRvKCkuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFKTsKLQkJaWYgKHByZXZpb3VzVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSwgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3SW5kZXBlbmRlbnRQcm9wKHByb3BOYW1lLCBwcmV2aW91c1ZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0TGF1bmNoZXJOYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldExhdW5jaGVyTmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU4NjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0TGF1bmNoZXJOYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXRMYXVuY2hlck5hbWVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNldExhdW5jaGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVN0YXR1cyBjaGFuZ2VOYW1lKFN0cmluZyBuZXdOYW1lLCBNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vZm9yY2UgdGhlIGxvYWQgdG8gbWFrZSBzdXJlIHdlIHJlYWQgdGhlIHZhbHVlcyBpbiB0aGUgb2xkIGZpbGVuYW1lCi0JCUlTdGF0dXMgc3RhdHVzID0gRWNsaXBzZVRvdWNocG9pbnQubG9hZE1hbmlwdWxhdG9yKG1hbmlwdWxhdG9yKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJZ2V0TWVtZW50bygpLnB1dChFY2xpcHNlVG91Y2hwb2ludC5QUk9GSUxFX1BST1BfTEFVTkNIRVJfTkFNRSwgcHJvZmlsZS5nZXRQcm9wZXJ0eShFY2xpcHNlVG91Y2hwb2ludC5QUk9GSUxFX1BST1BfTEFVTkNIRVJfTkFNRSkpOwotCQlwcm9maWxlLnNldFByb3BlcnR5KEVjbGlwc2VUb3VjaHBvaW50LlBST0ZJTEVfUFJPUF9MQVVOQ0hFUl9OQU1FLCBuZXdOYW1lKTsKLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuc2V0TGF1bmNoZXIoVXRpbC5nZXRMYXVuY2hlclBhdGgocHJvZmlsZSkpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlyZXR1cm4gY2hhbmdlTmFtZSgoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9MQVVOQ0hFUk5BTUUpLCBtYW5pcHVsYXRvciwgcHJvZmlsZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJcmV0dXJuIGNoYW5nZU5hbWUoKFN0cmluZykgZ2V0TWVtZW50bygpLmdldChFY2xpcHNlVG91Y2hwb2ludC5QUk9GSUxFX1BST1BfTEFVTkNIRVJfTkFNRSksIG1hbmlwdWxhdG9yLCBwcm9maWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRQcm9ncmFtUHJvcGVydHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0UHJvZ3JhbVByb3BlcnR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjUyOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRQcm9ncmFtUHJvcGVydHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNldFByb2dyYW1Qcm9wZXJ0eUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAic2V0UHJvZ3JhbVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSk7Ci0JCWlmIChwcm9wTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSwgSUQpKTsKLQkJU3RyaW5nIHByb3BWYWx1ZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfVkFMVUUpOwotCQlpZiAocHJvcFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9WQUxVRSwgSUQpKTsKLQkJZ2V0TWVtZW50bygpLnB1dChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSwgbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuc2V0RndEZXBlbmRlbnRQcm9wKHByb3BOYW1lLCBwcm9wVmFsdWUpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb3BOYW1lID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FKTsKLQkJaWYgKHByb3BOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FLCBJRCkpOwotCQlTdHJpbmcgcHJldmlvdXNWYWx1ZSA9IChTdHJpbmcpIGdldE1lbWVudG8oKS5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfVkFMVUUpOwotCQlpZiAocHJldmlvdXNWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFLCBJRCkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuc2V0RndEZXBlbmRlbnRQcm9wKHByb3BOYW1lLCBwcmV2aW91c1ZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0U3RhcnRMZXZlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRTdGFydExldmVsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZWQxMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRTdGFydExldmVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgU2V0U3RhcnRMZXZlbEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAic2V0U3RhcnRMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJU3RyaW5nIHN0YXJ0TGV2ZWwgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9TVEFSVF9MRVZFTCk7Ci0JCWlmIChzdGFydExldmVsID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fU1RBUlRfTEVWRUwsIElEKSk7Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChidW5kbGVzW2ldLmVxdWFscyhidW5kbGVJbmZvKSkgewotCQkJCWdldE1lbWVudG8oKS5wdXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfU1RBUlRfTEVWRUwsIG5ldyBJbnRlZ2VyKGJ1bmRsZXNbaV0uZ2V0U3RhcnRMZXZlbCgpKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnVuZGxlc1tpXS5zZXRTdGFydExldmVsKEludGVnZXIucGFyc2VJbnQoc3RhcnRMZXZlbCkpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yX3BhcnNpbmdfc3RhcnRsZXZlbCwgc3RhcnRMZXZlbCwgYnVuZGxlc1tpXS5nZXRTeW1ib2xpY05hbWUoKSksIGUpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbMF07Ci0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChidW5kbGVzW2ldLmVxdWFscyhidW5kbGVJbmZvKSkgewotCQkJCUludGVnZXIgcHJldmlvdXNTdGFydExldmVsID0gKEludGVnZXIpIGdldE1lbWVudG8oKS5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfU1RBUlRfTEVWRUwpOwotCQkJCWlmIChwcmV2aW91c1N0YXJ0TGV2ZWwgIT0gbnVsbCkKLQkJCQkJYnVuZGxlc1tpXS5zZXRTdGFydExldmVsKHByZXZpb3VzU3RhcnRMZXZlbC5pbnRWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Vbmluc3RhbGxCdW5kbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsQnVuZGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjFlYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Vbmluc3RhbGxCdW5kbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFVuaW5zdGFsbEJ1bmRsZUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAidW5pbnN0YWxsQnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gVW5pbnN0YWxsQnVuZGxlQWN0aW9uLnVuaW5zdGFsbEJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBJbnN0YWxsQnVuZGxlQWN0aW9uLmluc3RhbGxCdW5kbGUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHVuaW5zdGFsbEJ1bmRsZShNYXAgcGFyYW1ldGVycykgewotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9CVU5ETEUpOwotCQlpZiAoYnVuZGxlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9CVU5ETEUsIElEKSk7Ci0KLQkJLy9UT0RPOiBldmVudHVhbGx5IHJlbW92ZSB0aGlzLiBXaGF0IGlzIGEgZnJhZ21lbnQgZG9pbmcgaGVyZT8/Ci0JCWlmIChpdS5pc0ZyYWdtZW50KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdCBpcyBhIGZyYWdtZW50IGRvaW5nIGhlcmUhISEgLS0gIiArIGl1KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJ0aWZhY3RzW2ldLnRvU3RyaW5nKCkuZXF1YWxzKGJ1bmRsZUlkKSkgewotCQkJCWFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhcnRpZmFjdEtleSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5ub19tYXRjaGluZ19hcnRpZmFjdCwgYnVuZGxlSWQpKTsKLQotCQkvLyB0aGUgYnVuZGxlRmlsZSBtaWdodCBiZSBudWxsIGhlcmUsIHRoYXQncyBPSy4KLQkJRmlsZSBidW5kbGVGaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYnVuZGxlSW5mbyk7Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Vbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZWEzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9Vbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ1bmluc3RhbGxGZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi51bmluc3RhbGxGZWF0dXJlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIEluc3RhbGxGZWF0dXJlQWN0aW9uLmluc3RhbGxGZWF0dXJlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB1bmluc3RhbGxGZWF0dXJlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCVBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIgY29uZmlndXJhdGlvbiA9IChQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX1BMQVRGT1JNX0NPTkZJR1VSQVRJT04pOwotCQlTdHJpbmcgZmVhdHVyZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkUpOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRV9JRCk7Ci0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkVfVkVSU0lPTik7Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFydGlmYWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFydGlmYWN0c1tpXS50b1N0cmluZygpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJCWFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkVfSUQsIElEKSk7Ci0JCWVsc2UgaWYgKEFjdGlvbkNvbnN0YW50cy5QQVJNX0RFRkFVTFRfVkFMVUUuZXF1YWxzKGZlYXR1cmVJZCkpIHsKLQkJCWZlYXR1cmVJZCA9IGFydGlmYWN0S2V5LmdldElkKCk7Ci0JCX0KLQotCQlpZiAoZmVhdHVyZVZlcnNpb24gPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX1ZFUlNJT04sIElEKSk7Ci0JCWVsc2UgaWYgKEFjdGlvbkNvbnN0YW50cy5QQVJNX0RFRkFVTFRfVkFMVUUuZXF1YWxzKGZlYXR1cmVWZXJzaW9uKSkgewotCQkJZmVhdHVyZVZlcnNpb24gPSBhcnRpZmFjdEtleS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBjb25maWd1cmF0aW9uLnJlbW92ZUZlYXR1cmVFbnRyeShmZWF0dXJlSWQsIGZlYXR1cmVWZXJzaW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODU1MWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQ9VGhlIGFydGlmYWN0IGZpbGUgZm9yIHswfSB3YXMgbm90IGZvdW5kLgotYWN0aW9uX25vdF9pbnN0YW50aWF0ZWQ9QWN0aW9uIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZm9yIGFjdGlvbiBpZDogezB9LgotcGFyYW1ldGVyX25vdF9zZXQ9VGhlIFwiezB9XCIgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGluIHRoZSBcInsxfVwiIGFjdGlvbi4KLWl1X2NvbnRhaW5zX25vX2FyaWZhY3RzPUluc3RhbGxhYmxlIHVuaXQgY29udGFpbnMgbm8gYXJ0aWZhY3RzOiB7MH0uCi1ub19tYXRjaGluZ19hcnRpZmFjdD1ObyBtYXRjaGluZyBhcnRpZmFjdCBmb3VuZCBmb3I6IHswfS4KLW1pc3NpbmdfbWFuaWZlc3Q9VGhlIG1hbmlmZXN0IGlzIG1pc3NpbmcgZm9yOiB7MH0uCi1mYWlsZWRfYnVuZGxlaW5mbz1GYWlsZWQgdG8gY3JlYXRlIGJ1bmRsZUluZm8gZm9yOiB7MH0uCi1jYW5ub3RfY29uZmlndXJlX3NvdXJjZV9idW5kbGU9Q2Fubm90IGNvbmZpZ3VyZSB7MH0gYXMgYSBzb3VyY2UgYnVuZGxlLgotZXJyb3JfcGFyc2luZ19zdGFydGxldmVsPUVycm9yIHBhcnNpbmcgc3RhcnQgbGV2ZWw6IHswfSBmb3IgYnVuZGxlOiB7MX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWI2MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcj1FcnJvciB3aGlsZSBsb2FkaW5nIG1hbmlwdWxhdG9yLgotZmFpbGVkX3ByZXBhcmVJVT1GYWlsZWQgdG8gcHJlcGFyZSBwYXJ0aWFsIElVOiB7MH0uCi1lcnJvcl9zYXZpbmdfbWFuaXB1bGF0b3I9RXJyb3Igc2F2aW5nIG1hbmlwdWxhdG9yLgotZXJyb3Jfc2F2aW5nX3BsYXRmb3JtX2NvbmZpZ3VyYXRpb249RXJyb3Igc2F2aW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uCi1lcnJvcl9zYXZpbmdfc291cmNlX2J1bmRsZXNfbGlzdD1FcnJvciBzYXZpbmcgc291cmNlIGJ1bmRsZXMgbGlzdC4KLWVycm9yX2NvbnN0cnVjdGluZ19wbGF0Zm9ybV9jb25maWd1cmF0aW9uX3VybD1FcnJvciBjb25zdHJ1Y3RpbmcgcGxhdGZvcm0gY29uZmlndXJhdGlvbiB1cmwuCi1nZW5lcmF0b3Jfbm90X2F2YWlsYWJsZT1UaGUgcGFydGlhbCBJVSBjb3VsZCBub3QgYmUgdXBkYXRlZC4gR2VuZXJhdG9yIG5vdCBhdmFpbGFibGU6IHswfS4KLWFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kPVRoZSBhcnRpZmFjdCBmaWxlIGZvciB7MH0gd2FzIG5vdCBmb3VuZC4KLUJ1bmRsZVBvb2w9QnVuZGxlIHBvb2wKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjM2RmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb24gewotCi0JcHJpdmF0ZSBMaXN0IHNpdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZyBkYXRlOwotCWJvb2xlYW4gdHJhbnNpZW50UHJvcGVydHk7Ci0JU3RyaW5nIHZlcnNpb247Ci0JU3RyaW5nIHNoYXJlZF91cjsKLQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBsb2FkKEZpbGUgbG9jYXRpb24sIFVSTCBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gQ29uZmlndXJhdGlvblBhcnNlci5wYXJzZShsb2NhdGlvbiwgb3NnaUluc3RhbGxBcmVhKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgbG9jYXRpb24sIFVSTCBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlDb25maWd1cmF0aW9uV3JpdGVyLnNhdmUodGhpcywgbG9jYXRpb24sIG9zZ2lJbnN0YWxsQXJlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaGFyZWRVUigpIHsKLQkJcmV0dXJuIHNoYXJlZF91cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRVUihTdHJpbmcgdmFsdWUpIHsKLQkJc2hhcmVkX3VyID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U2l0ZXMoKSB7Ci0JCXJldHVybiBzaXRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU2l0ZSBzaXRlKSB7Ci0JCXNpdGVzLmFkZChzaXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIGRhdGUpIHsKLQkJdGhpcy5kYXRlID0gZGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSkgewotCQl2ZXJzaW9uID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiB2YWx1ZSkgewotCQl0cmFuc2llbnRQcm9wZXJ0eSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gdHJhbnNpZW50UHJvcGVydHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMwOTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTkZJRyA9ICJjb25maWciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEVMRU1FTlRfRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBFTEVNRU5UX1NJVEUgPSAic2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfREFURSA9ICJkYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9MSU5LRklMRSA9ICJsaW5rZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0xJU1QgPSAibGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BPTElDWSA9ICJwb2xpY3kiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9TSEFSRURfVVIgPSAic2hhcmVkX3VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFJBTlNJRU5UID0gInRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1VQREFURUFCTEUgPSAidXBkYXRlYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwODU2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFBhcnNlciBmb3IgcGxhdGZvcm0ueG1sIGZpbGVzLiAKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBhcnNlciBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCXByaXZhdGUgVVJMIG9zZ2lJbnN0YWxsQXJlYTsKLQotCS8qCi0JICogUGFyc2UgdGhlIGdpdmVuIGZpbGUgaGFuZGxlIHdoaWNoIHBvaW50cyB0byBhIHBsYXRmb3JtLnhtbCBmaWxlIGFuZCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBwYXJzZShGaWxlIGZpbGUsIFVSTCBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25QYXJzZXIob3NnaUluc3RhbGxBcmVhKS5pbnRlcm5hbFBhcnNlKGZpbGUpOwotCX0KLQotCXByaXZhdGUgQ29uZmlndXJhdGlvblBhcnNlcihVUkwgb3NnaUluc3RhbGxBcmVhKSB7Ci0JCXRoaXMub3NnaUluc3RhbGxBcmVhID0gb3NnaUluc3RhbGxBcmVhOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIGEgZmVhdHVyZSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIERPTSBub2RlLiAKLQkgKiBSZXR1cm4gdGhlIG5ldyBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVGZWF0dXJlKE5vZGUgbm9kZSwgU2l0ZSBzaXRlKSB7Ci0JCUZlYXR1cmUgcmVzdWx0ID0gbmV3IEZlYXR1cmUoc2l0ZSk7Ci0JCVN0cmluZyBpZCA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRSSUJVVEVfSUQpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRJZChpZCk7Ci0JCVN0cmluZyB1cmwgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1VSTCk7Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRVcmwodXJsKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1ZFUlNJT04pOwotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJcmVzdWx0LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgdGhlIGZlYXR1cmVzIGZyb20gdGhlIGdpdmVuIERPTSBub2RlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVGZWF0dXJlcyhOb2RlIG5vZGUsIFNpdGUgc2l0ZSkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICghRUxFTUVOVF9GRUFUVVJFLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJY29udGludWU7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBjcmVhdGVGZWF0dXJlKGNoaWxkLCBzaXRlKTsKLQkJCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkJc2l0ZS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgYSBzaXRlIGJhc2VkIG9uIHRoZSBnaXZlbiBET00gbm9kZS4KLQkgKi8KLQlwcml2YXRlIFNpdGUgY3JlYXRlU2l0ZShOb2RlIG5vZGUpIHsKLQkJU2l0ZSByZXN1bHQgPSBuZXcgU2l0ZSgpOwotCQlTdHJpbmcgcG9saWN5ID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9QT0xJQ1kpOwotCQlpZiAocG9saWN5ICE9IG51bGwpCi0JCQlyZXN1bHQuc2V0UG9saWN5KHBvbGljeSk7Ci0JCVN0cmluZyBlbmFibGVkID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9FTkFCTEVEKTsKLQkJaWYgKGVuYWJsZWQgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRFbmFibGVkKEJvb2xlYW4udmFsdWVPZihlbmFibGVkKS5ib29sZWFuVmFsdWUoKSk7Ci0JCVN0cmluZyB1cGRhdGVhYmxlID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9VUERBVEVBQkxFKTsKLQkJaWYgKHVwZGF0ZWFibGUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRVcGRhdGVhYmxlKEJvb2xlYW4udmFsdWVPZih1cGRhdGVhYmxlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCVN0cmluZyB1cmwgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1VSTCk7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJaWYgKG9zZ2lJbnN0YWxsQXJlYSA9PSBudWxsKQotCQkJCXJlc3VsdC5zZXRVcmwodXJsKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQuc2V0VXJsKFV0aWxzLm1ha2VBYnNvbHV0ZSh1cmwsIG9zZ2lJbnN0YWxsQXJlYSkpOwotCQl9Ci0JCVN0cmluZyBsaW5rRmlsZSA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRSSUJVVEVfTElOS0ZJTEUpOwotCQlpZiAobGlua0ZpbGUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRMaW5rRmlsZShsaW5rRmlsZSk7Ci0JCVN0cmluZyBsaXN0ID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9MSVNUKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGlzdCwgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYWRkUGx1Z2luKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCWNyZWF0ZUZlYXR1cmVzKG5vZGUsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIGl0IGRvZXMKLQkgKiBub3QgZXhpc3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSB0ZW1wID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCXJldHVybiB0ZW1wID09IG51bGwgPyBudWxsIDogdGVtcC5nZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIExvYWQgdGhlIGdpdmVuIGZpbGUgaW50byBhIERPTSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50IGxvYWQoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJLy8gbG9hZCB0aGUgZmVhdHVyZSB4bWwKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCWlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXQpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1aWxkZXIucGFyc2UoaW5wdXQpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUGFyc2UgdGhlIGdpdmVuIGZpbGUgaGFuZGxlIHdoaWNoIHBvaW50cyB0byBhIHBsYXRmb3JtLnhtbCBmaWxlIGFuZCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgotCSAqLwotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBpbnRlcm5hbFBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gbG9hZChpbnB1dCk7Ci0JCQlyZXR1cm4gcHJvY2Vzcyhkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZmlsZTogIiArIGZpbGUsIGUpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24iLCBlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogUHJvY2VzcyB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlCi0JICogc2l0ZSBvYmplY3RzLgotCSAqLwotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBwcm9jZXNzKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCU5vZGUgbm9kZSA9IGdldENvbmZpZ0VsZW1lbnQoZG9jdW1lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFFTEVNRU5UX1NJVEUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROb2RlTmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCVNpdGUgc2l0ZSA9IGNyZWF0ZVNpdGUoY2hpbGQpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkKLQkJCQljb25maWd1cmF0aW9uLmFkZChzaXRlKTsKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihOb2RlIG5vZGUpIHsKLQkJQ29uZmlndXJhdGlvbiByZXN1bHQgPSBuZXcgQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmcgdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX0RBVEUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXREYXRlKHZhbHVlKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1RSQU5TSUVOVCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldFRyYW5zaWVudChCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1NIQVJFRF9VUik7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldFNoYXJlZFVSKHZhbHVlKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1ZFUlNJT04pOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRWZXJzaW9uKHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0Q29uZmlnRWxlbWVudChEb2N1bWVudCBkb2MpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2MuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChFTEVNRU5UX0NPTkZJRy5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5vZGVOYW1lKCkpKQotCQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODZlNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Xcml0ZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQotCS8qCi0JICogU2F2ZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgRmlsZSBsb2NhdGlvbiwgVVJMIG9zZ2lJbnN0YWxsQXJlYSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVhNTFdyaXRlciB3cml0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhdGlvbikpOwotCQkJd3JpdGVyID0gbmV3IFhNTFdyaXRlcihvdXRwdXQpOwotCQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQlTdHJpbmcgdmFsdWUgPSBjb25maWd1cmF0aW9uLmdldERhdGUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9EQVRFLCB2YWx1ZSk7Ci0KLQkJCXZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRTaGFyZWRVUigpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1NIQVJFRF9VUiwgdmFsdWUpOwotCi0JCQl2YWx1ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbigpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1ZFUlNJT04sIHZhbHVlKTsKLQotCQkJYXJncy5wdXQoQVRUUklCVVRFX1RSQU5TSUVOVCwgQm9vbGVhbi50b1N0cmluZyhjb25maWd1cmF0aW9uLmlzVHJhbnNpZW50KCkpKTsKLQotCQkJd3JpdGVyLnN0YXJ0VGFnKEVMRU1FTlRfQ09ORklHLCBhcmdzKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlndXJhdGlvbi5nZXRTaXRlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVNpdGUgc2l0ZSA9IChTaXRlKSBpdGVyLm5leHQoKTsKLQkJCQl3cml0ZSh3cml0ZXIsIHNpdGUsIG9zZ2lJbnN0YWxsQXJlYSk7Ci0JCQl9Ci0KLQkJCXdyaXRlci5lbmRUYWcoRUxFTUVOVF9DT05GSUcpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGVuIHNhdmluZyBjb25maWd1cmF0aW9uIHRvOiAiICsgbG9jYXRpb24sIGUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoZW4gc2F2aW5nIGNvbmZpZ3VyYXRpb24gdG86ICIgKyBsb2NhdGlvbiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLQkJCQl3cml0ZXIuZmx1c2goKTsKLQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBnaXZlbiBzaXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGUoWE1MV3JpdGVyIHdyaXRlciwgU2l0ZSBzaXRlLCBVUkwgb3NnaUluc3RhbGxBcmVhKSB7Ci0JCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlTdHJpbmcgdmFsdWUgPSBzaXRlLmdldExpbmtGaWxlKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXJncy5wdXQoQVRUUklCVVRFX0xJTktGSUxFLCB2YWx1ZSk7Ci0KLQkJdmFsdWUgPSBzaXRlLmdldFBvbGljeSgpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWFyZ3MucHV0KEFUVFJJQlVURV9QT0xJQ1ksIHZhbHVlKTsKLQotCQl2YWx1ZSA9IHNpdGUuZ2V0VXJsKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3NnaUluc3RhbGxBcmVhID09IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1VSTCwgdmFsdWUpOwotCQkJZWxzZQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9VUkwsIFV0aWxzLm1ha2VSZWxhdGl2ZSh2YWx1ZSwgb3NnaUluc3RhbGxBcmVhKSk7Ci0JCX0KLQotCQl2YWx1ZSA9IHRvU3RyaW5nKHNpdGUuZ2V0TGlzdCgpKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlhcmdzLnB1dChBVFRSSUJVVEVfTElTVCwgdmFsdWUpOwotCi0JCWFyZ3MucHV0KEFUVFJJQlVURV9VUERBVEVBQkxFLCBCb29sZWFuLnRvU3RyaW5nKHNpdGUuaXNVcGRhdGVhYmxlKCkpKTsKLQkJYXJncy5wdXQoQVRUUklCVVRFX0VOQUJMRUQsIEJvb2xlYW4udG9TdHJpbmcoc2l0ZS5pc0VuYWJsZWQoKSkpOwotCi0JCXdyaXRlci5zdGFydFRhZyhFTEVNRU5UX1NJVEUsIGFyZ3MpOwotCQl3cml0ZSh3cml0ZXIsIHNpdGUuZ2V0RmVhdHVyZXMoKSk7Ci0JCXdyaXRlci5lbmRUYWcoRUxFTUVOVF9TSVRFKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIGdpdmVuIGxpc3QgdG8gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmdbXSBsaXN0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQobGlzdFtpXSk7Ci0JCQlpZiAoaSArIDEgPCBsaXN0Lmxlbmd0aCkKLQkJCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBnaXZlbiBsaXN0IG9mIGZlYXR1cmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGUoWE1MV3JpdGVyIHdyaXRlciwgRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGZlYXR1cmUuZ2V0SWQoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9JRCwgdmFsdWUpOwotCQkJdmFsdWUgPSBmZWF0dXJlLmdldFVybCgpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1VSTCwgdmFsdWUpOwotCQkJdmFsdWUgPSBmZWF0dXJlLmdldFZlcnNpb24oKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9WRVJTSU9OLCB2YWx1ZSk7Ci0JCQl3cml0ZXIuc3RhcnRUYWcoRUxFTUVOVF9GRUFUVVJFLCBhcmdzKTsKLQkJCXdyaXRlci5lbmRUYWcoRUxFTUVOVF9GRUFUVVJFKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0ZlYXR1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjYTJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi0vKgotICogUmVwcmVzZW50cyBhIGZlYXR1cmUgZW50cnkgaW4gYSBwbGF0Zm9ybS54bWwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmUgewotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTaXRlIHNpdGU7Ci0KLQlwdWJsaWMgRmVhdHVyZShTaXRlIHNpdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZlYXR1cmVzIHNob3VsZCBub3QgaGF2ZSBhbiBlbXB0eSBzaXRlLiIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRmVhdHVyZSBvdGhlciA9IChGZWF0dXJlKSBvYmo7Ci0JCWlmICghZXF1YWxzKGdldElkKCksIG90aGVyLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBzaGFsbG93IGVxdWFscyBoZXJlLiBzaXRlcyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQlpZiAoIWVxdWFscyhnZXRTaXRlKCkuZ2V0VXJsKCksIG90aGVyLmdldFNpdGUoKS5nZXRVcmwoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZXF1YWxzKGdldFVybCgpLCBvdGhlci5nZXRVcmwoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZXF1YWxzKGdldFZlcnNpb24oKSwgb3RoZXIuZ2V0VmVyc2lvbigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVxdWFscyhPYmplY3Qgb25lLCBPYmplY3QgdHdvKSB7Ci0JCXJldHVybiBvbmUgPT0gbnVsbCA/IHR3byA9PSBudWxsIDogb25lLmVxdWFscyh0d28pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0YzhhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9TaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qCi0gKiBSZXByZXNlbnRzIGEgc2l0ZSBpbiBhIHBsYXRmb3JtLnhtbCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfTUFOQUdFRF9PTkxZID0gIk1BTkFHRUQtT05MWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfVVNFUl9FWENMVURFID0gIlVTRVItRVhDTFVERSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfVVNFUl9JTkNMVURFID0gIlVTRVItSU5DTFVERSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIHBvbGljeTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlYWJsZTsKLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGlua0ZpbGU7Ci0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZShGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKFN0cmluZyBwbHVnaW4pIHsKLQkJdGhpcy5saXN0LmFkZChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCXJldHVybiAoRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlIHJlbW92ZUZlYXR1cmUoU3RyaW5nIGZlYXR1cmVVUkwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5leHRVUkwgPSAoKEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKSkuZ2V0VXJsKCk7Ci0JCQlpZiAobmV4dFVSTCAhPSBudWxsICYmIG5leHRVUkwuZXF1YWxzKGZlYXR1cmVVUkwpKSB7Ci0JCQkJcmV0dXJuIChGZWF0dXJlKSBmZWF0dXJlcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5rRmlsZSgpIHsKLQkJcmV0dXJuIGxpbmtGaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMaXN0KCkgewotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9saWN5KCkgewotCQlyZXR1cm4gcG9saWN5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVhYmxlKCkgewotCQlyZXR1cm4gdXBkYXRlYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmtGaWxlKFN0cmluZyBsaW5rRmlsZSkgewotCQl0aGlzLmxpbmtGaWxlID0gbGlua0ZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9saWN5KFN0cmluZyBwb2xpY3kpIHsKLQkJdGhpcy5wb2xpY3kgPSBwb2xpY3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlYWJsZShib29sZWFuIHVwZGF0ZWFibGUpIHsKLQkJdGhpcy51cGRhdGVhYmxlID0gdXBkYXRlYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0VXJsKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFNpdGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTaXRlIG90aGVyID0gKFNpdGUpIG9iajsKLQkJaWYgKGlzRW5hYmxlZCgpICE9IG90aGVyLmlzRW5hYmxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNVcGRhdGVhYmxlKCkgIT0gb3RoZXIuaXNVcGRhdGVhYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0VXJsKCkuZXF1YWxzKG90aGVyLmdldFVybCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFVdGlscy5lcXVhbHMoZ2V0TGlua0ZpbGUoKSwgb3RoZXIuZ2V0TGlua0ZpbGUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghVXRpbHMuZXF1YWxzKGdldFBvbGljeSgpLCBvdGhlci5nZXRQb2xpY3koKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghVXRpbHMuZXF1YWxzKGdldExpc3QoKSwgb3RoZXIuZ2V0TGlzdCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFVdGlscy5lcXVhbHMoZ2V0RmVhdHVyZXMoKSwgb3RoZXIuZ2V0RmVhdHVyZXMoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFmMWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlRW5jID0gdHJ1ZTsKLQotCS8qCi0JICogQ29waWVkIGZyb20gVXBkYXRlVVJMRGVjb2RlciB2MS40IGluIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmICghaW5pdCkgewotCQkJaW5pdCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXJldHVybiBVUkxEZWNvZGVyLmRlY29kZShzLCBlbmMpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZSkgewotCQkJCXVzZUVuYyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB1c2VFbmMgPyBVUkxEZWNvZGVyLmRlY29kZShzLCBlbmMpIDogVVJMRGVjb2Rlci5kZWNvZGUocyk7Ci0JfQotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBVdGlscyB2MS4zMiBpbiBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLgotCSAqIAotCSAqIEVuc3VyZXMgZmlsZTogVVJMcyBvbiBXaW5kb3dzIGhhdmUgdGhlIHJpZ2h0IGZvcm0gKGkuZS4gJy8nIGFzIHNlZ21lbnQgc2VwYXJhdG9yLCBkcml2ZSBsZXR0ZXIgaW4gbG93ZXIgY2FzZSwgZXRjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm9uaWNhbGl6ZVVSTChTdHJpbmcgdXJsKSB7Ci0JCWlmICghKGlzV2luZG93cyAmJiB1cmwuc3RhcnRzV2l0aCgiZmlsZToiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB1cmw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aCA9IG5ldyBVUkwodXJsKS5nZXRQYXRoKCk7Ci0JCQkvLyBub3JtYWxpemUgdG8gbm90IGhhdmUgbGVhZGluZyAvIHNvIHdlIGNhbiBjaGVjayB0aGUgZm9ybQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlwYXRoID0gZmlsZS50b1N0cmluZygpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCS8vIGhhbmRsZSBVUkxzIHRoYXQgZG9uJ3QgaGF2ZSBhIHBhdGgKLQkJCWlmIChwYXRoLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIHVybDsKLQkJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UocGF0aC5jaGFyQXQoMCkpKSB7Ci0JCQkJY2hhcltdIGNoYXJzID0gcGF0aC50b0NoYXJBcnJheSgpOwotCQkJCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoYXJzWzBdKTsKLQkJCQlwYXRoID0gbmV3IFN0cmluZyhjaGFycyk7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRlZmF1bHQgdG8gb3JpZ2luYWwgdXJsCi0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLQkgKiBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9uZSwgT2JqZWN0IHR3bykgewotCQlyZXR1cm4gb25lID09IG51bGwgPyB0d28gPT0gbnVsbCA6IG9uZS5lcXVhbHModHdvKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLQkgKiBsaXN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdFtdIG9uZSwgT2JqZWN0W10gdHdvKSB7Ci0JCWlmIChvbmUgPT0gbnVsbCAmJiB0d28gPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob25lID09IG51bGwgfHwgdHdvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvbmUubGVuZ3RoICE9IHR3by5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb25lLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCB0d28ubGVuZ3RoOyBqKyspCi0JCQkJZm91bmQgPSBvbmVbaV0uZXF1YWxzKHR3b1tqXSk7Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGUgPSB1cmxTdHJpbmc7Ci0JCXdoaWxlICghZG9uZSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKGZpbGUpOwotCQkJCWZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAodXJsID09IG51bGwgfHwgIW5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0KLQkJU3RyaW5nIHJvb3RTdHJpbmcgPSByb290VVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSArIG1ha2VSZWxhdGl2ZSh1cmxTdHJpbmcuc3Vic3RyaW5nKGluZGV4KSwgcm9vdFN0cmluZy5zdWJzdHJpbmcocm9vdFN0cmluZy5pbmRleE9mKEZJTEVfUFJPVE9DT0wpICsgNSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyByb290UGF0aCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgob3JpZ2luYWwpOwotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQotCQkvL1JldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBpZiBubyByZWxhdGl2aXphdGlvbiBoYXMgYmVlbiBkb25lCi0JCVN0cmluZyByZXN1bHQgPSBtYWtlUmVsYXRpdmUocGF0aCwgbmV3IFBhdGgocm9vdFBhdGgpKTsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpLmVxdWFscyhyZXN1bHQpID8gb3JpZ2luYWwgOiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHRoZSBnaXZlbiBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgcm9vdCwgaWYgYXBwbGljYWJsZS4gSWYgbm90LCB0aGVuCi0JICogcmV0dXJuIHRoZSBwYXRoIGFzLWlzLgotCSAqIAotCSAqIE1ldGhvZCBzaW1pbGFyIHRvIG9uZSBmcm9tIFNpbXBsZUNvbmZpZ3VyYXRpb25NYW5pcHVsYXRvckltcGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShJUGF0aCB0b1JlbCwgSVBhdGggYmFzZSkgewotCQlpbnQgaSA9IGJhc2UubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHRvUmVsKTsKLQkJaWYgKGkgPT0gMCkgewotCQkJcmV0dXJuIHRvUmVsLnRvT1NTdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgKGJhc2Uuc2VnbWVudENvdW50KCkgLSBpKTsgaisrKSB7Ci0JCQlyZXN1bHQgKz0gIi4uIiArIFBhdGguU0VQQVJBVE9SOwotCQl9Ci0JCWlmIChpID09IHRvUmVsLnNlZ21lbnRDb3VudCgpKQotCQkJcmV0dXJuICIuIjsKLQkJcmVzdWx0ICs9IHRvUmVsLnNldERldmljZShudWxsKS5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGdpdmVuIHBhdGggYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCByb290LCBpZiBhcHBsaWNhYmxlLiBJZiBub3QsIHRoZW4KLQkgKiByZXR1cm4gdGhlIHBhdGggYXMtaXMuCi0JICogCi0JICogTWV0aG9kIHNpbWlsYXIgdG8gb25lIGZyb20gU2ltcGxlQ29uZmlndXJhdGlvbk1hbmlwdWxhdG9ySW1wbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIG9yaWdpbmFsLCBTdHJpbmcgcm9vdFBhdGgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9yaWdpbmFsKTsKLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJUGF0aCByb290ID0gbmV3IFBhdGgocm9vdFBhdGgpOwotCQlyZXR1cm4gcm9vdC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChvcmlnaW5hbC5yZXBsYWNlKCc6JywgJ30nKSkudG9PU1N0cmluZygpLnJlcGxhY2UoJ30nLCAnOicpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgZmlsZSA9IHVybFN0cmluZzsKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwoZmlsZSk7Ci0JCQkJZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICh1cmwgPT0gbnVsbCB8fCBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCi0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4IC0gNSkgKyBtYWtlQWJzb2x1dGUodXJsU3RyaW5nLnN1YnN0cmluZyhpbmRleCksIHJvb3RVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvWE1MV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9YTUxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4NjY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9YTUxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIHNpbXBsZSBYTUwgd3JpdGVyLgotICogCi0gKiBDb3BpZWQgZnJvbSB0aGUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMgYnVuZGxlLgotICovCi1wdWJsaWMgY2xhc3MgWE1MV3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotCXByb3RlY3RlZCBpbnQgdGFiOwotCi0JLyogY29uc3RhbnRzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT04gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFhNTFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQl0YWIgPSAwOwotCQlwcmludGxuKFhNTF9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRUYWcoU3RyaW5nIG5hbWUpIHsKLQkJdGFiLS07Ci0JCXByaW50VGFnKCcvJyArIG5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U2ltcGxlVGFnKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXByaW50VGFnKG5hbWUsIG51bGwsIHRydWUsIGZhbHNlKTsKLQkJCXByaW50KGdldEVzY2FwZWQoU3RyaW5nLnZhbHVlT2YodmFsdWUpKSk7Ci0JCQlwcmludFRhZygnLycgKyBuYW1lLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRhYnVsYXRpb24oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiOyBpKyspCi0JCQlzdXBlci5wcmludCgnXHQnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRhZyhTdHJpbmcgbmFtZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJcHJpbnRUYWcobmFtZSwgcGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRUYWcoU3RyaW5nIG5hbWUsIE1hcCBwYXJhbWV0ZXJzLCBib29sZWFuIHNob3VsZFRhYiwgYm9vbGVhbiBuZXdMaW5lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCI8Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmFtZXRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlzYi5hcHBlbmQoa2V5KTsKLQkJCQlzYi5hcHBlbmQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGdldEVzY2FwZWQoU3RyaW5nLnZhbHVlT2YocGFyYW1ldGVycy5nZXQoa2V5KSkpKTsKLQkJCQlzYi5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJc2IuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNob3VsZFRhYikKLQkJCXByaW50VGFidWxhdGlvbigpOwotCQlpZiAobmV3TGluZSkKLQkJCXByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCXByaW50KHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0VGFnKFN0cmluZyBuYW1lLCBNYXAgcGFyYW1ldGVycykgewotCQlzdGFydFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydFRhZyhTdHJpbmcgbmFtZSwgTWFwIHBhcmFtZXRlcnMsIGJvb2xlYW4gbmV3TGluZSkgewotCQlwcmludFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlLCBuZXdMaW5lKTsKLQkJdGFiKys7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyIGMpIHsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZ2V0UmVwbGFjZW1lbnQoYyk7Ci0JCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VtZW50KTsKLQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFc2NhcGVkKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyAxMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKQotCQkJYXBwZW5kRXNjYXBlZENoYXIocmVzdWx0LCBzLmNoYXJBdChpKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVwbGFjZW1lbnQoY2hhciBjKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gInF1b3QiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZmE4MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTIzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI1RodSBBdWcgMTYgMTE6MDA6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhY2QwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1OTowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NGYwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQubmF0aXZlcy5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjMiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJkOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE0Mzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIE5hdGl2ZSBUb3VjaHBvaW50IChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhOGUzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUudG91Y2hwb2ludHMiIGlkPSJuYXRpdmUiIG5hbWU9Ik5hdGl2ZSBUb3VjaHBvaW50Ij4KLQkJPHRvdWNocG9pbnQgCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hdGl2ZSIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMuTmF0aXZlVG91Y2hwb2ludCIKLQkJCXZlcnNpb249IjEuMC4wIi8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTQ2MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGFDb250ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvQmFja3VwRmlsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0JhY2t1cEZpbGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzhlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvQmFja3VwRmlsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQmFja3VwRmlsZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpJUF9TVUZGSVggPSAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19TVUZGSVggPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIEZpbGUgYmFja3VwRGlyOwotCXByaXZhdGUgYm9vbGVhbiBkb0JhY2t1cDsKLQotCS8qKgotCSAqIFNhdmUgb3IgcmVzdG9yZSBiYWNrdXBzIG9mIGZpbGVzIGluIGJhY2t1cERpcgotCSAqLwotCXB1YmxpYyBCYWNrdXBGaWxlcyhGaWxlIGJhY2t1cERpcikgewotCQl0aGlzLmRvQmFja3VwID0gdHJ1ZTsKLQkJdGhpcy5iYWNrdXBEaXIgPSBiYWNrdXBEaXI7Ci0JCXRoaXMuYmFja3VwRGlyLm1rZGlycygpOwotCX0KLQotCS8vICAgIC8qKgotCS8vICAgICAqIElmIGRvQmFja3VwIGlzIHNldCB0byBmYWxzZSwgZmlsZXMgYXJlIGRlbGV0ZWQgb24gdW5pbnN0YWxsLCBpbnN0ZWFkIG9mIHJlc3RvcmVkLgotCS8vICAgICAqLwotCS8vICAgIHB1YmxpYyB2b2lkIHNldERvQmFja3VwKGJvb2xlYW4gZG9CYWNrdXApIHsKLQkvLyAgICAgICAgdGhpcy5kb0JhY2t1cCA9IGRvQmFja3VwOwotCS8vICAgIH0KLQotCS8qKgotCSAqIFJlc3RvcmUgYWxsIGJhY2t1cHMgbWFkZSBpbiB0aGlzIGRpci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmluZCBiYWNrdXAgcHJvcGVydGllcyBmaWxlcywgZG8gaW4gcmV2ZXJzZSBvcmRlcgotCQlMaXN0IHByb3BzRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKGludCBpID0gMDs7IGkgKz0gMSkgewotCQkJRmlsZSBwcm9wc0ZpbGUgPSBnZXRCYWNrdXBQcm9wZXJ0aWVzKGkpOwotCQkJaWYgKCFwcm9wc0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXByb3BzRmlsZXMuYWRkKDAsIHByb3BzRmlsZSk7Ci0JCX0KLQkJSVByb2dyZXNzTW9uaXRvcltdIHBtID0gVXRpbC5zcGxpdFByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBwcm9wc0ZpbGVzLnNpemUoKSk7Ci0JCWludCBqID0gMDsKLQkJZm9yIChJdGVyYXRvciBpID0gcHJvcHNGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUZpbGUgcHJvcHNGaWxlID0gKEZpbGUpIGkubmV4dCgpOwotCQkJcmVzdG9yZUZpbGVzRnJvbUJhY2t1cChwcm9wc0ZpbGUsIHBtW2orK10pOwotCQl9Ci0JCWlmICghdGhpcy5iYWNrdXBEaXIuZGVsZXRlKCkpIHsKLQkJCS8vbm90IGVtcHR5PyAgbG9nIGEgd2FybmluZz8KLQkJfSBlbHNlIHsKLQkJCS8vIGRlbGV0ZSB0aGUgcGFyZW50IGlmIGVtcHR5Ci0JCQl0aGlzLmJhY2t1cERpci5nZXRQYXJlbnRGaWxlKCkuZGVsZXRlKCk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JLyoqCi0JICogRmluZCBmaWxlcyB1bmRlciBvdXRwdXREaXIgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGluIHVuemlwVVJMCi0JICogYW5kIHNhdmUgdW5kZXIgYmFja3VwRGlyLCBhbmQgZGVsZXRlLgotCSAqIEluY2x1ZGUgcHJvcGVydGllcyBmaWxlIHRvIGluZGljYXRlIGZpbGVzIHRvIGRlbGV0ZSBvciByZXN0b3JlIG9uIHJvbGxlZCBiYWNrLgotCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIGlzIHVzZWQgb25seSB0byBkaXNwbGF5IHN1Yi10YXNrczsgd2UgZG9uJ3QgdXBkYXRlIGl0IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiYWNrdXBGaWxlc0luWmlwKFN0cmluZyBpZGVudGlmaWVyLCBVUkwgemlwVVJMLCBGaWxlIG91dHB1dERpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCYWNrdXBQcm9wZXJ0aWVzIGJhY2t1cFByb3BzID0gbmV3IEJhY2t1cFByb3BlcnRpZXMoaWRlbnRpZmllciwgb3V0cHV0RGlyKTsKLQkJWmlwT3V0cHV0U3RyZWFtIHpvcyA9IG51bGw7Ci0JCVN0cmluZyBwcmV2RGlyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVppcElucHV0U3RyZWFtIGluID0gbmV3IFppcElucHV0U3RyZWFtKHppcFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJWmlwRW50cnkgemU7Ci0JCQl3aGlsZSAoKHplID0gaW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHplLmdldE5hbWUoKTsKLQkJCQlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlpZiAoaSAhPSAtMSkgewotCQkJCQlTdHJpbmcgZGlyID0gbmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0JCQkJCWlmICh0aGlzLmRvQmFja3VwICYmICFkaXIuZXF1YWxzKHByZXZEaXIpKSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2sobmFtZS5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCQkJcHJldkRpciA9IGRpcjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXplLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSBvcmlnRmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciwgbmFtZSk7Ci0JCQkJCWlmICh0aGlzLmRvQmFja3VwICYmIG9yaWdGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlpZiAoem9zID09IG51bGwpIHsKLQkJCQkJCQlGaWxlIHppcEZpbGUgPSBiYWNrdXBQcm9wcy5nZXRBcmNoaXZlKCk7Ci0JCQkJCQkJem9zID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh6aXBGaWxlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShuYW1lKTsKLQkJCQkJCXppcEVudHJ5LnNldFRpbWUob3JpZ0ZpbGUubGFzdE1vZGlmaWVkKCkpOwotCQkJCQkJem9zLnB1dE5leHRFbnRyeSh6aXBFbnRyeSk7Ci0JCQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG9yaWdGaWxlKSwgdHJ1ZSwgem9zLCBmYWxzZSk7Ci0JCQkJCQl6b3MuY2xvc2VFbnRyeSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmFja3VwUHJvcHMuYWRkRmlsZVRvRGVsZXRlKG5hbWUpOwotCQkJCQl9Ci0JCQkJCW9yaWdGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCQlpbi5jbG9zZUVudHJ5KCk7Ci0JCQl9Ci0JCQlpbi5jbG9zZSgpOwotCQl9IGZpbmFsbHkgewotCQkJYmFja3VwUHJvcHMuc3RvcmUoKTsKLQkJCWlmICh6b3MgIT0gbnVsbCkgewotCQkJCXpvcy5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVGaWxlc0Zyb21CYWNrdXAoRmlsZSBwcm9wc0ZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQmFja3VwUHJvcGVydGllcyBiYWNrdXBQcm9wcyA9IG5ldyBCYWNrdXBQcm9wZXJ0aWVzKHByb3BzRmlsZSk7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnJlc3RvcmluZywgcHJvcHNGaWxlLnRvU3RyaW5nKCkpLCAzKTsKLQkJbW9uaXRvci5zdWJUYXNrKCIiKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYmFja3VwUHJvcHMuZ2V0RmlsZXNUb0RlbGV0ZSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCUZpbGUgZnVsbCA9IG5ldyBGaWxlKGJhY2t1cFByb3BzLmdldFJvb3REaXIoKSwgbmFtZSk7Ci0JCQlmdWxsLmRlbGV0ZSgpOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQlGaWxlIHppcEZpbGUgPSBiYWNrdXBQcm9wcy5nZXRBcmNoaXZlKCk7Ci0JCWlmICh6aXBGaWxlLmV4aXN0cygpKSB7IC8vIG9ubHkgZXhpc3RzIGlmIGZpbGVzIHdlcmUgc2F2ZWQKLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWIgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQlGaWxlVXRpbHMudW56aXBGaWxlKHppcEZpbGUsIGJhY2t1cFByb3BzLmdldFJvb3REaXIoKSwgIiIsIHN1Yik7Ci0JCQl6aXBGaWxlLmRlbGV0ZSgpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpID0gYmFja3VwUHJvcHMuZ2V0RGlyc1RvRGVsZXRlKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJRmlsZSBmdWxsID0gbmV3IEZpbGUoYmFja3VwUHJvcHMuZ2V0Um9vdERpcigpLCBuYW1lKTsKLQkJCUZpbGVVdGlscy5kZWxldGVFbXB0eURpcnMoZnVsbCk7Ci0JCX0KLQkJcHJvcHNGaWxlLmRlbGV0ZSgpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JLy8gQmFja3VwIGZpbGVzIGFyZSBqdXN0IDAucHJvcGVydGllcywgMS5wcm9wZXJ0aWVzLCBldGMuCi0JLy8gR2V0IHRoZSBuZXh0IHVudXNlZCBvbmUuCi0JcHJpdmF0ZSBGaWxlIGdldEJhY2t1cFByb3BlcnRpZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOzsgaSArPSAxKSB7Ci0JCQlGaWxlIHJlc3VsdCA9IGdldEJhY2t1cFByb3BlcnRpZXMoaSk7Ci0JCQlpZiAoIXJlc3VsdC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEJhY2t1cFByb3BlcnRpZXMoaW50IGkpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKEJhY2t1cEZpbGVzLnRoaXMuYmFja3VwRGlyLCBJbnRlZ2VyLnRvU3RyaW5nKGkpICsgUFJPUEVSVElFU19TVUZGSVgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQmFja3VwUHJvcGVydGllcyBleHRlbmRzIFByb3BlcnRpZXMgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjY4MzEzNDkyMzQ4NTMzMDI5TDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSUxFX0tJTkQgPSAnZic7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRElSX0tJTkQgPSAnZCc7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUiA9ICJyb290RGlyIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfS0VZID0gImFydGlmYWN0S2V5IjsgLy8kTk9OLU5MUy0xJAotCQkvLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1VTRVIgPSAiYXJ0aWZhY3RVc2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgaW50IG4gPSAwOyAvLyBudW1iZXIgb2YgcHJvcGVydGllcwotCQlwcml2YXRlIEZpbGUgZmlsZTsgLy8gZmlsZSB0byBzdG9yZSBwcm9wZXJ0aWVzIGluCi0JCXByaXZhdGUgTGlzdCBrZXlzID0gbmV3IExpbmtlZExpc3QoKTsgLy8ga2V5cywgaW4gb3JkZXIgdGhleSB3ZXJlIGFkZGVkIG9yIHJlYWQKLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIHJvb3REaXI7IC8vIHJvb3Qgb2Ygd2hlcmUgZmlsZXMgYXJlIGdvaW5nCi0JCXByaXZhdGUgU2V0IGRpcnNUb0NyZWF0ZSA9IG5ldyBUcmVlU2V0KCk7IC8vIHNldCBvZiBkaXJzIHdlIHdpbGwgY3JlYXRlCi0KLQkJLy8gY3JlYXRlIHByb3BlcnRpZXMgYmFzZWQgb24gZmlsZSB3ZSBhcmUgYmFja2luZyB1cCB0bwotCQlwdWJsaWMgQmFja3VwUHJvcGVydGllcyhTdHJpbmcgaWRlbnRpZmllciwgRmlsZSByb290RGlyKSB7Ci0JCQl0aGlzLmZpbGUgPSBCYWNrdXBGaWxlcy50aGlzLmdldEJhY2t1cFByb3BlcnRpZXMoKTsKLQkJCXRoaXMucm9vdERpciA9IHJvb3REaXI7Ci0JCQlzZXRQcm9wZXJ0eShST09UX0RJUiwgcm9vdERpci5nZXRQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCXNldFByb3BlcnR5KEFSVElGQUNUX0tFWSwgKGlkZW50aWZpZXIgIT0gbnVsbCA/IGlkZW50aWZpZXIgOiByb290RGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkvLwkJCXNldFByb3BlcnR5KEFSVElGQUNUX1VTRVIsIGFydGlmYWN0LnRvVXNlclN0cmluZygpKTsKLQkJCS8vIG1ha2Ugc3VyZSByb290RGlyIGlzIGRlbGV0ZWQgaWYgYXBwcm9wcmlhdGUKLQkJCWFkZERpcigiLi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJhY2t1cCBwcm9wZXJ0aWVzIGZyb20gYSBwcmV2aW91c2x5IHNhdmVkIEJhY2t1cFByb3BlcnRpZXMKLQkJcHVibGljIEJhY2t1cFByb3BlcnRpZXMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKLQkJCQlsb2FkKHN0cmVhbSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQkJdGhpcy5yb290RGlyID0gbmV3IEZpbGUoZ2V0UHJvcGVydHkoUk9PVF9ESVIpKTsKLQkJfQotCi0JCS8vCQlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0S2V5KCkgewotCQkvLwkJCXJldHVybiBnZXRQcm9wZXJ0eShBUlRJRkFDVF9LRVkpOwotCQkvLwkJfQotCi0JCS8vCQlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VXNlclN0cmluZygpIHsKLQkJLy8JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvcGVydHkoQVJUSUZBQ1RfVVNFUik7Ci0JCS8vCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCS8vCQkJCXJldHVybiByZXN1bHQ7Ci0JCS8vCQkJfSBlbHNlIHsKLQkJLy8JCQkJLy8gcmV0dXJuIHNvbWV0aGluZyBpZiB0aGUga2V5IHdhc24ndCBzYXZlZAotCQkvLwkJCQlyZXN1bHQgPSBnZXRBcnRpZmFjdEtleSgpOwotCQkvLwkJCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUZpcnN0KCIsbmF0aXZlLCIsICIsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLwkJCQlyZXR1cm4gcmVzdWx0LnJlcGxhY2UoJywnLCAnICcpLnRyaW0oKTsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0Um9vdERpcigpIHsKLQkJCXJldHVybiB0aGlzLnJvb3REaXI7Ci0JCX0KLQotCQkvLyBXZSBhcmUgYmFja2luZyB1cCBmaWxlcyBmb3IgdGhpcyBhcnRpZmFjdC4KLQkJLy8gQ3JlYXRlIGEgYmFja3VwIHppcCBiYXNlZCBvbiB0aGUgYXJ0aWZhY3Qga2V5IChhcyBhIGhpbnQpLgotCQlwdWJsaWMgRmlsZSBnZXRBcmNoaXZlKCkgewotCQkJU3RyaW5nIHBhdGggPSB0aGlzLmZpbGUuZ2V0UGF0aCgpOwotCQkJaWYgKHBhdGguZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7Ci0JCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBQUk9QRVJUSUVTX1NVRkZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbGUocGF0aCArIFpJUF9TVUZGSVgpOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RmlsZXNUb0RlbGV0ZSgpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ1Byb3BlcnRpZXMoRklMRV9LSU5EKTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldERpcnNUb0RlbGV0ZSgpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ1Byb3BlcnRpZXMoRElSX0tJTkQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0IGdldE1hdGNoaW5nUHJvcGVydGllcyhjaGFyIGMpIHsKLQkJCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChrZXkuZXF1YWxzKEJhY2t1cFByb3BlcnRpZXMuUk9PVF9ESVIpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoa2V5LmNoYXJBdCgwKSA9PSBjKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEZpbGVUb0RlbGV0ZShTdHJpbmcgbmFtZSkgewotCQkJYWRkKEZJTEVfS0lORCwgbmFtZSk7Ci0JCQlhZGREaXIobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBhZGQgdGhlIGRpcmVjdG9yaWVzIC0tIGF0IGVuZCBiZWNhdXNlIHdlIHdhbnQgdGhlbSBhbGwgaW4gb3JkZXIKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuZGlyc1RvQ3JlYXRlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJYWRkKERJUl9LSU5ELCBuYW1lKTsKLQkJCX0KLQkJCUZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhpcy5maWxlKTsKLQkJCXRyeSB7Ci0JCQkJc3RvcmUoc3RyZWFtLCAvKmhlYWRlciovbnVsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAoIShrZXkgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgU3RyaW5nOiAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgU3RyaW5nOiAiICsgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmtleXMuYWRkKGtleSk7Ci0JCQlyZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gcmV0dXJuIGtleXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZAotCQlwdWJsaWMgc3luY2hyb25pemVkIEVudW1lcmF0aW9uIGtleXMoKSB7Ci0JCQlmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMua2V5cy5pdGVyYXRvcigpOwotCQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZChjaGFyIGtpbmQsIFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmdCdWZmZXIga2V5ID0gbmV3IFN0cmluZ0J1ZmZlcig0KTsKLQkJCWtleS5hcHBlbmQoa2luZCkuYXBwZW5kKG4rKyk7Ci0JCQlzZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgbmFtZS5yZXBsYWNlKCdcXCcsICcvJykpOwotCQl9Ci0KLQkJLy8gaWYgd2UncmUgZ29pbmcgdG8gY3JlYXRlIHRoaXMgZGlyLCByZW1lbWJlciB0aGF0IHNvIHdlIGRlbGV0ZSBpdAotCQlwcml2YXRlIHZvaWQgYWRkRGlyKFN0cmluZyBuYW1lKSB7Ci0JCQlpbnQgc2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoc2xhc2ggPT0gLTEpCi0JCQkJcmV0dXJuOyAvLyBubyBkaXIKLQkJCVN0cmluZyBkaXJOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgc2xhc2gpOwotCQkJaWYgKHRoaXMuZGlyc1RvQ3JlYXRlLmNvbnRhaW5zKGRpck5hbWUpKQotCQkJCXJldHVybjsgLy8gYWxyZWFkeSBoYXZlIGl0Ci0JCQlpZiAobmV3IEZpbGUodGhpcy5yb290RGlyLCBkaXJOYW1lKS5leGlzdHMoKSkKLQkJCQlyZXR1cm47IC8vIGFscmVhZHkgZXhpc3RzCi0JCQl0aGlzLmRpcnNUb0NyZWF0ZS5hZGQoZGlyTmFtZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzFlOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQubmF0aXZlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlIGFuZCBhc3NpZ24gdG8gZmllbGRzIGJlbG93Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnppcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdG9yaW5nOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9OYXRpdmVUb3VjaHBvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9OYXRpdmVUb3VjaHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjU5NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvTmF0aXZlVG91Y2hwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQubmF0aXZlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBOYXRpdmVUb3VjaHBvaW50IGV4dGVuZHMgVG91Y2hwb2ludCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIElELCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscygiY29sbGVjdCIpKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0FjdGlvbigpIHsKLQkJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KCJwcm9maWxlIik7Ci0JCQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldCgib3BlcmFuZCIpOwotCQkJCQl0cnkgewotCQkJCQkJSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzID0gY29sbGVjdChvcGVyYW5kLnNlY29uZCgpLCBwcm9maWxlKTsKLQkJCQkJCUNvbGxlY3Rpb24gYXJ0aWZhY3RSZXF1ZXN0cyA9IChDb2xsZWN0aW9uKSBwYXJhbWV0ZXJzLmdldCgiYXJ0aWZhY3RSZXF1ZXN0cyIpOwotCQkJCQkJYXJ0aWZhY3RSZXF1ZXN0cy5hZGQocmVxdWVzdHMpOwotCQkJCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvIGZvciBub3cKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCWlmIChhY3Rpb25JZC5lcXVhbHMoInVuemlwIikpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uKCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJcmV0dXJuIHVuemlwKHBhcmFtZXRlcnMpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJcmV0dXJuIGNsZWFudXB6aXAocGFyYW1ldGVycyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKCJjbGVhbnVwemlwIikpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uKCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJcmV0dXJuIGNsZWFudXB6aXAocGFyYW1ldGVycyk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJCQlyZXR1cm4gdW56aXAocGFyYW1ldGVycyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCWlmIChhY3Rpb25JZC5lcXVhbHMoImNobW9kIikpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uKCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJU3RyaW5nIHRhcmdldERpciA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KCJ0YXJnZXREaXIiKTsKLQkJCQkJaWYgKHRhcmdldERpciA9PSBudWxsKQotCQkJCQkJcmV0dXJuIGNyZWF0ZUVycm9yKCJUaGUgXCJ0YXJnZXREaXJcIiBwYXJhbWV0ZXIgd2FzIG5vdCBzZXQgaW4gdGhlIFwiY2htb2RcIiBhY3Rpb24uIik7Ci0JCQkJCVN0cmluZyB0YXJnZXRGaWxlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoInRhcmdldEZpbGUiKTsKLQkJCQkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBjcmVhdGVFcnJvcigiVGhlIFwidGFyZ2V0RmlsZVwiIHBhcmFtZXRlciB3YXMgbm90IHNldCBpbiB0aGUgXCJjaG1vZFwiIGFjdGlvbi4iKTsKLQkJCQkJU3RyaW5nIHBlcm1pc3Npb25zID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoInBlcm1pc3Npb25zIik7Ci0JCQkJCWlmIChwZXJtaXNzaW9ucyA9PSBudWxsKQotCQkJCQkJcmV0dXJuIGNyZWF0ZUVycm9yKCJUaGUgXCJwZXJtaXNzaW9uc1wiIHBhcmFtZXRlciB3YXMgbm90IHNldCBpbiB0aGUgXCJjaG1vZFwiIGFjdGlvbiIpOwotCi0JCQkJCW5ldyBQZXJtaXNzaW9ucygpLmNobW9kKHRhcmdldERpciwgdGFyZ2V0RmlsZSwgcGVybWlzc2lvbnMpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQkJCS8vVE9ETzogaW1wbGVtZW50IHVuZG8gPz8KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JfQotCi0JSUFydGlmYWN0UmVxdWVzdFtdIGNvbGxlY3QoSUluc3RhbGxhYmxlVW5pdCBpbnN0YWxsYWJsZVVuaXQsIElQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RLZXlbXSB0b0Rvd25sb2FkID0gaW5zdGFsbGFibGVVbml0LmdldEFydGlmYWN0cygpOwotCQlpZiAodG9Eb3dubG9hZCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQXJ0aWZhY3RSZXF1ZXN0WzBdOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uID0gZ2V0RG93bmxvYWRDYWNoZVJlcG8oKTsKLQkJSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzID0gbmV3IElBcnRpZmFjdFJlcXVlc3RbdG9Eb3dubG9hZC5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvRG93bmxvYWQubGVuZ3RoOyBpKyspIHsKLQkJCS8vVE9ETyBIZXJlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgZG93bmxvYWQgaXMgbm90IG5lY2Vzc2FyeSBhZ2FpbiBiZWNhdXNlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSBpcyBqdXN0IGEgY29uZmlndXJhdGlvbiBzdGVwCi0JCQlyZXF1ZXN0c1tjb3VudCsrXSA9IGdldEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5jcmVhdGVNaXJyb3JSZXF1ZXN0KHRvRG93bmxvYWRbaV0sIGRlc3RpbmF0aW9uKTsKLQkJfQotCi0JCWlmIChyZXF1ZXN0cy5sZW5ndGggPT0gY291bnQpCi0JCQlyZXR1cm4gcmVxdWVzdHM7Ci0JCUlBcnRpZmFjdFJlcXVlc3RbXSByZXN1bHQgPSBuZXcgSUFydGlmYWN0UmVxdWVzdFtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVxdWVzdHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluc3RhbGxGb2xkZXIoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gcHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBZ2VudExvY2F0aW9uIGdldEFnZW50TG9jYXRpb24oKSB7Ci0JCXJldHVybiAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFnZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXREb3dubG9hZENhY2hlUmVwbygpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgbG9jYXRpb24gPSBnZXREb3dubG9hZENhY2hlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3Qgb2J0YWluIHRoZSBkb3dubG9hZCBjYWNoZSBsb2NhdGlvbi4iKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IG1hbmFnZXIgY291bGQgbm90IGJlIGZvdW5kLiIpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0JCXRyeSB7Ci0JCQlyZXBvc2l0b3J5ID0gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGUgZG93bmxvYWQgY2FjaGUgZG9lc24ndCBleGlzdCBvciBjb3VsZG4ndCBiZSByZWFkLiBDcmVhdGUgbmV3IGNhY2hlLgotCQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gbG9jYXRpb24gKyAiIC0gQWdlbnQgZG93bmxvYWQgY2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCQlyZXBvc2l0b3J5ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KGxvY2F0aW9uLCByZXBvc2l0b3J5TmFtZSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSk7Ci0JCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpKTsKLQkJCXJlcG9zaXRvcnkuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0sIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJfQotCi0JCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGRvd25sb2FkQ2FjaGUgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIHJlcG9zaXRvcnkuZ2V0QWRhcHRlcihJRmlsZUFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcyk7Ci0JCWlmIChkb3dubG9hZENhY2hlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJBZ2VudCBkb3dubG9hZCBjYWNoZSBub3Qgd3JpdGVhYmxlOiAiICsgbG9jYXRpb24pOwotCQlyZXR1cm4gZG93bmxvYWRDYWNoZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBVUkwgZ2V0RG93bmxvYWRDYWNoZUxvY2F0aW9uKCkgewotCQlBZ2VudExvY2F0aW9uIGxvY2F0aW9uID0gZ2V0QWdlbnRMb2NhdGlvbigpOwotCQlyZXR1cm4gKGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbi5nZXRBcnRpZmFjdFJlcG9zaXRvcnlVUkwoKSA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMpIHsKLQkJdG91Y2hwb2ludFBhcmFtZXRlcnMucHV0KCJpbnN0YWxsRm9sZGVyIiwgZ2V0SW5zdGFsbEZvbGRlcihwcm9maWxlKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUlTdGF0dXMgdW56aXAoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KCJzb3VyY2UiKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZUVycm9yKCJUaGUgXCJzb3VyY2VcIiBwYXJhbWV0ZXIgd2FzIG5vdCBzZXQgaW4gdGhlIFwidW56aXBcIiBhY3Rpb24uIik7Ci0KLQkJU3RyaW5nIG9yaWdpbmFsU291cmNlID0gc291cmNlOwotCQlTdHJpbmcgdGFyZ2V0ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoInRhcmdldCIpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlRXJyb3IoIlRoZSBcInRhcmdldFwiIHBhcmFtZXRlciB3YXMgbm90IHNldCBpbiB0aGUgXCJ1bnppcFwiIGFjdGlvbi4iKTsKLQotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KCJpdSIpOwotCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoInByb2ZpbGUiKTsKLQotCQlpZiAoc291cmNlLmVxdWFscygiQGFydGlmYWN0IikpIHsKLQkJCS8vVE9ETzogZml4IHdoZXJldmVyIHRoaXMgb2NjdXJzIC0tIGludmVzdGlnYXRlIGFzIHRoaXMgaXMgcHJvYmFibHkgbm90IGRlc2lyZWQKLQkJCWlmIChpdS5nZXRBcnRpZmFjdHMoKSA9PSBudWxsIHx8IGl1LmdldEFydGlmYWN0cygpLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBpdS5nZXRBcnRpZmFjdHMoKVswXTsKLQotCQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgZG93bmxvYWRDYWNoZTsKLQkJCXRyeSB7Ci0JCQkJZG93bmxvYWRDYWNoZSA9IGdldERvd25sb2FkQ2FjaGVSZXBvKCk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJfQotCQkJRmlsZSBmaWxlTG9jYXRpb24gPSBkb3dubG9hZENhY2hlLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSk7Ci0JCQlpZiAoKGZpbGVMb2NhdGlvbiA9PSBudWxsKSB8fCAhZmlsZUxvY2F0aW9uLmV4aXN0cygpKQotCQkJCXJldHVybiBjcmVhdGVFcnJvcigiVGhlIGFydGlmYWN0IGZvciAiICsgYXJ0aWZhY3RLZXkgKyAiIGlzIG5vdCBhdmFpbGFibGUiKTsKLQkJCXNvdXJjZSA9IGZpbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUZpbGVbXSB1bnppcHBlZEZpbGVzID0gbmV3IFppcCgpLnVuemlwKHNvdXJjZSwgdGFyZ2V0LCBudWxsKTsKLQkJU3RyaW5nQnVmZmVyIHVuemlwcGVkRmlsZU5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW56aXBwZWRGaWxlcy5sZW5ndGg7IGkrKykKLQkJCXVuemlwcGVkRmlsZU5hbWVCdWZmZXIuYXBwZW5kKHVuemlwcGVkRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgifCIpOwotCi0JCXByb2ZpbGUuc2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXUsICJ1bnppcHBlZCIgKyAifCIgKyBvcmlnaW5hbFNvdXJjZSArICJ8IiArIHRhcmdldCwgdW56aXBwZWRGaWxlTmFtZUJ1ZmZlci50b1N0cmluZygpKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjbGVhbnVwemlwKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldCgic291cmNlIik7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBjcmVhdGVFcnJvcigiVGhlIFwic291cmNlXCIgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGluIHRoZSBcImNsZWFudXB6aXBcIiBhY3Rpb24uIik7Ci0JCVN0cmluZyB0YXJnZXQgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldCgidGFyZ2V0Iik7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBjcmVhdGVFcnJvcigiVGhlIFwidGFyZ2V0XCIgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGluIHRoZSBcImNsZWFudXB6aXBcIiBhY3Rpb24uIik7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldCgiaXUiKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoInByb2ZpbGUiKTsKLQotCQlTdHJpbmcgdW56aXBwZWQgPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCAidW56aXBwZWQiICsgInwiICsgc291cmNlICsgInwiICsgdGFyZ2V0KTsKLQotCQlpZiAodW56aXBwZWQgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVuemlwcGVkLCAifCIpOwotCQlMaXN0IGRpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJCWRpcmVjdG9yaWVzLmFkZChmaWxlKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmRlbGV0ZSgpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpcmVjdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUZpbGUgZGlyZWN0b3J5ID0gKEZpbGUpIGl0Lm5leHQoKTsKLQkJCWRpcmVjdG9yeS5kZWxldGUoKTsKLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1Blcm1pc3Npb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9QZXJtaXNzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJkY2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1Blcm1pc3Npb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFJlZCBIYXQgSW5jb3Jwb3JhdGVkCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IEluY29ycG9yYXRlZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLXB1YmxpYyBjbGFzcyBQZXJtaXNzaW9ucyB7Ci0JcHVibGljIHZvaWQgY2htb2QoU3RyaW5nIHRhcmdldERpciwgU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBwZXJtcykgewotCQlSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJdHJ5IHsKLQkJCXIuZXhlYygiY2htb2QgIiArIHBlcm1zICsgIiAiICsgdGFyZ2V0RGlyICsgSVBhdGguU0VQQVJBVE9SICsgdGFyZ2V0RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEZJWE1FOiAgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IHNvbWUgc29ydCBvZiBlcnJvciBoZXJlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaG1vZChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0RmlsZSwgaW50IHBlcm1zKSB7Ci0JCWNobW9kKHRhcmdldCwgdGFyZ2V0RmlsZSwgSW50ZWdlci50b1N0cmluZyhwZXJtcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhZThhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIFV0aWwgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEFjdGl2YXRvci5JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKGVycm9yU3RhdHVzKG1zZywgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihlcnJvclN0YXR1cyhtc2csIGUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZXJyb3JTdGF0dXMoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBtc2csIGUpOwotCX0KLQotCS8qKgotCSAqIFNwbGl0IG1vbml0b3IgaW50byBuIGVxdWFsIHN1Yi1tb25pdG9ycyBhbmQgcmV0dXJuIHRoZW0uCi0JICogVGhpcyBjYWxscyBiZWdpblRhc2sgb24gbW9uaXRvciBhbmQgYXNzaWducyBhbGwgaXRzIHRpbWUgdG8gdGhlIHN1Yi1tb25pdG9ycy4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvcltdIHNwbGl0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IG4pIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCB8fCBtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikgewotCQkJbW9uaXRvciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgbik7Ci0JCX0KLQkJSVByb2dyZXNzTW9uaXRvcltdIHJlc3VsdCA9IG5ldyBJUHJvZ3Jlc3NNb25pdG9yW25dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkgKz0gMSkgewotCQkJcmVzdWx0W2ldID0gY3JlYXRlU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBjcmVhdGVTdWJQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1ppcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvWmlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGQ3Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvWmlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLy9UT0RPIEJlIGNhcmVmdWwgaGVyZSB3aXRoIHRoZSBwZXJtaXNzaW9ucy4uLi4gV2UgbWF5IG5lZWQgdG8gaGF2ZSBhIHByb3BlciB1bnppcCB0ZWNobm9sb2d5IGhlcmUgdGhhdCBzdXBwb3J0cyBmaWxlIHBlcm1pc3Npb25zIGZvciBsaW51eAotcHVibGljIGNsYXNzIFppcCB7Ci0JcHVibGljIEZpbGVbXSB1bnppcChTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24sIFN0cmluZyBiYWNrdXBEaXIpIHsKLQkJLy8JCUlBcnRpZmFjdCBhcnRpZmFjdCA9IGRhdGEuZ2V0QXJ0aWZhY3QoKTsKLQkJLy8JCVN0cmluZyBkZXN0aW5hdGlvbiA9IHBlcmZvcm1WYXJpYWJsZVN1YnN0aXR1dGlvbnMoZGF0YS5nZXREZXN0aW5hdGlvbigpKTsKLQkJLy8JCWlmIChjYW5JbnN0YWxsQXJ0aWZhY3QoKSkgewotCQkvL1RPRE8gaWYgYXJ0aWZhY3QgaGFzIGlzRXhwbG9kZWQ9PXRydWUgc2hvdWxkIHBhc3MgaW4gcHJvZ3Jlc3MgbW9uaXRvcgotCQkvLyBmb3IgdW56aXBwaW5nCi0JCUZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKHNvdXJjZSk7Ci0JCWlmICh6aXBGaWxlID09IG51bGwgfHwgIXppcEZpbGUuZXhpc3RzKCkpIHsKLQkJCS8vIGludGVybmFsIGVycm9yPwotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHRoZSBmaWxlcyB0byBiZSB1bnppcHBlZCBpcyBub3QgaGVyZSIpOwotCQkJLy8JCQl0aHJvdyBVdGlsLmNvcmVFeGNlcHRpb24obnVsbCwgTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX3RvX2Rvd25sb2FkX2FydGlmYWN0LCBzb3VyY2UpKTsKLQkJfQotCi0JCS8vCQlJUHJvZ3Jlc3NNb25pdG9yW10gcG0gPSAgbmV3IFNwbGl0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDIpOwotCQkvLwkJSVByb2dyZXNzTW9uaXRvciBiYWNrdXBQTSA9IHBtWzBdOwotCQkvLwkJSVByb2dyZXNzTW9uaXRvciB1bnppcFBNID0gcG1bMV07Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgRGVzdGluYXRpb24gbG9jYXRpb24KLQkJCS8vCQkJUGF0aCBkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RpbmF0aW9uKTsKLQkJCS8vCQkJaWYgKGRlc3RQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8JCQkJZGVzdGluYXRpb25EaXIgPSBkZXN0UGF0aC50b0ZpbGUoKTsKLQkJCS8vCQkJfSBlbHNlIHsKLQkJCS8vCQkJCWRlc3RpbmF0aW9uRGlyID0gbmV3IEZpbGUoZ2V0TG9jYXRpb24oUHJvZmlsZS5JTlNUQUxMX0xPQ0FUSU9OKSk7Ci0JCQkvLwkJCQlpZiAoIWRlc3RpbmF0aW9uLmVxdWFscygiLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQkJCQlkZXN0aW5hdGlvbkRpciA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uRGlyLCBkZXN0aW5hdGlvbik7Ci0JCQkvLwkJCQl9Ci0JCQkvLwkJCX0KLQotCQkJaWYgKGJhY2t1cERpciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8JCQkJYmFja3VwUE0uYmVnaW5UYXNrKE1lc3NhZ2VzLmJhY2tpbmdfdXAsIDEpOwotCQkJCQlCYWNrdXBGaWxlcyBiYWNrdXBGaWxlcyA9IG5ldyBCYWNrdXBGaWxlcyhuZXcgRmlsZShiYWNrdXBEaXIpKTsKLQkJCQkJYmFja3VwRmlsZXMuYmFja3VwRmlsZXNJblppcChiYWNrdXBEaXIsIHppcEZpbGUudG9VUkwoKSwgbmV3IEZpbGUoZGVzdGluYXRpb24pLCBudWxsKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aGVuIGJhY2tpbmcgdXAgdGhlIGZpbGVzIik7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCS8vCQkJCXRocm93IFV0aWwuY29yZUV4Y2VwdGlvbihlLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvcl9iYWNraW5nX3VwLCB6aXBGaWxlKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJLy8JCQkJYmFja3VwUE0uZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHRhc2tOYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMudW56aXBwaW5nLCBzb3VyY2UpOwotCQkJCXJldHVybiBGaWxlVXRpbHMudW56aXBGaWxlKHppcEZpbGUsIG5ldyBGaWxlKGRlc3RpbmF0aW9uKSwgdGFza05hbWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aGVuIHVuemlwcGluZyIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiemlwZmlsZTogIiArIHppcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVzdGluYXRpb246ICIgKyBkZXN0aW5hdGlvbik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvLwkJCQl0aHJvdyBVdGlsLmNvcmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLwkJCQl1bnppcFBNLmRvbmUoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJLy8JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTIxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOYXRpdmVJbnN0YWxsQWRhcHRlcgotcmVzdG9yaW5nPVJlc3RvcmluZyB7MH0KLQotIyBVdGlsCi11bnppcHBpbmc9RXh0cmFjdGluZyB7MH0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL1Byb3ZBZG1pblVJLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvUHJvdkFkbWluVUkubGF1bmNoCmluZGV4IGUxNzQxMzIuLjE5MWNlMWEgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvUHJvdkFkbWluVUkubGF1bmNoCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvUHJvdkFkbWluVUkubGF1bmNoCkBAIC0xLDQgKzEsNCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+CiA8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgpAQCAtMTcsOSArMTcsOSBAQAogPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+CiA8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InJlc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyozLjQuMC5JMjAwODAzMjQtMTgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSozLjQuMC52MjAwODAzMTZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmFudC5jb3JlKjMuMi4wLnYyMDA4MDMxOUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuaGVscCozLjMuMTAwLnYyMDA4MDMyMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZyoxLjEuMC5JMjAwODAzMjUtMDEwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uuc3d0KjMuNC4wLnYzNDM2YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiozLjQuMC52MzQzNkBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmpmYWNlKjMuNC4wLkkyMDA4MDMyOC0xMjA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NioxLjAuMTAwLnYyMDA4MDIwMWFAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zKjMuNC4wLnYyMDA4MDMyNy0xMzAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyozLjIuMTAwLnYyMDA4MDMyNC0xNjAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDMyNkA6LG9yZy5lY2xpcHNlLnVpKjMuNC4wLkkyMDA4MDMyOC0xMjA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gqMy40LjAuSTIwMDgwMzI4LTEyMDZAZGVmYXVsdDpkZWZhdWx0LGNvbS5pYm0uaWN1KjMuOC4xLnYyMDA4MDMwNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkqMy4yLjIwMC52MjAwNzA3MTdAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzI0LTE3MjVAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nKjEuMi4wLkkyMDA4MDMyNS0wMTAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5KjEuMC4wLnYyMDA4MDMyNy0xMDAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlKjMuMy4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS53aW4zMi54ODYqMS4wLjAudjIwMDgwMzI0QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCozLjIuMTAwLnYyMDA3MDUwMkBkZWZhdWx0OmRlZmF1bHQiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2KjEuMC4xMDAudjIwMDgwMjAxYUBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcqMS4xLjAuSTIwMDgwMzA0LTA4MDBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2KjEuMC4xMDAudjIwMDgwMjAxYUBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nKjEuMi4wLkkyMDA4MDMwNC0wODAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51aSozLjQuMC5JMjAwODAzMDQtMDgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyozLjQuMC5JMjAwODAzMDQtMDgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuYW50LmNvcmUqMy4yLjAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoKjMuMi4xMDAudjIwMDcwNTAyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZmFjZSozLjQuMC5JMjAwODAzMDQtMDgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5KjMuMi4yMDAudjIwMDcwNzE3QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzKjMuMi4wLnYyMDA3MDkxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuaGVscCozLjMuMTAwLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcioxLjAuMTAwLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lKjMuNC4wLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5uZXQqMS4wLjEwMC5JMjAwODAyMjZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYqMy40LjAudjM0MzJAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zKjMuNC4wLnYyMDA4MDMwNC0wODAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDMwNEA6LG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCozLjQuMC5JMjAwODAzMDQtMDgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uuc3d0KjMuNC4wLnYzNDMyQGRlZmF1bHQ6ZGVmYXVsdCxjb20uaWJtLmljdSozLjguMS52MjAwODAxMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjMuMTAwLnYyMDA4MDIyNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcioxLjAuMTAwLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQiLz4KIDxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+CiA8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IqMC4xLjAucXVhbGlmaWVyQDE6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIqMC4xLjBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjQuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxpZS53b21iYXQuamJkaWZmKjAuMS4wLjFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLnNhdDRqLmNvcmUqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuc2F0NGoucGIqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjEuMy4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyKjAuMS4wQGRlZmF1bHQ6ZGVmYXVsdCxpZS53b21iYXQuamJkaWZmKjAuMS4wLjFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5zYXQ0ai5jb3JlKjIuMC4wLnYyMDA4MDMwN0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmKjEuNC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLnNhdDRqLnBiKjIuMC4wLnYyMDA4MDMwN0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcioxLjYuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yKjAuMS4wLnF1YWxpZmllckAxOnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+CiA8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjZTI2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjAlRm91bmRhdGlvbi0xLjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODI5NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcxMzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0jRnJpIEZlYiAyMiAxMToxNToyNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNzJmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTk6MTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDRiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jU2F0IEF1ZyAxMSAyMDoxNzo1MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWExNGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuNC4wIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsCi0gSjJTRS0xLjMKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZWNoZWNrZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMCkiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyNzg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotCQk8aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0JCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLQkJZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi0JCWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKLQkJdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotCQk8aDQ+RmlsZUluc3RhbGwgMS4wPC9oND4gCi0JCTxwPlRoZSBidW5kbGUgaW5jbHVkZXMgZGVyaXZhdGl2ZSB3b3JrcyBvZiBzb2Z0d2FyZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBQZXRlciBLcmllbnMgKGFRdXRlKS4KLQkJVGhhdCBvcmlnaW5hbCB3b3JrIHdhcyBsaWNlbnNlZCB1bmRlciB0aGUgRVBMIHYxLjAgYW5kIHRoaXMgZGVyaXZhdGl2ZSB3b3JrIGlzIHNpbWlsYXJseSBsaWNlbnNlZC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3N2I5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjU4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIFVwZGF0ZSBDaGVja2VyIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZWNoZWNrZXIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVjaGVja2VyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU2ZjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZWNoZWNrZXIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLklVcGRhdGVDaGVja2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIEFjdGl2YXRvciBjbGFzcyB0aGF0IHJlZ2lzdGVycyB0aGUgdXBkYXRlIGNoZWNrZXIgc2VydmljZS4KLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkNoZWNrZXI7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBidW5kbGVDb250ZXh0OwotCQlyZWdpc3RyYXRpb25DaGVja2VyID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSVVwZGF0ZUNoZWNrZXIuU0VSVklDRV9OQU1FLCBuZXcgVXBkYXRlQ2hlY2tlcigpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdHJhdGlvbkNoZWNrZXIudW5yZWdpc3RlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZWNoZWNrZXIvVXBkYXRlQ2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlY2hlY2tlci9VcGRhdGVDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTEyNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlY2hlY2tlci9VcGRhdGVDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlY2hlY2tlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci4qOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElVcGRhdGVDaGVja2VyfS4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgb3B0aW1pemVkLiAgSXQgZG9lc24ndCBvcHRpbWl6ZSBmb3IgbXVsdGlwbGUKLSAqIHBvbGxzIG9uIHRoZSBzYW1lIHByb2ZpbGUsIG5vciBkb2VzIGl0IGNhY2hlIGFueSBpbmZvIGFib3V0IGEgcHJvZmlsZSBmcm9tCi0gKiBwb2xsIHRvIHBvbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDaGVja2VyIGltcGxlbWVudHMgSVVwZGF0ZUNoZWNrZXIgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBUUkFDRSA9IGZhbHNlOwotCXByaXZhdGUgSGFzaFNldCBjaGVja2VycyA9IG5ldyBIYXNoU2V0KCk7IC8vIHRocmVhZHMKLQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeTsKLQlJUGxhbm5lciBwbGFubmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVDaGVja1RocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlsb25nIHBvbGwsIGRlbGF5OwotCQlJVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCVN0cmluZyBwcm9maWxlSWQ7Ci0JCVF1ZXJ5IHF1ZXJ5OwotCi0JCVVwZGF0ZUNoZWNrVGhyZWFkKFN0cmluZyBwcm9maWxlSWQsIFF1ZXJ5IHF1ZXJ5LCBsb25nIGRlbGF5LCBsb25nIHBvbGwsIElVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5wb2xsID0gcG9sbDsKLQkJCXRoaXMuZGVsYXkgPSBkZWxheTsKLQkJCXRoaXMucHJvZmlsZUlkID0gcHJvZmlsZUlkOwotCQkJdGhpcy5xdWVyeSA9IHF1ZXJ5OwotCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVsYXkgIT0gT05FX1RJTUVfQ0hFQ0sgJiYgZGVsYXkgPiAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJfQotCQkJCXdoaWxlICghZG9uZSkgewotCi0JCQkJCWxvZygiQ2hlY2tpbmcgZm9yIHVwZGF0ZXMgZm9yICIgKyBwcm9maWxlSWQgKyAiIGF0ICIgKyBnZXRUaW1lU3RhbXAoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJSW5zdGFsbGFibGVVbml0W10gaXVzV2l0aFVwZGF0ZXMgPSBjaGVja0ZvclVwZGF0ZXMocHJvZmlsZUlkLCBxdWVyeSk7Ci0JCQkJCWlmIChpdXNXaXRoVXBkYXRlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlsb2coIk5vdGlmeWluZyBsaXN0ZW5lciBvZiBhdmFpbGFibGUgdXBkYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlVcGRhdGVFdmVudCBldmVudCA9IG5ldyBVcGRhdGVFdmVudChwcm9maWxlSWQsIGl1c1dpdGhVcGRhdGVzKTsKLQkJCQkJCWlmICghZG9uZSkKLQkJCQkJCQlsaXN0ZW5lci51cGRhdGVzQXZhaWxhYmxlKGV2ZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxvZygiTm8gdXBkYXRlcyB3ZXJlIGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGRlbGF5ID09IE9ORV9USU1FX0NIRUNLIHx8IGRlbGF5IDw9IDApIHsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVGhyZWFkLnNsZWVwKHBvbGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKCJFeGNlcHRpb24gaW4gdXBkYXRlIGNoZWNrIHRocmVhZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuSVVwZGF0ZUNoZWNrZXIjYWRkVXBkYXRlQ2hlY2soamF2YS5sYW5nLlN0cmluZywgbG9uZywgbG9uZywgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLklVcGRhdGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRVcGRhdGVDaGVjayhTdHJpbmcgcHJvZmlsZUlkLCBRdWVyeSBxdWVyeSwgbG9uZyBkZWxheSwgbG9uZyBwb2xsLCBJVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbG9nKCJBZGRpbmcgdXBkYXRlIGNoZWNrZXIgZm9yICIgKyBwcm9maWxlSWQgKyAiIGF0ICIgKyBnZXRUaW1lU3RhbXAoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlVcGRhdGVDaGVja1RocmVhZCB0aHJlYWQgPSBuZXcgVXBkYXRlQ2hlY2tUaHJlYWQocHJvZmlsZUlkLCBxdWVyeSwgZGVsYXksIHBvbGwsIGxpc3RlbmVyKTsKLQkJY2hlY2tlcnMuYWRkKHRocmVhZCk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5JVXBkYXRlQ2hlY2tlciNyZW1vdmVVcGRhdGVDaGVjayhvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuSVVwZGF0ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZUNoZWNrKElVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlJdGVyYXRvciBpdGVyID0gY2hlY2tlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlVcGRhdGVDaGVja1RocmVhZCB0aHJlYWQgPSAoVXBkYXRlQ2hlY2tUaHJlYWQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHRocmVhZC5saXN0ZW5lciA9PSBsaXN0ZW5lcikgewotCQkJCXRocmVhZC5kb25lID0gdHJ1ZTsKLQkJCQljaGVja2Vycy5yZW1vdmUodGhyZWFkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBhcnJheSBvZiBpdXMgaW4gdGhlIHByb2ZpbGUgdGhhdCBoYXZlIHVwZGF0ZXMKLQkgKiBhdmFpbGFibGUuCi0JICovCi0JSUluc3RhbGxhYmxlVW5pdFtdIGNoZWNrRm9yVXBkYXRlcyhTdHJpbmcgcHJvZmlsZUlkLCBRdWVyeSBxdWVyeSkgewotCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvZmlsZVJlZ2lzdHJ5KCkuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQlBcnJheUxpc3QgaXVzV2l0aFVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9maWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0JCVByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQcm92aXNpb25pbmdDb250ZXh0KGdldEF2YWlsYWJsZVJlcG9zaXRvcmllcygpKTsKLQkJaWYgKHF1ZXJ5ID09IG51bGwpCi0JCQlxdWVyeSA9IEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWTsKLQkJSXRlcmF0b3IgaXRlciA9IHByb2ZpbGUucXVlcnkocXVlcnksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXIubmV4dCgpOwotCQkJSUluc3RhbGxhYmxlVW5pdFtdIHJlcGxhY2VtZW50cyA9IGdldFBsYW5uZXIoKS51cGRhdGVzRm9yKGl1LCBjb250ZXh0LCBudWxsKTsKLQkJCWlmIChyZXBsYWNlbWVudHMubGVuZ3RoID4gMCkKLQkJCQlpdXNXaXRoVXBkYXRlcy5hZGQoaXUpOwotCQl9Ci0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdFtdKSBpdXNXaXRoVXBkYXRlcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1c1dpdGhVcGRhdGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgcmVwb3NpdG9yaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUuCi0JICovCi0JcHJpdmF0ZSBVUkxbXSBnZXRBdmFpbGFibGVSZXBvc2l0b3JpZXMoKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NZ3IgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkxbXSByZXBvc2l0b3JpZXMgPSByZXBvTWdyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpOwotCQlBcnJheUxpc3QgYXZhaWxhYmxlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlyZXBvTWdyLmxvYWRSZXBvc2l0b3J5KHJlcG9zaXRvcmllc1tpXSwgbnVsbCk7Ci0JCQkJYXZhaWxhYmxlLmFkZChyZXBvc2l0b3JpZXNbaV0pOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZSB1bmF2YWlsYWJsZSByZXBvc2l0b3J5Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVUkxbXSkgYXZhaWxhYmxlLnRvQXJyYXkobmV3IFVSTFthdmFpbGFibGUuc2l6ZSgpXSk7Ci0JfQotCi0Jdm9pZCBsb2coU3RyaW5nIHN0cmluZywgVGhyb3dhYmxlIGUpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKHN0cmluZyArICI6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoREVCVUcpCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQotCXZvaWQgbG9nKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKFRSQUNFKQotCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmluZyk7Ci0JfQotCi0JU3RyaW5nIGdldFRpbWVTdGFtcCgpIHsKLQkJRGF0ZSBkID0gbmV3IERhdGUoKTsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJbTU0vZGQveXk7SEg6bW06c3M6U1NTXSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZi5mb3JtYXQoZCk7Ci0JfQotCi0JSVBsYW5uZXIgZ2V0UGxhbm5lcigpIHsKLQkJaWYgKHBsYW5uZXIgPT0gbnVsbCkgewotCQkJcGxhbm5lciA9IChJUGxhbm5lcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAocGxhbm5lciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvdmlzaW9uaW5nIHN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBwbGFubmVyOwotCX0KLQotCUlQcm9maWxlUmVnaXN0cnkgZ2V0UHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCXByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKHByb2ZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvdmlzaW9uaW5nIHN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9maWxlUmVnaXN0cnk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL0lVcGRhdGVDaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL0lVcGRhdGVDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDNkNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdXBkYXRlY2hlY2tlci9JVXBkYXRlQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotCi0vKioKLSAqIEFuIFVwZGF0ZUNoZWNrZXIgcGVyaW9kaWNhbGx5IHBvbGxzIGZvciB1cGRhdGVzIHRvIHNwZWNpZmllZCBwcm9maWxlcyBhbmQKLSAqIGluZm9ybXMgbGlzdGVuZXJzIGlmIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIExpc3RlbmVycyBtYXkgdGhlbiBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZXMsIGluZm9ybSB0aGUgdXNlciwgZXRjLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVDaGVja2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBJVXBkYXRlQ2hlY2tlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBsb25nIE9ORV9USU1FX0NIRUNLID0gLTFMOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVXBkYXRlQ2hlY2soU3RyaW5nIHByb2ZpbGVJZCwgUXVlcnkgaXVzVG9DaGVja1F1ZXJ5LCBsb25nIGRlbGF5LCBsb25nIHBvbGwsIElVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVVcGRhdGVDaGVjayhJVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdXBkYXRlY2hlY2tlci9JVXBkYXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VwZGF0ZWNoZWNrZXIvSVVwZGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGU2MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdXBkYXRlY2hlY2tlci9JVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXI7Ci0KLS8qKgotICogQW4gSVVwZGF0ZUxpc3RlbmVyIGluZm9ybXMgbGlzdGVuZXJzIHRoYXQgYW4gdXBkYXRlIGlzIGF2YWlsYWJsZSBmb3IKLSAqIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS4gIExpc3RlbmVycyBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24KLSAqIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgdXBkYXRlc0F2YWlsYWJsZShVcGRhdGVFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL1VwZGF0ZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL1VwZGF0ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4N2IzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdXBkYXRlY2hlY2tlci9VcGRhdGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotLyoqCi0gKiBBbiBVcGRhdGVFdmVudCBkZXNjcmliZXMgd2hhdCBJVSdzIGhhdmUgdXBkYXRlcyBmb3IgYSBnaXZlbiBwcm9maWxlLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlRXZlbnQgewotCi0JU3RyaW5nIHByb2ZpbGVJZDsKLQlJSW5zdGFsbGFibGVVbml0W10gaXVzV2l0aFVwZGF0ZXM7Ci0KLQlwdWJsaWMgVXBkYXRlRXZlbnQoU3RyaW5nIHByb2ZpbGVJZCwgSUluc3RhbGxhYmxlVW5pdFtdIGl1c1dpdGhVcGRhdGVzKSB7Ci0JCXRoaXMucHJvZmlsZUlkID0gcHJvZmlsZUlkOwotCQl0aGlzLml1c1dpdGhVcGRhdGVzID0gaXVzV2l0aFVwZGF0ZXM7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXSBnZXRJVXMoKSB7Ci0JCXJldHVybiBpdXNXaXRoVXBkYXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZCgpIHsKLQkJcmV0dXJuIHByb2ZpbGVJZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYzdhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMCVGb3VuZGF0aW9uLTEuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2NTdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiNGQ0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0jV2VkIEphbiAyMyAxMDowMDozMyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg0ZDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU5OjQ4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODBmYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IuQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3JtYW5pcHVsYXRvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IjMuNC4wIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzJlNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXF1YWxpZmllcj1jb250ZXh0Ci1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhZmJkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYnVuZGxlTmFtZT0gU2ltcGxlIENvbmZpZ3VyYXRvciBNYW5pcHVsYXRvcgotcHJvdmlkZXJOYW1lPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEwMjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzLlNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCWZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZVRyYWNrZXIgaW5zdGFsbExvY2F0aW9uVHJhY2tlcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uOwotCVNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbCBtYW5pcHVsYXRvciA9IG51bGw7Ci0KLQlzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpIHsKLQkJRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLlNFUlZJQ0VfUFJPUF9LRVlfQ09ORklHVVJBVE9SX0JVTkRMRVNZTUJPTElDTkFNRSwgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlNFUlZJQ0VfUFJPUF9WQUxVRV9DT05GSUdVUkFUT1JfU1lNQk9MSUNOQU1FKTsKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1ZFTkRPUiwgIkVjbGlwc2Uub3JnIik7Ci0JCW1hbmlwdWxhdG9yID0gbmV3IFNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbCgpOwotCQlyZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb25maWd1cmF0b3JNYW5pcHVsYXRvci5jbGFzcy5nZXROYW1lKCksIG1hbmlwdWxhdG9yLCBwcm9wcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBidW5kbGVDb250ZXh0OwotCQl0aGlzLnJlZ2lzdGVyQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChyZWdpc3RyYXRpb24gIT0gbnVsbCkKLQkJCXJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCWlmIChpbnN0YWxsTG9jYXRpb25UcmFja2VyICE9IG51bGwpIHsKLQkJCWluc3RhbGxMb2NhdGlvblRyYWNrZXIuY2xvc2UoKTsKLQkJCWluc3RhbGxMb2NhdGlvblRyYWNrZXIgPSBudWxsOwotCQl9Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTlhYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvbWFuaXB1bGF0b3IvU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3JtYW5pcHVsYXRvci5Db25maWd1cmF0b3JNYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeUltcGwgZXh0ZW5kcyBDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvbWFuaXB1bGF0b3IvU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNGEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlscy5TaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbCBpbXBsZW1lbnRzIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIHsKLQljbGFzcyBMb2NhdGlvbkluZm8gewotCQlTdHJpbmdbXSBwcmVyZXF1aXNpdGVMb2NhdGlvbnMgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtQnVuZGxlTG9jYXRpb24gPSBudWxsOwotCQlTdHJpbmdbXSBzeXN0ZW1GcmFnbWVudGVkQnVuZGxlTG9jYXRpb25zID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQlzdGF0aWMgU3RyaW5nIENPTkZJR19MT0NBVElPTiA9IFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5DT05GSUdfTElTVDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJ1bmRsZUluZm9bXSBOVUxMX0JVTkRMRUlORk9TID0gbmV3IEJ1bmRsZUluZm9bMF07Ci0KLQlwcml2YXRlIFNldCBtYW5pcHVsYXRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCQotCSAqIFJldHVybiB0aGUgQ29uZmlndXJhdG9yQ29uZmlnTG9jYXRpb24gd2hpY2ggaXMgZGV0ZXJtaW5lZCAKLQkgKiBieSB0aGUgcGFyYW1ldGVycyBzZXQgaW4gTWFuaXB1bGF0b3IuIAotCSAqIAotCSAqIEBwYXJhbSBtYW5pcHVsYXRvcgotCSAqIEByZXR1cm4gVVJMCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGdldENvbmZpZ0xvY2F0aW9uKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJRmlsZSBmd0NvbmZpZ0xvYyA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldEZ3Q29uZmlnTG9jYXRpb24oKTsKLQkJRmlsZSBiYXNlRGlyID0gbnVsbDsKLQkJaWYgKGZ3Q29uZmlnTG9jID09IG51bGwpIHsKLQkJCWJhc2VEaXIgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRIb21lKCk7Ci0JCQlpZiAoYmFzZURpciA9PSBudWxsKSB7Ci0JCQkJaWYgKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldExhdW5jaGVyKCkgIT0gbnVsbCkgewotCQkJCQliYXNlRGlyID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxsIG9mIGZ3Q29uZmlnRmlsZSwgaG9tZSwgbGF1bmNoZXIgYXJlIG5vdCBzZXQuIik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZ3Q29uZmlnTG9jLmV4aXN0cygpKQotCQkJCWlmIChmd0NvbmZpZ0xvYy5pc0RpcmVjdG9yeSgpKQotCQkJCQliYXNlRGlyID0gZndDb25maWdMb2M7Ci0JCQkJZWxzZQotCQkJCQliYXNlRGlyID0gZndDb25maWdMb2MuZ2V0UGFyZW50RmlsZSgpOwotCQkJZWxzZSB7Ci0JCQkJLy8gVE9ETyBXZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIGxhdW5jaGVyIGRhdGEgY29uZmlnTG9jYXRpb24gaXMgdGhlIGxvY2F0aW9uIG9mIGEgZmlsZSBvciBhIGRpcmVjdG9yeSAKLQkJCQlpZiAoZndDb25maWdMb2MuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuaW5pIikpCi0JCQkJCWJhc2VEaXIgPSBmd0NvbmZpZ0xvYy5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJZWxzZQotCQkJCQliYXNlRGlyID0gZndDb25maWdMb2M7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWJhc2VEaXIgPSBuZXcgRmlsZShiYXNlRGlyLCBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuQ09ORklHVVJBVE9SX0ZPTERFUik7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuQ09ORklHX0xJU1QpOwotCQkJdHJ5IHsKLQkJCQlVdGlscy5jcmVhdGVQYXJlbnREaXIodGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0RmlsZS50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gTmV2ZXIgaGFwcGVuLiBpZ25vcmUuCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzUHJlcmVxdWlzaXRlQnVuZGxlcyhTdHJpbmcgbG9jYXRpb24sIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0KLQkJaWYgKGluZm8ucHJlcmVxdWlzaXRlTG9jYXRpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5wcmVyZXF1aXNpdGVMb2NhdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAobG9jYXRpb24uZXF1YWxzKGluZm8ucHJlcmVxdWlzaXRlTG9jYXRpb25zW2ldKSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbUJ1bmRsZShTdHJpbmcgbG9jYXRpb24sIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvLnN5c3RlbUJ1bmRsZUxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsb2NhdGlvbi5lcXVhbHMoaW5mby5zeXN0ZW1CdW5kbGVMb2NhdGlvbikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzU3lzdGVtRnJhZ21lbnRCdW5kbGUoU3RyaW5nIGxvY2F0aW9uLCBMb2NhdGlvbkluZm8gaW5mbykgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlpZiAoaW5mby5zeXN0ZW1GcmFnbWVudGVkQnVuZGxlTG9jYXRpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5zeXN0ZW1GcmFnbWVudGVkQnVuZGxlTG9jYXRpb25zLmxlbmd0aDsgaSsrKQotCQkJaWYgKGxvY2F0aW9uLmVxdWFscyhpbmZvLnN5c3RlbUZyYWdtZW50ZWRCdW5kbGVMb2NhdGlvbnNbaV0pKSB7Ci0JCQkJcmV0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0Q29uZmlndXJhdG9yQnVuZGxlKEJ1bmRsZUluZm9bXSBiSW5mb3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1RhcmdldENvbmZpZ3VyYXRvckJ1bmRsZShiSW5mb3NbaV0uZ2V0TG9jYXRpb24oKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkvL1RPRE8gY29uZmlybSB0aGF0IHN0YXJ0bGV2ZWwgb2YgY29uZmlndXJhdG9yIGJ1bmRsZSBtdXN0IGJlIG5vIGxhcmdlciB0aGFuIGJlZ2lubmluZyBzdGFydCBsZXZlbCBvZiBmdy4gSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhlIHN0YXJ0IGxldmVsIG9mIGNhY2hlZCBvbmVzLgotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0Q29uZmlndXJhdG9yQnVuZGxlKFN0cmluZyBsb2NhdGlvbikgewotCQlmaW5hbCBTdHJpbmcgc3ltYm9saWMgPSBVdGlscy5nZXRQYXRoRnJvbUNsYXVzZShVdGlscy5nZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpOwotCQlyZXR1cm4gKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5TRVJWSUNFX1BST1BfVkFMVUVfQ09ORklHVVJBVE9SX1NZTUJPTElDTkFNRS5lcXVhbHMoc3ltYm9saWMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWxnb3JpdGhtKGludCBpbml0aWFsU2wsIFNvcnRlZE1hcCBic2xUb0xpc3QsIEJ1bmRsZUluZm8gY29uZmlndXJhdG9yQkluZm8sIExpc3Qgc2V0VG9Jbml0aWFsQ29uZmlnLCBMaXN0IHNldFRvU2ltcGxlQ29uZmlnLCBMb2NhdGlvbkluZm8gaW5mbykgewotCQlpbnQgY29uZmlndXJhdG9yU0wgPSBjb25maWd1cmF0b3JCSW5mby5nZXRTdGFydExldmVsKCk7Ci0KLQkJSW50ZWdlciBzTDAgPSAoSW50ZWdlcikgYnNsVG9MaXN0LmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOy8vIFN0YXJ0TGV2ZWwgPT0gMDsKLQkJTGlzdCBsaXN0MCA9IChMaXN0KSBic2xUb0xpc3QuZ2V0KHNMMCk7Ci0JCWlmIChzTDAuaW50VmFsdWUoKSA9PSAwKQotCQkJZm9yIChJdGVyYXRvciBpdGUyID0gbGlzdDAuaXRlcmF0b3IoKTsgaXRlMi5oYXNOZXh0KCk7KSB7Ci0JCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUyLm5leHQoKTsKLQkJCQlpZiAoaXNTeXN0ZW1CdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpIHsKLQkJCQkJc2V0VG9TaW1wbGVDb25maWcuYWRkKGJJbmZvKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlID0gYnNsVG9MaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIHNMID0gKEludGVnZXIpIGl0ZS5uZXh0KCk7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgYnNsVG9MaXN0LmdldChzTCk7Ci0KLQkJCWlmIChzTC5pbnRWYWx1ZSgpIDwgY29uZmlndXJhdG9yU0wpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZTIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZTIuaGFzTmV4dCgpOykgewotCQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZTIubmV4dCgpOwotCQkJCQlpZiAoIWlzU3lzdGVtQnVuZGxlKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pKQotCQkJCQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzTC5pbnRWYWx1ZSgpID4gY29uZmlndXJhdG9yU0wpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZTIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZTIuaGFzTmV4dCgpOykgewotCQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZTIubmV4dCgpOwotCQkJCQlpZiAoaXNQcmVyZXF1aXNpdGVCdW5kbGVzKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pIHx8IGlzU3lzdGVtRnJhZ21lbnRCdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpCi0JCQkJCQlpZiAoIWlzU3lzdGVtQnVuZGxlKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pKQotCQkJCQkJCXNldFRvSW5pdGlhbENvbmZpZy5hZGQoYkluZm8pOwotCQkJCQlzZXRUb1NpbXBsZUNvbmZpZy5hZGQoYkluZm8pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlMiA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlMi5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlMi5uZXh0KCk7Ci0JCQkJCWlmIChmb3VuZCkgewotCQkJCQkJaWYgKCFpc1N5c3RlbUJ1bmRsZShiSW5mby5nZXRMb2NhdGlvbigpLCBpbmZvKSkKLQkJCQkJCQlpZiAoaXNQcmVyZXF1aXNpdGVCdW5kbGVzKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pIHx8IGlzU3lzdGVtRnJhZ21lbnRCdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpCi0JCQkJCQkJCXNldFRvSW5pdGlhbENvbmZpZy5hZGQoYkluZm8pOwotCQkJCQkJc2V0VG9TaW1wbGVDb25maWcuYWRkKGJJbmZvKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChpc1RhcmdldENvbmZpZ3VyYXRvckJ1bmRsZShiSW5mby5nZXRMb2NhdGlvbigpKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJZWxzZSBpZiAoIWlzU3lzdGVtQnVuZGxlKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pKQotCQkJCQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJCXNldFRvU2ltcGxlQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZChjb25maWd1cmF0b3JCSW5mbyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVzb2x2ZShCdW5kbGVJbmZvIGJJbmZvLCBCdW5kbGVzU3RhdGUgc3RhdGUpIHsvL3Rocm93cyBNYW5pcHVsYXRvckV4Y2VwdGlvbiB7Ci0JCWlmIChiSW5mbyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYkluZm8gaXMgbnVsbC4iKTsKLQotCQlpZiAoIXN0YXRlLmlzUmVzb2x2ZWQoKSkKLQkJCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCQkvLwkJaWYgKERFQlVHKQotCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZS50b1N0cmluZygpKTsKLQotCQlpZiAoIXN0YXRlLmlzUmVzb2x2ZWQoYkluZm8pKSB7Ci0JCQlwcmludG91dFVuc2F0aXNmaWVkQ29uc3RyYWludHMoYkluZm8sIHN0YXRlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGl2aWRlQnVuZGxlSW5mb3MoTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIExpc3Qgc2V0VG9Jbml0aWFsQ29uZmlnLCBMaXN0IHNldFRvU2ltcGxlQ29uZmlnLCBmaW5hbCBpbnQgaW5pdGlhbEJTTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVuZGxlc1N0YXRlIHN0YXRlID0gbWFuaXB1bGF0b3IuZ2V0QnVuZGxlc1N0YXRlKCk7Ci0JCUJ1bmRsZUluZm9bXSB0YXJnZXRCdW5kbGVJbmZvcyA9IG51bGw7Ci0JCWlmIChzdGF0ZS5pc0Z1bGx5U3VwcG9ydGVkKCkpIHsKLQkJCXRhcmdldEJ1bmRsZUluZm9zID0gc3RhdGUuZ2V0RXhwZWN0ZWRTdGF0ZSgpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0QnVuZGxlSW5mb3MgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQl9Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQkluZm8gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldEJ1bmRsZUluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNUYXJnZXRDb25maWd1cmF0b3JCdW5kbGUodGFyZ2V0QnVuZGxlSW5mb3NbaV0uZ2V0TG9jYXRpb24oKSkpIHsKLQkJCQlpZiAodGFyZ2V0QnVuZGxlSW5mb3NbaV0uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkgewotCQkJCQljb25maWd1cmF0b3JCSW5mbyA9IHRhcmdldEJ1bmRsZUluZm9zW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRvckJJbmZvID09IG51bGwgJiYgIW1hbmlwdWxhdG9ycy5jb250YWlucyhtYW5pcHVsYXRvcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChtYW5pcHVsYXRvcnMuY29udGFpbnMobWFuaXB1bGF0b3IpICYmIHRhcmdldEJ1bmRsZUluZm9zLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBSZXN1bHRpbmcgc3RhdGUgd2lsbCBoYXZlIG5vIGJ1bmRsZXMgLSBzbyBpcyBhbiB1bmluc3RhbGwsIGluY2x1ZGluZwotCQkJLy8gdW5pbnN0YWxsIG9mIHRoZSBjb25maWd1cmF0b3IuIEhvd2V2ZXIsIHdlIGhhdmUgc2VlbiB0aGlzIG1hbmlwdWxhdG9yCi0JCQkvLyBiZWZvcmUgd2l0aCBhIHRhcmdldCBjb25maWd1cmF0b3IgYnVuZGxlLCBzbyBhbGxvdyB1bmluc3RhbGwgdG8gcHJvY2VlZCwKLQkJCS8vIGJ1dCBvbmx5IGdldCBvbmUgY2hhbmNlLgotCQkJbWFuaXB1bGF0b3JzLnJlbW92ZShtYW5pcHVsYXRvcik7Ci0JCX0gZWxzZSBpZiAoIW1hbmlwdWxhdG9ycy5jb250YWlucyhtYW5pcHVsYXRvcikpIHsKLQkJCW1hbmlwdWxhdG9ycy5hZGQobWFuaXB1bGF0b3IpOwotCQl9Ci0KLQkJaWYgKHN0YXRlLmlzRnVsbHlTdXBwb3J0ZWQoKSkgewotCQkJc3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0JCX0KLQotCQlMb2NhdGlvbkluZm8gaW5mbyA9IG5ldyBMb2NhdGlvbkluZm8oKTsKLQkJc2V0U3lzdGVtQnVuZGxlcyhzdGF0ZSwgaW5mbyk7Ci0JCWlmIChjb25maWd1cmF0b3JCSW5mbyAhPSBudWxsKSB7Ci0JCQlzZXRQcmVyZXF1aXNpdGVCdW5kbGVzKGNvbmZpZ3VyYXRvckJJbmZvLCBzdGF0ZSwgaW5mbyk7Ci0JCQlTb3J0ZWRNYXAgYnNsVG9MaXN0ID0gZ2V0U29ydGVkTWFwKGluaXRpYWxCU0wsIHRhcmdldEJ1bmRsZUluZm9zKTsKLQkJCWFsZ29yaXRobShpbml0aWFsQlNMLCBic2xUb0xpc3QsIGNvbmZpZ3VyYXRvckJJbmZvLCBzZXRUb0luaXRpYWxDb25maWcsIHNldFRvU2ltcGxlQ29uZmlnLCBpbmZvKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZE1hcCBnZXRTb3J0ZWRNYXAoaW50IGluaXRpYWxTbCwgQnVuZGxlSW5mb1tdIGJJbmZvcykgewotCQlTb3J0ZWRNYXAgYnNsVG9MaXN0ID0gbmV3IFRyZWVNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCUludGVnZXIgc0wgPSBuZXcgSW50ZWdlcihiSW5mb3NbaV0uZ2V0U3RhcnRMZXZlbCgpKTsKLQkJCWlmIChzTC5pbnRWYWx1ZSgpID09IEJ1bmRsZUluZm8uTk9fTEVWRUwpCi0JCQkJc0wgPSBuZXcgSW50ZWdlcihpbml0aWFsU2wpOwotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGJzbFRvTGlzdC5nZXQoc0wpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJCWJzbFRvTGlzdC5wdXQoc0wsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQoYkluZm9zW2ldKTsKLQkJfQotCQlyZXR1cm4gYnNsVG9MaXN0OwotCX0KLQotCXByaXZhdGUgQnVuZGxlSW5mb1tdIG9yZGVyaW5nSW5pdGlhbENvbmZpZyhMaXN0IHNldFRvSW5pdGlhbENvbmZpZykgewotCQlMaXN0IG5vdFRvQmVTdGFydGVkID0gbmV3IExpbmtlZExpc3QoKTsKLQkJTGlzdCB0b0JlU3RhcnRlZCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlMiA9IHNldFRvSW5pdGlhbENvbmZpZy5pdGVyYXRvcigpOyBpdGUyLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlMi5uZXh0KCk7Ci0JCQlpZiAoYkluZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkKLQkJCQl0b0JlU3RhcnRlZC5hZGQoYkluZm8pOwotCQkJZWxzZQotCQkJCW5vdFRvQmVTdGFydGVkLmFkZChiSW5mbyk7Ci0JCX0KLQkJc2V0VG9Jbml0aWFsQ29uZmlnLmNsZWFyKCk7Ci0JCXNldFRvSW5pdGlhbENvbmZpZy5hZGRBbGwobm90VG9CZVN0YXJ0ZWQpOwotCQlzZXRUb0luaXRpYWxDb25maWcuYWRkQWxsKHRvQmVTdGFydGVkKTsKLQkJcmV0dXJuIFV0aWxzLmdldEJ1bmRsZUluZm9zRnJvbUxpc3Qoc2V0VG9Jbml0aWFsQ29uZmlnKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludG91dFVuc2F0aXNmaWVkQ29uc3RyYWludHMoQnVuZGxlSW5mbyBiSW5mbywgQnVuZGxlc1N0YXRlIHN0YXRlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKCJNaXNzaW5nIGNvbnN0cmFpbnRzOlxuIik7Ci0JCQlTdHJpbmdbXSBtaXNzaW5ncyA9IHN0YXRlLmdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoYkluZm8pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5ncy5sZW5ndGg7IGkrKykKLQkJCQlzYi5hcHBlbmQoIiAiICsgbWlzc2luZ3NbaV0gKyAiXG4iKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQnVuZGxlSW5mb1tdIGxvYWRDb25maWd1cmF0aW9uKFVSTCB1cmwsIEZpbGUgbGF1bmNoZXJMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIE5VTExfQlVORExFSU5GT1M7Ci0KLQkJdHJ5IHsKLQkJCXVybC5vcGVuU3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTlVMTF9CVU5ETEVJTkZPUzsKLQkJfQotCi0JCUxpc3QgYnVuZGxlSW5mb0xpc3QgPSByZWFkQ29uZmlndXJhdGlvbih1cmwsIGxhdW5jaGVyTG9jYXRpb24pOwotCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdChidW5kbGVJbmZvTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY29waWVkIGZyb20gU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlYWRDb25maWd1cmF0aW9uKFVSTCB1cmwsIEZpbGUgYmFzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGlzdCBidW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZWFkQ29uZmlndXJhdGlvbihVUkwgdXJsKTp1cmwoKT0iICsgdXJsKTsKLQkJCS8vIFVSTCBjb25maWdGaWxlVXJsID0gZ2V0Q29uZmlnRmlsZVVybCgpOwotCQkJLy8gVVJMIGNvbmZpZ0ZpbGVVcmwgPSBVdGlscy5nZXRVcmwoImZpbGUiLG51bGwsCi0JCQkvLyBpbnB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSkpOwotCQkJLy8gQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihpbnB1dEZpbGUpKTsKLQotCQkJU3RyaW5nIGxpbmU7Ci0JCQl0cnkgewotCQkJCVVSTCBiYXNlVXJsID0gbmV3IFVSTCh1cmwsICIuLyIpOwotCQkJCXdoaWxlICgobGluZSA9IHIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKCIjIikpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbGluZSA9IGxpbmUudHJpbSgpOy8vIHN5bWJvbGljTmFtZSx2ZXJzaW9uLGxvY2F0aW9uLHN0YXJ0bGV2ZWwsZXhwZWN0ZWRTdGF0ZQotCQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gKGV4cGVjdGVkU3RhdGUgaXMgYW4gaW50ZWdlcikuCi0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lPSIgKyBsaW5lKTsKLQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aChTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuUEFSQU1FVEVSX0JBU0VVUkwgKyAiPSIpKSB7Ci0JCQkJCQlTdHJpbmcgYmFzZVVybFN0ID0gbGluZS5zdWJzdHJpbmcoKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QQVJBTUVURVJfQkFTRVVSTCArICI9IikubGVuZ3RoKCkpOwotCQkJCQkJaWYgKCFiYXNlVXJsU3QuZW5kc1dpdGgoIi8iKSkKLQkJCQkJCQliYXNlVXJsU3QgKz0gIi8iOwotCQkJCQkJYmFzZVVybCA9IG5ldyBVUkwodXJsLCBiYXNlVXJsU3QpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiLCB0cnVlKTsKLQkJCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoIiwiKSkKLQkJCQkJCXN5bWJvbGljTmFtZSA9IG51bGw7Ci0JCQkJCWVsc2UKLQkJCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAotCi0JCQkJCVN0cmluZyB2ZXJzaW9uID0gdG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIiwiKSkKLQkJCQkJCXZlcnNpb24gPSBudWxsOwotCQkJCQllbHNlCi0JCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQotCQkJCQlTdHJpbmcgdXJsU3QgPSB0b2submV4dFRva2VuKCk7Ci0JCQkJCWlmICh1cmxTdC5lcXVhbHMoIiwiKSkgewotCQkJCQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsICYmIHZlcnNpb24gIT0gbnVsbCkKLQkJCQkJCQl1cmxTdCA9IHN5bWJvbGljTmFtZSArICJfIiArIHZlcnNpb24gKyAiLmphciI7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdXJsU3QgPSBudWxsOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAotCQkJCQl0cnkgewotCQkJCQkJbmV3IFVSTCh1cmxTdCk7Ci0JCQkJCQkvLwkJCQkJCWlmIChERUJVRykKLQkJCQkJCS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiMSB1cmxTdD0iICsgdXJsU3QpOwotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJdXJsU3QgPSBVdGlscy5nZXRVcmxJbkZ1bGwodXJsU3QsIGJhc2VVcmwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCQkvLwkJCQkJCWlmIChERUJVRykKLQkJCQkJCS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiMiB1cmxTdD0iICsgdXJsU3QpOwotCQkJCQl9Ci0KLQkJCQkJaW50IHNsID0gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkudHJpbSgpKTsKLQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0JCQkJCWJvb2xlYW4gbWFya2VkQXNTdGFydGVkID0gQm9vbGVhbi52YWx1ZU9mKHRvay5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCS8vIFVSTCB1cmxCdW5kbGUgPSBudWxsOwotCQkJCQkvLyB0cnkgewotCQkJCQkvLyB1cmxCdW5kbGUgPSBuZXcgVVJMKHVybFN0KTsKLQkJCQkJLy8gfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdXJsQnVuZGxlID0gVXRpbHMuZ2V0RnVsbFVybCh1cmxTdCwgYmFzZVVybCk7Ci0JCQkJCS8vIH0KLQotCQkJCQl1cmxTdCA9IG1ha2VBYnNvbHV0ZSh1cmxTdCwgYmFzZSAhPSBudWxsID8gYmFzZS50b1VSTCgpIDogbnVsbCk7Ci0JCQkJCUJ1bmRsZUluZm8gYkluZm8gPSBuZXcgQnVuZGxlSW5mbyhzeW1ib2xpY05hbWUsIHZlcnNpb24sIHVybFN0LCBzbCwgbWFya2VkQXNTdGFydGVkKTsKLQkJCQkJYnVuZGxlcy5hZGQoYkluZm8pOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhaWwgbGluZT0iICsgbGluZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIFRPRE8gbG9nIHNvbWV0aGluZwotCQkJLy8gYnVuZGxlSW5mb3MgPSBOVUxMX0JVTkRMRUlORk9TOwotCQl9Ci0JCXJldHVybiBidW5kbGVzOwotCQkvLyBidW5kbGVJbmZvcyA9IChCdW5kbGVJbmZvW10pIGJ1bmRsZXMudG9BcnJheShuZXcKLQkJLy8gQnVuZGxlSW5mb1tidW5kbGVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gc2F2ZShNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxpc3Qgc2V0VG9Jbml0aWFsQ29uZmlnID0gbmV3IExpbmtlZExpc3QoKTsKLQkJTGlzdCBzZXRUb1NpbXBsZUNvbmZpZyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQotCQkvL3RyeSB7Ci0JCWlmICghZGl2aWRlQnVuZGxlSW5mb3MobWFuaXB1bGF0b3IsIHNldFRvSW5pdGlhbENvbmZpZywgc2V0VG9TaW1wbGVDb25maWcsIGNvbmZpZ0RhdGEuZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKSkpCi0JCQlyZXR1cm4gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCS8vfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJLy8JZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJLy8JU3lzdGVtLmV4aXQoLTEpOwotCQkvL30KLQkJLy8JCWlmIChERUJVRykgewotCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigic2V0VG9Jbml0aWFsQ29uZmlnPVxuIiArIFNpbXBsZUNvbmZpZ3VyYXRvclV0aWxzLmdldExpc3RTdChzZXRUb0luaXRpYWxDb25maWcpKTsKLQkJLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNldFRvU2ltcGxlQ29uZmlnPVxuIiArIFNpbXBsZUNvbmZpZ3VyYXRvclV0aWxzLmdldExpc3RTdChzZXRUb1NpbXBsZUNvbmZpZykpOwotCQkvLwkJfQotCQlVUkwgY29uZmlndXJhdG9yQ29uZmlnVXJsID0gZ2V0Q29uZmlnTG9jYXRpb24obWFuaXB1bGF0b3IpOwotCQlpZiAoIWNvbmZpZ3VyYXRvckNvbmZpZ1VybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQotCQkJbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29uZmlndXJhdG9yQ29uZmlnVXJsIHNob3VsZCBzdGFydCB3aXRoIFwiZmlsZVwiLlxuY29uZmlndXJhdG9yQ29uZmlnVXJsPSIgKyBjb25maWd1cmF0b3JDb25maWdVcmwpOwotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShjb25maWd1cmF0b3JDb25maWdVcmwuZ2V0RmlsZSgpKTsKLQkJc2F2ZUNvbmZpZ3VyYXRpb24oc2V0VG9TaW1wbGVDb25maWcsIG91dHB1dEZpbGUsIGdldE9TR2lJbnN0YWxsQXJlYShtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKSksIGJhY2t1cCk7Ci0JCWNvbmZpZ0RhdGEuc2V0RndJbmRlcGVuZGVudFByb3AoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBST1BfS0VZX0NPTkZJR1VSTCwgb3V0cHV0RmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlyZXR1cm4gb3JkZXJpbmdJbml0aWFsQ29uZmlnKHNldFRvSW5pdGlhbENvbmZpZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldE9TR2lJbnN0YWxsQXJlYShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JCWlmIChsYXVuY2hlckRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdbXSBhcmdzID0gbGF1bmNoZXJEYXRhLmdldFByb2dyYW1BcmdzKCk7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1zdGFydHVwIikgJiYgaSArIDEgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2kgKyAxXS5jaGFyQXQoMSkgIT0gJy0nKSB7Ci0JCQkJSVBhdGggcGFyZW50Rm9sZGVyID0gbmV3IFBhdGgoYXJnc1tpICsgMV0pLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQlpZiAocGFyZW50Rm9sZGVyLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJwbHVnaW5zIikpCi0JCQkJCXJldHVybiBwYXJlbnRGb2xkZXIucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvRmlsZSgpOwotCQkJCXJldHVybiBwYXJlbnRGb2xkZXIudG9GaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb24oTGlzdCBidW5kbGVJbmZvTGlzdCwgRmlsZSBvdXRwdXRGaWxlLCBGaWxlIGJhc2UsIGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2ZUNvbmZpZ3VyYXRpb24oTGlzdCBidW5kbGVJbmZvTGlzdCwgRmlsZSBvdXRwdXRGaWxlLCBib29sZWFuIGJhY2t1cCk6IG91dEZpbGU9IiArIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCUJ1ZmZlcmVkV3JpdGVyIGJ3OwotCQlpZiAoYmFja3VwKQotCQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlIGRlc3QgPSBVdGlscy5nZXRTaW1wbGVEYXRhRm9ybWF0dGVkRmlsZShvdXRwdXRGaWxlKTsKLQkJCQlpZiAoIW91dHB1dEZpbGUucmVuYW1lVG8oZGVzdCkpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsIHRvIHJlbmFtZSBmcm9tICgiICsgb3V0cHV0RmlsZSArICIpIHRvICgiICsgZGVzdCArICIpIik7Ci0JCQkJfQotCQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoYnVuZGxlSW5mb0xpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJaWYgKG8xIGluc3RhbmNlb2YgQnVuZGxlSW5mbyAmJiBvMiBpbnN0YW5jZW9mIEJ1bmRsZUluZm8pIHsKLQkJCQkJcmV0dXJuICgoQnVuZGxlSW5mbykgbzEpLmdldFN5bWJvbGljTmFtZSgpLmNvbXBhcmVUbygoKEJ1bmRsZUluZm8pIG8yKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJfQotCQl9KTsKLQotCQlpZiAoYnVuZGxlSW5mb0xpc3Quc2l6ZSgpID4gMCkgewotCQkJVXRpbHMuY3JlYXRlUGFyZW50RGlyKG91dHB1dEZpbGUpOwotCQkJYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZSkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IGJ1bmRsZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0KLQkJCQlpZiAoYkluZm8uZ2V0U3ltYm9saWNOYW1lKCkgPT0gbnVsbCkKLQkJCQkJYncud3JpdGUoIiwiKTsKLQkJCQllbHNlCi0JCQkJCWJ3LndyaXRlKGJJbmZvLmdldFN5bWJvbGljTmFtZSgpICsgIiwiKTsKLQkJCQlpZiAoYkluZm8uZ2V0VmVyc2lvbigpID09IG51bGwpCi0JCQkJCWJ3LndyaXRlKCIsIik7Ci0JCQkJZWxzZQotCQkJCQlidy53cml0ZShiSW5mby5nZXRWZXJzaW9uKCkgKyAiLCIpOwotCi0JCQkJbG9jYXRpb24gPSBtYWtlUmVsYXRpdmUobG9jYXRpb24sIGJhc2UgIT0gbnVsbCA/IGJhc2UudG9VUkwoKSA6IG51bGwpOwotCQkJCWJ3LndyaXRlKGxvY2F0aW9uICsgIiwiKTsKLQkJCQlidy53cml0ZShiSW5mby5nZXRTdGFydExldmVsKCkgKyAiLCIgKyBiSW5mby5pc01hcmtlZEFzU3RhcnRlZCgpKTsKLQkJCQlidy5uZXdMaW5lKCk7Ci0JCQl9Ci0JCQlidy5mbHVzaCgpOwotCQkJYncuY2xvc2UoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJb3V0cHV0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCUZpbGUgcGFyZW50RGlyID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAocGFyZW50RGlyLmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50RGlyLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKElQYXRoIHRvUmVsLCBJUGF0aCBiYXNlKSB7Ci0JCWludCBpID0gYmFzZS5tYXRjaGluZ0ZpcnN0U2VnbWVudHModG9SZWwpOwotCQlpZiAoaSA9PSAwKSB7Ci0JCQlyZXR1cm4gdG9SZWwudG9PU1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBqID0gMDsgaiA8IChiYXNlLnNlZ21lbnRDb3VudCgpIC0gaSk7IGorKykgewotCQkJcmVzdWx0ICs9ICIuLiIgKyBJUGF0aC5TRVBBUkFUT1I7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoaSA9PSB0b1JlbC5zZWdtZW50Q291bnQoKSkKLQkJCXJldHVybiAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ICs9IHRvUmVsLnNldERldmljZShudWxsKS5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUmVsYXRpdmUoU3RyaW5nIHVybFN0cmluZywgVVJMIHJvb3RVUkwpIHsKLQkJLy8gd2Ugb25seSB0cmFmZmljIGluIGZpbGU6IFVSTHMKLQkJaW50IGluZGV4ID0gdXJsU3RyaW5nLmluZGV4T2YoRklMRV9QUk9UT0NPTCk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0JCWluZGV4ID0gaW5kZXggKyA1OwotCi0JCS8vIGVuc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlID0gdXJsU3RyaW5nOwotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTChmaWxlKTsKLQkJCQlmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybCA9PSBudWxsIHx8ICFuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCi0JCVN0cmluZyByb290U3RyaW5nID0gcm9vdFVSTC50b0V4dGVybmFsRm9ybSgpOwotCQlyZXR1cm4gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBtYWtlUmVsYXRpdmUobmV3IFBhdGgodXJsU3RyaW5nLnN1YnN0cmluZyhpbmRleCkpLCBuZXcgUGF0aChyb290U3RyaW5nLnN1YnN0cmluZyhyb290U3RyaW5nLmluZGV4T2YoRklMRV9QUk9UT0NPTCkgKyA1KSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyByb290UGF0aCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgob3JpZ2luYWwpOwotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlQYXRoIHJvb3QgPSBuZXcgUGF0aChyb290UGF0aCk7Ci0JCXJldHVybiByb290LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKG9yaWdpbmFsLnJlcGxhY2UoJzonLCAnfScpKS50b09TU3RyaW5nKCkucmVwbGFjZSgnfScsICc6Jyk7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHRoZSBnaXZlbiBwYXRoIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgcm9vdCwgaWYgYXBwbGljYWJsZS4gSWYgbm90LCB0aGVuCi0JICogcmV0dXJuIHRoZSBwYXRoIGFzLWlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgZmlsZSA9IHVybFN0cmluZzsKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwoZmlsZSk7Ci0JCQkJZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICh1cmwgPT0gbnVsbCB8fCBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCi0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4IC0gNSkgKyBtYWtlQWJzb2x1dGUodXJsU3RyaW5nLnN1YnN0cmluZyhpbmRleCksIHJvb3RVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotCi0Jdm9pZCBzZXRQcmVyZXF1aXNpdGVCdW5kbGVzKEJ1bmRsZUluZm8gY29uZmlndXJhdG9yQnVuZGxlSW5mbywgQnVuZGxlc1N0YXRlIHN0YXRlLCBMb2NhdGlvbkluZm8gaW5mbykgewotCQlpZiAoc3RhdGUuaXNGdWxseVN1cHBvcnRlZCgpKQotCQkJaWYgKCF0aGlzLmNoZWNrUmVzb2x2ZShjb25maWd1cmF0b3JCdW5kbGVJbmZvLCBzdGF0ZSkpIHsKLQkJCQlwcmludG91dFVuc2F0aXNmaWVkQ29uc3RyYWludHMoY29uZmlndXJhdG9yQnVuZGxlSW5mbywgc3RhdGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJQnVuZGxlSW5mb1tdIHByZXJlcXVpc2l0ZXMgPSBzdGF0ZS5nZXRQcmVyZXF1aXN0ZUJ1bmRsZXMoY29uZmlndXJhdG9yQnVuZGxlSW5mbyk7Ci0JCWluZm8ucHJlcmVxdWlzaXRlTG9jYXRpb25zID0gbmV3IFN0cmluZ1twcmVyZXF1aXNpdGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlcmVxdWlzaXRlcy5sZW5ndGg7IGkrKykKLQkJCWluZm8ucHJlcmVxdWlzaXRlTG9jYXRpb25zW2ldID0gcHJlcmVxdWlzaXRlc1tpXS5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm47Ci0KLQl9Ci0KLQl2b2lkIHNldFN5c3RlbUJ1bmRsZXMoQnVuZGxlc1N0YXRlIHN0YXRlLCBMb2NhdGlvbkluZm8gaW5mbykgewotCQlCdW5kbGVJbmZvIHN5c3RlbUJ1bmRsZUluZm8gPSBzdGF0ZS5nZXRTeXN0ZW1CdW5kbGUoKTsKLQkJaWYgKHN5c3RlbUJ1bmRsZUluZm8gPT0gbnVsbCkgewotCQkJLy8gVE9ETyBMb2cKLQkJCS8vdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gc3lzdGVtQnVuZGxlLlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHN0YXRlLmlzRnVsbHlTdXBwb3J0ZWQoKSkKLQkJCWlmICghdGhpcy5jaGVja1Jlc29sdmUoc3lzdGVtQnVuZGxlSW5mbywgc3RhdGUpKSB7Ci0JCQkJcHJpbnRvdXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKHN5c3RlbUJ1bmRsZUluZm8sIHN0YXRlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCWluZm8uc3lzdGVtQnVuZGxlTG9jYXRpb24gPSBzeXN0ZW1CdW5kbGVJbmZvLmdldExvY2F0aW9uKCk7Ci0JCUJ1bmRsZUluZm9bXSBmcmFnbWVudHMgPSBzdGF0ZS5nZXRTeXN0ZW1GcmFnbWVudGVkQnVuZGxlcygpOwotCQlpbmZvLnN5c3RlbUZyYWdtZW50ZWRCdW5kbGVMb2NhdGlvbnMgPSBuZXcgU3RyaW5nW2ZyYWdtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykKLQkJCWluZm8uc3lzdGVtRnJhZ21lbnRlZEJ1bmRsZUxvY2F0aW9uc1tpXSA9IGZyYWdtZW50c1tpXS5nZXRMb2NhdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUJ1bmRsZXMoTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsI3VwZGF0ZUJ1bmRsZXMoKSIpOwotCi0JCUJ1bmRsZXNTdGF0ZSBidW5kbGVTdGF0ZSA9IG1hbmlwdWxhdG9yLmdldEJ1bmRsZXNTdGF0ZSgpOwotCi0JCWlmIChidW5kbGVTdGF0ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoYnVuZGxlU3RhdGUuaXNGdWxseVN1cHBvcnRlZCgpKQotCQkJYnVuZGxlU3RhdGUucmVzb2x2ZSh0cnVlKTsKLQotCQlCdW5kbGVJbmZvW10gY3VycmVudEJJbmZvcyA9IGJ1bmRsZVN0YXRlLmdldEV4cGVjdGVkU3RhdGUoKTsKLQkJaWYgKCFpc1RhcmdldENvbmZpZ3VyYXRvckJ1bmRsZShjdXJyZW50QkluZm9zKSkKLQkJCXJldHVybjsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJU3RyaW5nW10ganZtQXJncyA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldEp2bUFyZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqdm1BcmdzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGp2bUFyZ3NbaV0uc3RhcnRzV2l0aCgiLUQiKSkgewotCQkJCWludCBpbmRleCA9IGp2bUFyZ3NbaV0uaW5kZXhPZigiPSIpOwotCQkJCWlmIChpbmRleCA+IDAgJiYganZtQXJnc1tpXS5sZW5ndGgoKSA+IDIpIHsKLQkJCQkJU3RyaW5nIGtleSA9IGp2bUFyZ3NbaV0uc3Vic3RyaW5nKDIsIGluZGV4KTsKLQkJCQkJU3RyaW5nIHZhbHVlID0ganZtQXJnc1tpXS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQkJcHJvcGVydGllcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJVXRpbHMuYXBwZW5kUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndJbmRlcGVuZGVudFByb3BzKCkpOwotCQlib29sZWFuIGV4Y2x1c2l2ZUluc3RhbGxhdGlvbiA9IEJvb2xlYW4udmFsdWVPZihwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OKSkuYm9vbGVhblZhbHVlKCk7Ci0JCVVSTCBjb25maWd1cmF0b3JDb25maWdVcmwgPSBnZXRDb25maWdMb2NhdGlvbihtYW5pcHVsYXRvcik7Ci0KLQkJQnVuZGxlSW5mb1tdIHRvSW5zdGFsbCA9IHRoaXMubG9hZENvbmZpZ3VyYXRpb24oY29uZmlndXJhdG9yQ29uZmlnVXJsLCBnZXRPU0dpSW5zdGFsbEFyZWEobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpKTsKLQotCQlMaXN0IHRvVW5pbnN0YWxsID0gbmV3IExpbmtlZExpc3QoKTsKLQkJaWYgKGV4Y2x1c2l2ZUluc3RhbGxhdGlvbikKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gaW5zdGFsbCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdG9JbnN0YWxsLmxlbmd0aDsgaisrKQotCQkJCQlpZiAoY3VycmVudEJJbmZvc1tpXS5nZXRMb2NhdGlvbigpLmVxdWFscyh0b0luc3RhbGxbal0uZ2V0TG9jYXRpb24oKSkpIHsKLQkJCQkJCWluc3RhbGwgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlpZiAoIWluc3RhbGwpCi0JCQkJCXRvVW5pbnN0YWxsLmFkZChjdXJyZW50QkluZm9zW2ldKTsKLQkJCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlidW5kbGVTdGF0ZS5pbnN0YWxsQnVuZGxlKHRvSW5zdGFsbFtpXSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChleGNsdXNpdmVJbnN0YWxsYXRpb24pCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IHRvVW5pbnN0YWxsLml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJCWJ1bmRsZVN0YXRlLnVuaW5zdGFsbEJ1bmRsZShiSW5mbyk7Ci0JCQl9Ci0KLQkJYnVuZGxlU3RhdGUucmVzb2x2ZSh0cnVlKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEJ1bmRsZXMoYnVuZGxlU3RhdGUuZ2V0RXhwZWN0ZWRTdGF0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yKSB7Ci0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGdldENvbmZpZ0xvY2F0aW9uKG1hbmlwdWxhdG9yKS5nZXRGaWxlKCkpOwotCQlvdXRwdXRGaWxlLmRlbGV0ZSgpOwotCi0JCWlmIChvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKS5pc0RpcmVjdG9yeSgpKQotCQkJb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZGVsZXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwZDgxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHM7Ci0KLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfQkFTRVVSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5iYXNlVXJsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmV4Y2x1c2l2ZUluc3RhbGxhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0NPTkZJR19TVEFNUCA9ICJsYXN0LmNvbmZpZy5zdGFtcHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0xJU1QgPSAiYnVuZGxlcy5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRPUl9GT0xERVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lOSSA9ICJjb25maWcuaW5pIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfS0VZX0NPTkZJR1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5jb25maWdVcmwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT05GSUdVUkFUT1JfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9QUk9QX1ZBTFVFX0NPTkZJR1VSQVRPUl9TWU1CT0xJQ05BTUUgPSBUQVJHRVRfQ09ORklHVVJBVE9SX05BTUU7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2I0ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQzY2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0NvcHkgYnVpbHQgdmVyc2lvbiBvZiBzaW1wbGUgY29uZmlndXJhdG9yIGludG8gbWV0YWRhdGEgZ2VuZXJhdG9yLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0NvcHkgYnVpbHQgdmVyc2lvbiBvZiBzaW1wbGUgY29uZmlndXJhdG9yIGludG8gbWV0YWRhdGEgZ2VuZXJhdG9yLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4YWQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5leHRlcm5hbFRvb2xCdWlsZGVycy9Db3B5IGJ1aWx0IHZlcnNpb24gb2Ygc2ltcGxlIGNvbmZpZ3VyYXRvciBpbnRvIG1ldGFkYXRhIGdlbmVyYXRvci5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSI0Ii8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuREVGQVVMVF9DTEFTU1BBVEgiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIvPgotPG1hcEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9BTlRfUFJPUEVSVElFUyI+Ci08bWFwRW50cnkga2V5PSJidWlsZERpcmVjdG9yeSIgdmFsdWU9IiR7YnVpbGRfcHJvamVjdH0vdHJhc2giLz4KLTxtYXBFbnRyeSBrZXk9InRhcmdldEZvbGRlciIgdmFsdWU9IiR7cmVzb3VyY2VfbG9jOi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcn0iLz4KLTxtYXBFbnRyeSBrZXk9ImVjbGlwc2UucGRlYnVpbGQuc2NyaXB0cyIgdmFsdWU9Ii9EOi9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmJ1aWxkXzMuMy4wLnYyMDA3MDMxMi9zY3JpcHRzLyIvPgotPG1hcEVudHJ5IGtleT0iZWNsaXBzZS5ydW5uaW5nIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0idGhpc1BsdWdpbiIgdmFsdWU9IiR7cmVzb3VyY2VfbG9jOi9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcn0iLz4KLTxtYXBFbnRyeSBrZXk9ImVjbGlwc2UucGRlYnVpbGQudGVtcGxhdGVzIiB2YWx1ZT0iL0Q6L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfMy4zLjAudjIwMDcwMzEyL3RlbXBsYXRlcy8iLz4KLTxtYXBFbnRyeSBrZXk9ImVjbGlwc2UucGRlYnVpbGQuaG9tZSIgdmFsdWU9Ii9EOi9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmJ1aWxkXzMuMy4wLnYyMDA3MDMxMi8uLyIvPgotPG1hcEVudHJ5IGtleT0iZWNsaXBzZS5ob21lIiB2YWx1ZT0iRDpcZWNsaXBzZSIvPgotPG1hcEVudHJ5IGtleT0iYmFzZUxvY2F0aW9uIiB2YWx1ZT0iJHt0YXJnZXRfaG9tZX0iLz4KLTwvbWFwQXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvbG9jYWxidWlsZC54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYWQzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+ZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KLQkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQ29weSBidWlsdCB2ZXJzaW9uIG9mIHNpbXBsZSBjb25maWd1cmF0b3IgaW50byBtZXRhZGF0YSBnZW5lcmF0b3IubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWQ5NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotI0ZyaSBGZWIgMjIgMTE6MTU6MzggRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMjQ0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1OTo0MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE0NDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4yLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9yCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzJlNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXF1YWxpZmllcj1jb250ZXh0Ci1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2xvY2FsYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9sb2NhbGJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkN2ZkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2xvY2FsYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgIE1hciAxNCwgMjAwNyAxMToxNzowMiBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgcHJvamVjdCAgICAKLSAgICAgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgQWRtaW5pc3RyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9InByb2plY3QiIGRlZmF1bHQ9ImRlZmF1bHQiPgotCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAgICAgIHRhcmdldDogZGVmYXVsdCAgICAgICAgICAgICAgCi0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXNjcmlwdGlvbj0iLS0+IGRlc2NyaXB0aW9uIj4KLQkJPGVjaG8gbWVzc2FnZT0iYmQgaXMgJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPHRzdGFtcC8+Ci0JCTxlY2xpcHNlLmJ1aWxkU2NyaXB0IGVsZW1lbnRzPSJwbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiIAotCQkJYnVpbGREaXJlY3Rvcnk9IiR7YnVpbGREaXJlY3Rvcnl9IiAKLQkJCWNvbmZpZ0luZm89IiosKiwqIiAKLQkJCWJhc2VMb2NhdGlvbj0iJHtiYXNlTG9jYXRpb259IiAKLQkJCWJ1aWxkaW5nT1NHaT0idHJ1ZSIgCi0JCQlvdXRwdXRVcGRhdGVKYXJzPSJmYWxzZSIKLQkJCXBsdWdpbnBhdGg9IiR7dGhpc1BsdWdpbn0iCi0JCQlmb3JjZUNvbnRleHRRdWFsaWZpZXI9Inoke0RTVEFNUH0ke1RTVEFNUH0iCi0JCQkvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9ImJ1aWxkLnVwZGF0ZS5qYXIiLz4KLQkJPG1vdmUgdG9kaXI9IiR7dGFyZ2V0Rm9sZGVyfSIgaW5jbHVkZUVtcHR5RGlycz0ibm8iIGZhaWxvbmVycm9yPSJ5ZXMiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQkJPC9maWxlc2V0PgotCQkJPHJlZ2V4cG1hcHBlciBmcm9tPSJeKC4qKV8uKiQiIHRvPSJcMS5qYXIiLz4KLQkJPC9tb3ZlPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJjbGVhbiIvPgotCQk8ZGVsZXRlIGZpbGU9ImJ1aWxkLnhtbCIvPgotCQk8ZGVsZXRlIGZpbGU9ImphdmFDb21waWxlci4uLmFyZ3MiLz4KLQk8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZTVkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYnVuZGxlTmFtZT0gU2ltcGxlIENvbmZpZ3VyYXRvcgotcHJvdmlkZXJOYW1lPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjkxZWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbnRvIGEgc2VydmljZSByZWdpc3RyeQotICogYnkgYSBDb25maWd1cmF0b3IgQnVuZGxlLgotICogCi0gKiBUaGUgY2xpZW50IGJ1bmRsZSBjYW4gYXBwbHkgY29uZmlndXJhdGlvbiB3aGljaCBjYW4gYmUgaW50ZXJwcmV0ZWQgYnkgcmVmZXJyaW5nCi0gKiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgT1NHaSBlbnZpcm9ubWVudC4gSW4gYWRkaXRpb24sIAotICogdGhlIGNsaWVudCBjYW4gZXhwZWN0IGJ1bmRsZSBzdGF0ZSBpbiBhZHZhbmNlIC4gIAotICogCi0gKiBUT0RPOiB0aGlzIGludGVyZmFjZSBtaWdodCBub3QgYmUgcmVxdWlyZWQgdG8gYmUgZGVmaW5lZC4KLSAqIAotICogCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDdXJyZW50IERlZmluaXRpb24gb2YgQ29uZmlndXJhdG9yIEJ1bmRsZTogCi0gKiAKLSAqIENvbmZpZ3VyYXRvciBCdW5kbGUgd2lsbCBkbyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBhdCBpdHMgc3RhcnR1cC4KLSAqIAotICogMS4gQ3JlYXRlIGEgQ29uZmlndXJhdG9yIG9iamVjdC4KLSAqIDIuIFJlZ2lzdGVyIGl0IGFzIGEgc2VydmljZSB0byB0aGUgc2VydmljZSByZWdpc3RyeS4KLSAqIDMuIEdldCB3aGVyZSB0byByZWFkIGZvciBrbm93aW5nIHdoYXQga2luZHMgb2YgYnVuZGxlcyBpbiBpdHMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IHdheS4KLSAqIDQuIENhbGwge0BsaW5rIENvbmZpZ3VyYXRvciNhcHBseUNvbmZpZ3VyYXRpb24oVVJMKX0gd2l0aCB0aGUgVVJMLgotICogCi0gKiBBdCBpdHMgc3RvcHBpbmcsIHRoZSBzZXJ2aWNlIHJlZ2lzdGVyZWQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQuCi0gKiAKLSAqIEBzZWUgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdG9yIHsKLQotCS8qKgotCSAqIEFwcGx5IGNvbmZpZ3VyYXRpb24gcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgdXJsIHRvIHRoZSBPU0dpIAotCSAqIGVudmlyb25tZW50IGN1cnJlbnRseSBydW5uaW5nLgotCSAqIAotCSAqIEBwYXJhbSB1cmwgVVJMIHRvIGJlIHJlYWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIHJlYWRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIHVybCBmYWlscy4gCi0JICovCi0Jdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQXBwbHkgY29uZmlndXJhdGlvbiByZWFkIGZyb20gdGhlIHByZXZpb3VzbHkgdXNlZCB1cmwgdG8gdGhlIE9TR2kgCi0JICogZW52aXJvbm1lbnQgY3VycmVudGx5IHJ1bm5pbmcuIElmIGl0IGlzIG5ldmVyIHVzZWQsIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIHJlYWRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIHVybCBmYWlscy4gCi0JICovCi0Jdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVybCBpbiB1c2UuCi0JICogSWYgaXQgaXMgbmV2ZXIgdXNlZCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCVVSTCBnZXRVcmxJblVzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzZGYyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzLkVxdWlub3hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlscy5TaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQXQgaXRzIHN0YXJ0LCBTaW1wbGVDb25maWd1cmF0b3IgYnVuZGxlIGRvZXMgdGhlIGZvbGxvd2luZ3MuCi0gKiAKLSAqIDEuIEEgdmFsdWUgd2lsbCBiZSBnb3R0ZW4gYnkgQHtsaW5rIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoa2V5KX0gd2l0aCAKLSAqIHtAbGluayBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMjUFJPUF9LRVlfQ09ORklHVVJMfSBhcyBhIGtleS4KLSAqIFRoZSB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZWZlcmFsIFVSTC4gVW5kZXIgdGhlIHVybCwgdGhlcmUgbXVzdCBiZSBhIHNpbXBsZSAKLSAqIGJ1bmRsZXMgbGlzdCBmaWxlIHRvIGJlIGluc3RhbGxlZCB3aXRoIHRoaWVyIHN0YXJ0IGxldmVsIGFuZCBmbGFnIG9mIG1hcmtlZCBhcyBzdGFydGVkLgotICogCi0gKiAyLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgZG8gbm90aGluZyBhbnkgbW9yZS4KLSAqIDMuIE90aGVyd2lzZSwgcmV0cmlldmUgdGhlIGJ1bmRsZXMgbGlzdCBmcm9tIHRoZSB1cmwgYW5kIGluc3RhbGwsCi0gKiAgc2V0IHN0YXJ0IGxldmVsIG9mIGFuZCBzdGFydCBidW5kbGVzLCBhcyBzcGVjaWZpZWQuCi0gKiAKLSAqIDQuIEEgdmFsdWUgd2lsbCBiZSBnb3R0ZW4gYnkgQHtsaW5rIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoa2V5KX0gd2l0aCAKLSAqIHtAbGluayBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMjUFJPUF9LRVlfRVhDTFVTSVZFX0lOU1RBTExBVElPTn0gYXMgYSBrZXkuCi0gKiAKLSAqIDUuIElmIGl0IGVxdWFscyAiZmFsc2UiLCBpdCB3aWxsIGRvIGV4Y2x1c2l2ZSBpbnN0YWxsYXRpb24sIHdoaWNoIG1lYW5zIHRoYXQgCi0gKiB0aGUgYnVuZGxlcyB3aWxsIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHNwZWNpZmllZCB1cmwgYnV0IGluc3RhbGxlZCBhdCB0aGUgdGltZQotICogb2YgdGhlIG1ldGhvZCBjYWxsIGV4Y2VwdCBTeXN0ZW1CdW5kbGUgd2lsbCBiZSB1bmluc3RhbGxlZC4gCi0gKiBPdGhlcndpc2UsIG5vIHVuaW5zdGFsbGF0aW9uIHdpbGwgbm90IGJlIGRvbmUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIGNvbmZpZ3VyYXRvclJlZ2lzdHJhdGlvbjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gY29tbWFuZFJlZ2lzdHJhdGlvbjsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUNvbmZpZ3VyYXRvckltcGwgYnVuZGxlQ29uZmlndXJhdG9yID0gbmV3IFNpbXBsZUNvbmZpZ3VyYXRvckltcGwoY29udGV4dCwgY29udGV4dC5nZXRCdW5kbGUoKSk7Ci0JCWJ1bmRsZUNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oKTsKLQotCQlEaWN0aW9uYXJ5IHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfVkVORE9SLCAiRWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9QSUQsIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5UQVJHRVRfQ09ORklHVVJBVE9SX05BTUUpOwotCQlTZXJ2aWNlRmFjdG9yeSBjb25maWd1cmF0aW9uRmFjdG9yeSA9IG5ldyBTaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5KGNvbnRleHQpOwotCQljb25maWd1cmF0b3JSZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBjb25maWd1cmF0aW9uRmFjdG9yeSwgcHJvcHMpOwotCi0JCXRyeSB7Ci0JCQlpZiAobnVsbCAhPSBjb250ZXh0LmdldEJ1bmRsZSgpLmxvYWRDbGFzcygib3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZS5Db21tYW5kUHJvdmlkZXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbW1hbmRSZWdpc3RyYXRpb24gPSBFcXVpbm94VXRpbHMucmVnaXN0ZXJDb25zb2xlQ29tbWFuZHMoY29udGV4dCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gQ29tbWFuZFByb3ZpZGVyIGlzIG5vdCBhdmFpbGFibGUKLQkJCS8vIE9rIC0tIG9wdGlvbmFsCi0JCX0KLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lzdGVyZWQgQ29uZmlndXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWd1cmF0b3JSZWdpc3RyYXRpb24gIT0gbnVsbCkgewotCQkJY29uZmlndXJhdG9yUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJCWNvbmZpZ3VyYXRvclJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JCX0KLQkJaWYgKGNvbW1hbmRSZWdpc3RyYXRpb24gIT0gbnVsbCkgewotCQkJY29tbWFuZFJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCQljb21tYW5kUmVnaXN0cmF0aW9uID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL0NvbmZpZ0FwcGxpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL0NvbmZpZ0FwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjNmYzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9Db25maWdBcHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlscy4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhcnRMZXZlbDsKLQotY2xhc3MgQ29uZmlnQXBwbGllciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfQlVORExFU19UWFQgPSAibGFzdC5idW5kbGVzLmluZm8iOwotCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IG1hbmlwdWxhdGluZ0NvbnRleHQ7Ci0JcHJpdmF0ZSBQYWNrYWdlQWRtaW4gYWRtaW5TZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIFN0YXJ0TGV2ZWwgc3RhcnRMZXZlbFNlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBydW5uaW5nT25FcXVpbm94OwotCXByaXZhdGUgYm9vbGVhbiBjaGVja01hbmlmZXN0QmVmb3JlSW5zdGFsbCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBCdW5kbGUgY2FsbGluZ0J1bmRsZTsKLQotCUNvbmZpZ0FwcGxpZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgY2FsbGluZ0J1bmRsZSkgewotCQl0aGlzLm1hbmlwdWxhdGluZ0NvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmNhbGxpbmdCdW5kbGUgPSBjYWxsaW5nQnVuZGxlOwotCQkvL1N0cmluZyB2ZW5kb3IgPSBjb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfVkVORE9SKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInZlbmRvcj0iICsgdmVuZG9yKTsKLQkJdGhpcy5ydW5uaW5nT25FcXVpbm94ID0gIkVjbGlwc2UiLmVxdWFscyhjb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfVkVORE9SKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWYgPSBtYW5pcHVsYXRpbmdDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwYWNrYWdlQWRtaW5SZWYgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIFBhY2thZ2VBZG1pbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4iKTsKLQotCQlhZG1pblNlcnZpY2UgPSAoUGFja2FnZUFkbWluKSBtYW5pcHVsYXRpbmdDb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQotCQlTZXJ2aWNlUmVmZXJlbmNlIHN0YXJ0TGV2ZWxSZWYgPSBtYW5pcHVsYXRpbmdDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoc3RhcnRMZXZlbFJlZiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gU3RhcnRMZXZlbFNlcnZpY2Ugc2VydmljZSBpcyBhdmFpbGFibGUuIik7Ci0JCXN0YXJ0TGV2ZWxTZXJ2aWNlID0gKFN0YXJ0TGV2ZWwpIG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0U2VydmljZShzdGFydExldmVsUmVmKTsKLQotCX0KLQotCXZvaWQgaW5zdGFsbChCdW5kbGVJbmZvW10gZXhwZWN0ZWRTdGF0ZSwgVVJMIHVybCwgYm9vbGVhbiBleGNsdXNpdmVNb2RlKSB7Ci0JCUhhc2hTZXQgdG9Vbmluc3RhbGwgPSBudWxsOwotCQlpZiAoIWV4Y2x1c2l2ZU1vZGUpIHsKLQkJCUJ1bmRsZUluZm9bXSBsYXN0SW5zdGFsbGVkQnVuZGxlcyA9IGdldExhc3RTdGF0ZSgpOwotCQkJaWYgKGxhc3RJbnN0YWxsZWRCdW5kbGVzICE9IG51bGwpIHsKLQkJCQl0b1VuaW5zdGFsbCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QobGFzdEluc3RhbGxlZEJ1bmRsZXMpKTsKLQkJCQl0b1VuaW5zdGFsbC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChleHBlY3RlZFN0YXRlKSk7Ci0JCQl9Ci0JCQlzYXZlU3RhdGVBc0xhc3QodXJsKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gcHJldm91c2x5UmVzb2x2ZWQgPSBnZXRSZXNvbHZlZEJ1bmRsZXMoKTsKLQkJQ29sbGVjdGlvbiB0b1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gdG9TdGFydCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGV4Y2x1c2l2ZU1vZGUpIHsKLQkJCXRvUmVmcmVzaC5hZGRBbGwoaW5zdGFsbEJ1bmRsZXMoZXhwZWN0ZWRTdGF0ZSwgdG9TdGFydCkpOwotCQkJdG9SZWZyZXNoLmFkZEFsbCh1bmluc3RhbGxCdW5kbGVzKGV4cGVjdGVkU3RhdGUsIGFkbWluU2VydmljZSkpOwotCQl9IGVsc2UgewotCQkJdG9SZWZyZXNoLmFkZEFsbChpbnN0YWxsQnVuZGxlcyhleHBlY3RlZFN0YXRlLCB0b1N0YXJ0KSk7Ci0JCQlpZiAodG9Vbmluc3RhbGwgIT0gbnVsbCkKLQkJCQl0b1JlZnJlc2guYWRkQWxsKHVuaW5zdGFsbEJ1bmRsZXModG9Vbmluc3RhbGwpKTsKLQkJfQotCQlyZWZyZXNoUGFja2FnZXMoKEJ1bmRsZVtdKSB0b1JlZnJlc2gudG9BcnJheShuZXcgQnVuZGxlW3RvUmVmcmVzaC5zaXplKCldKSwgbWFuaXB1bGF0aW5nQ29udGV4dCk7Ci0JCWlmICh0b1JlZnJlc2guc2l6ZSgpID4gMCkKLQkJCXRyeSB7Ci0JCQkJbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRCdW5kbGUoKS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5QbGF0Zm9ybUFkbWluIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBub3cgc2VlIGlmIHRoZXJlIGFyZSBhbnkgY3VycmVudGx5IHJlc29sdmVkIGJ1bmRsZXMgd2l0aCBvcHRpb24gaW1wb3J0cyB3aGljaCBjb3VsZCBiZSByZXNvbHZlZCBvcgotCQkJCS8vIGlmIHRoZXJlIGFyZSBmcmFnbWVudHMgd2l0aCBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIHdoaWNoIGNvbmZsaWN0IHdpdGggYW4gYWxyZWFkeSByZXNvbHZlZCBob3N0Ci0JCQkJQnVuZGxlW10gYWRkaXRpb25hbFJlZnJlc2ggPSBTdGF0ZVJlc29sdmVyVXRpbHMuZ2V0QWRkaXRpb25hbFJlZnJlc2gocHJldm91c2x5UmVzb2x2ZWQsIG1hbmlwdWxhdGluZ0NvbnRleHQpOwotCQkJCWlmIChhZGRpdGlvbmFsUmVmcmVzaC5sZW5ndGggPiAwKQotCQkJCQlyZWZyZXNoUGFja2FnZXMoYWRkaXRpb25hbFJlZnJlc2gsIG1hbmlwdWxhdGluZ0NvbnRleHQpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQkJLy8gZG8gbm90aGluZzsgbm8gcmVzb2x2ZXIgcGFja2FnZSBhdmFpbGFibGUKLQkJCX0KLQkJc3RhcnRCdW5kbGVzKChCdW5kbGVbXSkgdG9TdGFydC50b0FycmF5KG5ldyBCdW5kbGVbdG9TdGFydC5zaXplKCldKSk7Ci0JCS8vaWYgdGltZSBzdGFtcHMgYXJlIHRoZSBzYW1lCi0JCS8vICBkbyBub3RoaW5nCi0JCS8vICByZXR1cm4KLQkJLy9pZiBsaXN0IGV4aXN0cwotCQkvLyAgZm9yY2UgdGhlIGxpc3QgaW4gdGhlIGZ3awotCQkvL2Vsc2UKLQkJLy8gIGRpc2NvdmVyIGJ1bmRsZXMgaW4gZm9sZGVycyBhbmQgZm9yY2UgdGhlIGxpc3QgaW4gdGhlIGZ3awotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSZXNvbHZlZEJ1bmRsZXMoKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb2x2ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGkrKykKLQkJCWlmICgoYWxsQnVuZGxlc1tpXS5nZXRTdGF0ZSgpICYgKEJ1bmRsZS5JTlNUQUxMRUQgfCBCdW5kbGUuVU5JTlNUQUxMRUQpKSA9PSAwKQotCQkJCXJlc29sdmVkLmFkZChhbGxCdW5kbGVzW2ldKTsKLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiB1bmluc3RhbGxCdW5kbGVzKEhhc2hTZXQgdG9Vbmluc3RhbGwpIHsKLQkJQ29sbGVjdGlvbiByZW1vdmVkQnVuZGxlcyA9IG5ldyBBcnJheUxpc3QodG9Vbmluc3RhbGwuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRvVW5pbnN0YWxsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gY3VycmVudCA9IChCdW5kbGVJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlCdW5kbGVbXSBtYXRjaGluZ0J1bmRsZXMgPSBhZG1pblNlcnZpY2UuZ2V0QnVuZGxlcyhjdXJyZW50LmdldFN5bWJvbGljTmFtZSgpLCBnZXRWZXJzaW9uUmFuZ2UoY3VycmVudC5nZXRWZXJzaW9uKCkpKTsKLQkJCWZvciAoaW50IGogPSAwOyBtYXRjaGluZ0J1bmRsZXMgIT0gbnVsbCAmJiBqIDwgbWF0Y2hpbmdCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlZEJ1bmRsZXMuYWRkKG1hdGNoaW5nQnVuZGxlc1tqXSk7Ci0JCQkJCW1hdGNoaW5nQnVuZGxlc1tqXS51bmluc3RhbGwoKTsKLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQkvL1RPRE8gbG9nIGluIGRlYnVnIG1vZGUuLi4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWRCdW5kbGVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlU3RhdGVBc0xhc3QoVVJMIHVybCkgewotCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBudWxsOwotCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW0gPSBudWxsOwotCi0JCUZpbGUgbGFzdEJ1bmRsZXNUeHQgPSBnZXRMYXN0QnVuZGxlVHh0KCk7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obGFzdEJ1bmRsZXNUeHQpOwotCQkJCXNvdXJjZVN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMudHJhbnNmZXJTdHJlYW1zKHNvdXJjZVN0cmVhbSwgZGVzdGluYXRpb25TdHJlYW0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZGVzdGluYXRpb25TdHJlYW0gIT0gbnVsbCkKLQkJCQkJZGVzdGluYXRpb25TdHJlYW0uY2xvc2UoKTsKLQkJCQlpZiAoc291cmNlU3RyZWFtICE9IG51bGwpCi0JCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL25vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRMYXN0QnVuZGxlVHh0KCkgewotCQlyZXR1cm4gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXREYXRhRmlsZShMQVNUX0JVTkRMRVNfVFhUKTsKLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZUluZm9bXSBnZXRMYXN0U3RhdGUoKSB7Ci0JCUZpbGUgbGFzdEJ1bmRsZXNUeHQgPSBnZXRMYXN0QnVuZGxlVHh0KCk7Ci0JCWlmICghbGFzdEJ1bmRsZXNUeHQuaXNGaWxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQnVuZGxlSW5mb1tdKSBTaW1wbGVDb25maWd1cmF0b3JVdGlscy5yZWFkQ29uZmlndXJhdGlvbihsYXN0QnVuZGxlc1R4dC50b1VSTCgpKS50b0FycmF5KG5ldyBCdW5kbGVJbmZvWzFdKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBpbnN0YWxsQnVuZGxlcyhCdW5kbGVJbmZvW10gZmluYWxMaXN0LCBDb2xsZWN0aW9uIHRvU3RhcnQpIHsKLQkJQXJyYXlMaXN0IGluc3RhbGxlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9wcmludFN5c3RlbUJ1bmRsZSgpOwotCi0JCWJvb2xlYW4gdXNlUmVmZXJlbmNlID0gdHJ1ZTsKLQkJaWYgKG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0UHJvcGVydHkoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBST1BfS0VZX1VTRV9SRUZFUkVOQ0UpID09IG51bGwpCi0JCQl1c2VSZWZlcmVuY2UgPSB0cnVlOwotCQllbHNlCi0JCQl1c2VSZWZlcmVuY2UgPSBCb29sZWFuLnZhbHVlT2YobWFuaXB1bGF0aW5nQ29udGV4dC5nZXRQcm9wZXJ0eShTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSkpLmJvb2xlYW5WYWx1ZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmluYWxMaXN0W2ldID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvL1RPRE8gaGVyZSB3ZSBkbyBub3QgZGVhbCB3aXRoIGJ1bmRsZXMgdGhhdCBkb24ndCBoYXZlIGEgc3ltYm9saWMgaWQKLQkJCS8vVE9ETyBOZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBnZXRCdW5kbGVzIHJldHVybiBtdWx0aXBsZSB2YWx1ZQotCi0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gZmluYWxMaXN0W2ldLmdldFN5bWJvbGljTmFtZSgpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBmaW5hbExpc3RbaV0uZ2V0VmVyc2lvbigpOwotCi0JCQlpZiAoY2hlY2tNYW5pZmVzdEJlZm9yZUluc3RhbGwpIHsKLQkJCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gVXRpbHMuZ2V0T1NHaU1hbmlmZXN0KGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpKTsKLQkJCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJCQlVdGlscy5sb2coMSwgbnVsbCwgbnVsbCwgIk5vIGJ1bmRsZSBmb3VuZCBhdDogIiArIGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpLCBudWxsKTsKLQkJCQkJZmluYWxMaXN0W2ldID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy9pZiAobWFuaWZlc3QgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlzeW1ib2xpY05hbWUgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJjYW5ub3QgZ2V0IE1hbmlmZXN0IDoiICsgZmluYWxMaXN0W2ldKTsKLQkJCQkJdGhyb3cgcmU7Ci0JCQkJfQotCQkJCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCAmJiBzeW1ib2xpY05hbWUuaW5kZXhPZigiOyIpICE9IC0xKQotCQkJCQlzeW1ib2xpY05hbWUgPSBzeW1ib2xpY05hbWUuc3Vic3RyaW5nKDAsIHN5bWJvbGljTmFtZS5pbmRleE9mKCI7IikpLnRyaW0oKTsKLQotCQkJCXZlcnNpb24gPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJCX0KLQotCQkJQnVuZGxlW10gbWF0Y2hlcyA9IG51bGw7Ci0JCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKQotCQkJCW1hdGNoZXMgPSBhZG1pblNlcnZpY2UuZ2V0QnVuZGxlcyhzeW1ib2xpY05hbWUsIGdldFZlcnNpb25SYW5nZSh2ZXJzaW9uKSk7Ci0KLQkJCUJ1bmRsZSBjdXJyZW50ID0gbWF0Y2hlcyA9PSBudWxsID8gbnVsbCA6IChtYXRjaGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IG1hdGNoZXNbMF0pOwotCQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpOwotCQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAocnVubmluZ09uRXF1aW5veCAmJiB1c2VSZWZlcmVuY2UgJiYgbG9jYXRpb24uc3RhcnRzV2l0aCgiZmlsZToiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9jYXRpb24gPSAicmVmZXJlbmNlOiIgKyBsb2NhdGlvbjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vVE9ETyBOZWVkIHRvIGVsaW1pbmF0ZSBTeXN0ZW0gQnVuZGxlLgotCQkJCQkvLyBJZiBhIHN5c3RlbSBidW5kbGUgZG9lc24ndCBoYXZlIGEgU3ltYm9saWNOYW1lIGhlYWRlciwgbGlrZSBLbm9wZmxlcmZpc2ggNC4wLjAsCi0JCQkJCS8vIGl0IHdpbGwgYmUgaW5zdGFsbGVkIHVuZm9ydHVuYXRlbHkuIAotCQkJCQljdXJyZW50ID0gbWFuaXB1bGF0aW5nQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uKTsKLQkJCQkJaWYgKEFjdGl2YXRvci5ERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5zdGFsbGVkIGJ1bmRsZToiICsgZmluYWxMaXN0W2ldKTsKLQkJCQkJaW5zdGFsbGVkLmFkZChjdXJyZW50KTsKLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGluc3RhbGwgIiArIHN5bWJvbGljTmFtZSArICIvIiArIHZlcnNpb24gKyAiIGZyb20gbG9jYXRpb24gIiArIGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaW50IHN0YXJ0TGV2ZWwgPSBmaW5hbExpc3RbaV0uZ2V0U3RhcnRMZXZlbCgpOwotCQkJaWYgKHN0YXJ0TGV2ZWwgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCQlpZiAoY3VycmVudC5nZXRCdW5kbGVJZCgpICE9IDApIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBjdXJyZW50LmdldFN5bWJvbGljTmFtZSgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKHN0YXJ0TGV2ZWwgPiAwKQotCQkJCQkJCWlmICghU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlRBUkdFVF9DT05GSUdVUkFUT1JfTkFNRS5lcXVhbHMobmFtZSkpCi0JCQkJCQkJCXN0YXJ0TGV2ZWxTZXJ2aWNlLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoY3VycmVudCwgc3RhcnRMZXZlbCk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJCQkJVXRpbHMubG9nKDQsIG51bGwsIG51bGwsICJmYWlsIHRvIHNldCBzdGFydCBsZXZlbCBvZiBCdW5kbGU6IiArIGZpbmFsTGlzdFtpXSwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJaWYgKGZpbmFsTGlzdFtpXS5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQkJdG9TdGFydC5hZGQoY3VycmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbGxlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFBhY2thZ2VzKEJ1bmRsZVtdIGJ1bmRsZXMsIEJ1bmRsZUNvbnRleHQgbWFuaXB1bGF0aW5nQ29udGV4dCkgewotCQlpZiAoYnVuZGxlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWYgPSBtYW5pcHVsYXRpbmdDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW4gPSBudWxsOwotCQlpZiAocGFja2FnZUFkbWluUmVmICE9IG51bGwpIHsKLQkJCXBhY2thZ2VBZG1pbiA9IChQYWNrYWdlQWRtaW4pIG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCQkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBib29sZWFuW10gZmxhZyA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnJhbWV3b3JrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRnJhbWV3b3JrRXZlbnQuUEFDS0FHRVNfUkVGUkVTSEVEKSB7Ci0JCQkJCXN5bmNocm9uaXplZCAoZmxhZykgewotCQkJCQkJZmxhZ1swXSA9IHRydWU7Ci0JCQkJCQlmbGFnLm5vdGlmeUFsbCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQltYW5pcHVsYXRpbmdDb250ZXh0LmFkZEZyYW1ld29ya0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcGFja2FnZUFkbWluLnJlZnJlc2hQYWNrYWdlcyhidW5kbGVzKTsKLQkJc3luY2hyb25pemVkIChmbGFnKSB7Ci0JCQl3aGlsZSAoIWZsYWdbMF0pIHsKLQkJCQl0cnkgewotCQkJCQlmbGFnLndhaXQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vCQlpZiAoREVCVUcpIHsKLQkJLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKFNpbXBsZUNvbmZpZ3VyYXRvclV0aWxzLmdldEJ1bmRsZVN0YXRlU3RyaW5nKGJ1bmRsZXNbaV0pKTsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0JCW1hbmlwdWxhdGluZ0NvbnRleHQucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQltYW5pcHVsYXRpbmdDb250ZXh0LnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydEJ1bmRsZXMoQnVuZGxlW10gYnVuZGxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBidW5kbGVzW2ldOwotCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVEFSVElORyAmJiAoYnVuZGxlID09IGNhbGxpbmdCdW5kbGUgfHwgYnVuZGxlID09IG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0QnVuZGxlKCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQl0cnkgewotCQkJCWJ1bmRsZS5zdGFydCgpOwotCQkJCWlmIChBY3RpdmF0b3IuREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRlZCBCdW5kbGU6IiArIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSArICIoIiArIGJ1bmRsZS5nZXRMb2NhdGlvbigpICsgIjoiICsgYnVuZGxlLmdldEJ1bmRsZUlkKCkgKyAiKSIpOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vCQkJCUZyYW1ld29ya0xvZ0VudHJ5IGVudHJ5ID0gbmV3IEZyYW1ld29ya0xvZ0VudHJ5KEZyYW1ld29ya0FkYXB0b3IuRlJBTUVXT1JLX1NZTUJPTElDTkFNRSwgTkxTLmJpbmQoRWNsaXBzZUFkYXB0b3JNc2cuRUNMSVBTRV9TVEFSVFVQX0ZBSUxFRF9TVEFSVCwgYnVuZGxlLmdldExvY2F0aW9uKCkpLCAwLCBlLCBudWxsKTsKLQkJCQkvLwkJCQlsb2cubG9nKGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbCBidW5kbGVzIHdoaWNoIGFyZSBub3QgbGlzdGVkIG9uIGZpbmFsTGlzdC4gIAotCSAqIAotCSAqIEBwYXJhbSBmaW5hbExpc3QgYnVuZGxlcyBsaXN0IG5vdCB0byBiZSB1bmluc3RhbGxlZC4KLQkgKiBAcGFyYW0gYWRtaW5TZXJ2aWNlIHBhY2thZ2UgYWRtaW4gc2VydmljZS4KLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24gSGFzaFNldCBvZiBidW5kbGVzIGZpbmFsbHkgaW5zdGFsbGVkLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiB1bmluc3RhbGxCdW5kbGVzKEJ1bmRsZUluZm9bXSBmaW5hbExpc3QsIFBhY2thZ2VBZG1pbiBhZG1pblNlcnZpY2UpIHsKLQkJQnVuZGxlW10gYWxsQnVuZGxlcyA9IG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0QnVuZGxlcygpOwotCi0JCS8vQnVpbGQgYSBzZXQgd2l0aCBhbGwgdGhlIGJ1bmRsZXMgZnJvbSB0aGUgc3lzdGVtCi0JCVNldCByZW1vdmVkQnVuZGxlcyA9IG5ldyBIYXNoU2V0KGFsbEJ1bmRsZXMubGVuZ3RoKTsKLQkJLy8JCWNvbmZpZ3VyYXRvci5zZXRQcmVyZXF1aXNpdGVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxCdW5kbGVzW2ldLmdldEJ1bmRsZUlkKCkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCXJlbW92ZWRCdW5kbGVzLmFkZChhbGxCdW5kbGVzW2ldKTsKLQkJfQotCi0JCS8vUmVtb3ZlIGFsbCB0aGUgYnVuZGxlcyBhcHBlYXJpbmcgaW4gdGhlIGZpbmFsIGxpc3QgZnJvbSB0aGUgc2V0IG9mIGluc3RhbGxlZCBidW5kbGVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmluYWxMaXN0W2ldID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlCdW5kbGVbXSB0b0FkZCA9IGFkbWluU2VydmljZS5nZXRCdW5kbGVzKGZpbmFsTGlzdFtpXS5nZXRTeW1ib2xpY05hbWUoKSwgZ2V0VmVyc2lvblJhbmdlKGZpbmFsTGlzdFtpXS5nZXRWZXJzaW9uKCkpKTsKLQkJCWZvciAoaW50IGogPSAwOyB0b0FkZCAhPSBudWxsICYmIGogPCB0b0FkZC5sZW5ndGg7IGorKykgewotCQkJCXJlbW92ZWRCdW5kbGVzLnJlbW92ZSh0b0FkZFtqXSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkQnVuZGxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9ICgoQnVuZGxlKSBpdGVyLm5leHQoKSk7Ci0JCQkJYnVuZGxlLnVuaW5zdGFsbCgpOwotCQkJCWlmIChBY3RpdmF0b3IuREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5pbnN0YWxsZWQgQnVuZGxlOiIgKyBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkgKyAiKCIgKyBidW5kbGUuZ2V0TG9jYXRpb24oKSArICI6IiArIGJ1bmRsZS5nZXRCdW5kbGVJZCgpICsgIikiKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlZEJ1bmRsZXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblJhbmdlKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiB2ZXJzaW9uID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZCgnWycpLmFwcGVuZCh2ZXJzaW9uKS5hcHBlbmQoJywnKS5hcHBlbmQodmVyc2lvbikuYXBwZW5kKCddJykudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOGRiZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvU2ltcGxlQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5IGltcGxlbWVudHMgU2VydmljZUZhY3RvcnkgewotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIFNpbXBsZUNvbmZpZ3VyYXRvckZhY3RvcnkoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29uZmlndXJhdG9ySW1wbChjb250ZXh0LCBidW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZ2V0U2VydmljZShCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkYjdjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHMuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFNpbXBsZUNvbmZpZ3VyYXRvciBwcm92aWRlcyB3YXlzIHRvIGluc3RhbGwgYnVuZGxlcyBsaXN0ZWQgaW4gYSBmaWxlIGFjY2Vzc2libGUKLSAqIGJ5IHRoZSBzcGVjaWZpZWQgVVJMIGFuZCBleHBlY3Qgc3RhdGVzIGZvciBpdCBpbiBhZHZhbmNlIHdpdGhvdXQgYWN0dWFsIGFwcGxpY2F0aW9uLgotICogCi0gKiBJbiBldmVyeSBtZXRob2RzIG9mIFNpbXBsZUNvbmZpZ3VyYXRpb24gb2JqZWN0LAotICogIAotICogMS4gQSB2YWx1ZSB3aWxsIGJlIGdvdHRlbiBieSBAe2xpbmsgQnVuZGxlQ29udGV4dCNnZXRQcm9wZXJ0eShrZXkpIHdpdGggCi0gKiB7QGxpbmsgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzI1BST1BfS0VZX0VYQ0xVU0lWRV9JTlNUQUxMQVRJT059IGFzIGEga2V5LgotICogMi4gSWYgaXQgZXF1YWxzICJ0cnVlIiwgaXQgd2lsbCBkbyBleGNsdXNpdmUgaW5zdGFsbGF0aW9uLCB3aGljaCBtZWFucyB0aGF0IAotICogdGhlIGJ1bmRsZXMgd2lsbCBub3QgYmUgbGlzdGVkIGluIHRoZSBzcGVjaWZpZWQgdXJsIGJ1dCBpbnN0YWxsZWQgYXQgdGhlIHRpbWUKLSAqIG9mIHRoZSBtZXRob2QgY2FsbCBleGNlcHQgU3lzdGVtQnVuZGxlIHdpbGwgYmUgdW5pbnN0YWxsZWQuIE90aGVyd2lzZSwgbm8gdW5pbnN0YWxsYXRpb24gd2lsbCBub3QgYmUgZG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvckltcGwgaW1wbGVtZW50cyBDb25maWd1cmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGNvbmZpZ3VyYXRpb25VUkwgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIE9iamVjdCBjb25maWd1cmF0aW9uTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgQ29uZmlnQXBwbGllciBjb25maWdBcHBsaWVyOwotCXByaXZhdGUgQnVuZGxlIGJ1bmRsZTsKLQotCXB1YmxpYyBTaW1wbGVDb25maWd1cmF0b3JJbXBsKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgQnVuZGxlIGJ1bmRsZSkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIFVSTCBnZXRDb25maWd1cmF0aW9uVVJMKCkgewotCQlTdHJpbmcgc3BlY2lmaWVkVVJMID0gY29udGV4dC5nZXRQcm9wZXJ0eShTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuUFJPUF9LRVlfQ09ORklHVVJMKTsKLQkJaWYgKHNwZWNpZmllZFVSTCA9PSBudWxsKQotCQkJc3BlY2lmaWVkVVJMID0gImZpbGU6IiArIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5DT05GSUdVUkFUT1JfRk9MREVSICsgIi8iICsgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLkNPTkZJR19MSVNUOwotCi0JCXRyeSB7Ci0JCQkvL0lmIGl0IGlzIG5vdCBhIGZpbGUgVVJMIHVzZSBpdCBhcyBpcwotCQkJaWYgKCFzcGVjaWZpZWRVUkwuc3RhcnRzV2l0aCgiZmlsZToiKSkKLQkJCQlyZXR1cm4gbmV3IFVSTChzcGVjaWZpZWRVUkwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gaWYgaXQgaXMgYW4gYWJzb2x1dGUgZmlsZSBVUkwsIHVzZSBpdCBhcyBpcwotCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCVN0cmluZyBmaWxlID0gc3BlY2lmaWVkVVJMOwotCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXJsID0gbmV3IFVSTChmaWxlKTsKLQkJCQkJZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVybCAhPSBudWxsICYmIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCQlyZXR1cm4gdXJsOwotCi0JCQkvL2lmIGl0IGlzIGFuIHJlbGF0aXZlIGZpbGUgVVJMLCB0aGVuIHJlc29sdmUgaXQgYWdhaW5zdCB0aGUgY29uZmlndXJhdGlvbiBhcmVhCi0JCQlVUkwgY29uZmlnVVJMID0gRXF1aW5veFV0aWxzLmdldENvbmZpZ0FyZWFVUkwoY29udGV4dCk7Ci0JCQlpZiAoY29uZmlnVVJMICE9IG51bGwpIHsKLQkJCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKGNvbmZpZ1VSTC5nZXRGaWxlKCksIHVybC5nZXRGaWxlKCkpOwotCQkJCWlmICh0YXJnZXQuZXhpc3RzKCkpCi0JCQkJCXJldHVybiB0YXJnZXQudG9VUkwoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9MYXN0IHJlc29ydAotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVkVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTG9jaykgewotCQkJaWYgKEFjdGl2YXRvci5ERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFwcGx5Q29uZmlndXJhdGlvbigpIFVSTD0iICsgdXJsKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQljb25maWd1cmF0aW9uVVJMID0gdXJsOwotCi0JCQlMaXN0IGJ1bmRsZUluZm9MaXN0ID0gU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMucmVhZENvbmZpZ3VyYXRpb24odXJsKTsKLQkJCWlmIChBY3RpdmF0b3IuREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhcHBseUNvbmZpZ3VyYXRpb24oKSBidW5kbGVJbmZvTGlzdC5zaXplKCk9IiArIGJ1bmRsZUluZm9MaXN0LnNpemUoKSk7Ci0JCQlpZiAoYnVuZGxlSW5mb0xpc3Quc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKHRoaXMuY29uZmlnQXBwbGllciA9PSBudWxsKQotCQkJCWNvbmZpZ0FwcGxpZXIgPSBuZXcgQ29uZmlnQXBwbGllcihjb250ZXh0LCBidW5kbGUpOwotCQkJY29uZmlnQXBwbGllci5pbnN0YWxsKFV0aWxzLmdldEJ1bmRsZUluZm9zRnJvbUxpc3QoYnVuZGxlSW5mb0xpc3QpLCB1cmwsIGlzRXhjbHVzaXZlSW5zdGFsbGF0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhjbHVzaXZlSW5zdGFsbGF0aW9uKCkgewotCQlTdHJpbmcgdmFsdWUgPSBjb250ZXh0LmdldFByb3BlcnR5KFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl2YWx1ZSA9ICJ0cnVlIjsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHlDb25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTG9jaykgewotCQkJaWYgKGNvbmZpZ3VyYXRpb25VUkwgPT0gbnVsbCkKLQkJCQljb25maWd1cmF0aW9uVVJMID0gZ2V0Q29uZmlndXJhdGlvblVSTCgpOwotCi0JCQlhcHBseUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvblVSTCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFVybEluVXNlKCkgewotCQlzeW5jaHJvbml6ZWQgKGNvbmZpZ3VyYXRpb25Mb2NrKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvblVSTDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL2NvbnNvbGUvQXBwbHlDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9jb25zb2xlL0FwcGx5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVmMDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL2NvbnNvbGUvQXBwbHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IuY29uc29sZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZEludGVycHJldGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotLyoqCi0gKiBBbiBPU0dpIGNvbnNvbGUgY29tbWFuZCB0byBhcHBseSBhIGNvbmZpZ3VyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEFwcGx5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFVSTCBjb25maWdVUkw7Ci0JcHJpdmF0ZSBDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXI7Ci0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgQXBwbHlDb21tYW5kKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgQnVuZGxlQ29udGV4dCBjb250ZXh0LCBVUkwgY29uZmlnVVJMKSB7Ci0JCXRoaXMuaW50ZXJwcmV0ZXIgPSBpbnRlcnByZXRlcjsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5jb25maWdVUkwgPSBjb25maWdVUkw7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgYXBwbHkgY29uc29sZSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTZXJ2aWNlVHJhY2tlciB0cmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQl0cmFja2VyLm9wZW4oKTsKLQkJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChDb25maWd1cmF0b3IpIHRyYWNrZXIuZ2V0U2VydmljZSgpOwotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbmZpZ1VSTCAhPSBudWxsKQotCQkJCQljb25maWd1cmF0b3IuYXBwbHlDb25maWd1cmF0aW9uKGNvbmZpZ1VSTCk7Ci0JCQkJZWxzZQotCQkJCQljb25maWd1cmF0b3IuYXBwbHlDb25maWd1cmF0aW9uKCk7Ci0JCQkJCi0JCQkJaWYgKGNvbmZpZ3VyYXRvci5nZXRVcmxJblVzZSgpID09IG51bGwpCi0JCQkJCWludGVycHJldGVyLnByaW50bG4oIkNvbmZpZyBVUkwgbm90IHNldC4iKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpbnRlcnByZXRlci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oIk5vIGNvbmZpZ3VyYXRvciByZWdpc3RlcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cmFja2VyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvY29uc29sZS9Db25maWd1cmF0b3JDb21tYW5kUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL2NvbnNvbGUvQ29uZmlndXJhdG9yQ29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTE1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvY29uc29sZS9Db25maWd1cmF0b3JDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5jb25zb2xlOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlLkNvbW1hbmRJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlLkNvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRvckNvbW1hbmRQcm92aWRlciBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdG9yQ29tbWFuZFByb3ZpZGVyKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyBhcyBhbiBVUkwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIHN0cmluZyBjb3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gVVJMLgotCSAqLwotCXByaXZhdGUgVVJMIHRvVVJMKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgU3RyaW5nIHVybFN0cmluZykgewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVVJMIChvcHRpb25hbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBfY29uZmFwcGx5KENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgcGFyYW1ldGVyID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCVVSTCBjb25maWdVUkwgPSBudWxsOwotCQlpZiAocGFyYW1ldGVyICE9IG51bGwpCi0JCQljb25maWdVUkwgPSB0b1VSTChpbnRlcnByZXRlciwgcGFyYW1ldGVyKTsKLQotCQluZXcgQXBwbHlDb21tYW5kKGludGVycHJldGVyLCBjb250ZXh0LCBjb25maWdVUkwpLnJ1bigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscCgpIHsKLQkJU3RyaW5nQnVmZmVyIGhlbHAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIi0tLSIpOyAvLyROT04tTkxTLTEkCi0JCWhlbHAuYXBwZW5kKCJDb25maWd1cmF0b3IgQ29tbWFuZHMiKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwLmFwcGVuZCgiLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiXHRjb25mYXBwbHkgWzxjb25maWcgVVJMPl0gLSBBcHBsaWVzIGEgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBoZWxwLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvQnVuZGxlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvQnVuZGxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmVmYjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL0J1bmRsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHM7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBvZiBhIGJ1bmRsZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVJbmZvIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19MRVZFTCA9IC0xOwotCi0JcHJpdmF0ZSBTdHJpbmcgc3ltYm9saWNOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBtYXJrZWRBc1N0YXJ0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGludCBzdGFydExldmVsID0gTk9fTEVWRUw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgc3ltYm9saWMsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbG9jYXRpb24sIGludCBzdGFydExldmVsLCBib29sZWFuIHN0YXJ0ZWQpIHsKLQkJdGhpcy5zeW1ib2xpY05hbWUgPSBzeW1ib2xpYzsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQkJdGhpcy5tYXJrZWRBc1N0YXJ0ZWQgPSBzdGFydGVkOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0b0NvbXBhcmUpIHsKLQkJaWYgKHRvQ29tcGFyZSBpbnN0YW5jZW9mIEJ1bmRsZUluZm8pIHsKLQkJCUJ1bmRsZUluZm8gaW5mbyA9IChCdW5kbGVJbmZvKSB0b0NvbXBhcmU7Ci0JCQkvL2lmIChpbmZvLnN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSAmJiBpbmZvLnZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIChpbmZvLnVybCA9PSBudWxsIHx8IHVybCA9PSBudWxsID8gdHJ1ZSA6IGluZm8udXJsLmVxdWFscyh1cmwpKSkKLQkJCWlmIChpbmZvLnN5bWJvbGljTmFtZSAhPSBudWxsICYmIGluZm8udmVyc2lvbiAhPSBudWxsICYmIHN5bWJvbGljTmFtZSAhPSBudWxsICYmIHZlcnNpb24gIT0gbnVsbCkgewotCQkJCWlmIChpbmZvLnN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSAmJiBpbmZvLnZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIChpbmZvLmxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCA/IHRydWUgOiBpbmZvLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIChpbmZvLmxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCA/IGZhbHNlIDogaW5mby5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRMZXZlbCgpIHsKLQkJcmV0dXJuIHN0YXJ0TGV2ZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiBzeW1ib2xpY05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gc3ltYm9saWNOYW1lID09IG51bGwgPyAwIDogc3ltYm9saWNOYW1lLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCA9IHJlc3VsdCArICh2ZXJzaW9uID09IG51bGwgPyAwIDogdmVyc2lvbi5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcmVzdWx0ICsgKGxvY2F0aW9uID09IG51bGwgPyAwIDogbG9jYXRpb24uaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXJrZWRBc1N0YXJ0ZWQoKSB7Ci0JCXJldHVybiBtYXJrZWRBc1N0YXJ0ZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiQnVuZGxlSW5mbygiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN5bWJvbGljTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodmVyc2lvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgibG9jYXRpb249Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChsb2NhdGlvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgc3RhcnRMZXZlbD0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHN0YXJ0TGV2ZWwpOwotCQlidWZmZXIuYXBwZW5kKCIsIHRvQmVTdGFydGVkPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobWFya2VkQXNTdGFydGVkKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCByZXNvbHZlZD0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHJlc29sdmVkKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvRXF1aW5veFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9FcXVpbm94VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNjJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9FcXVpbm94VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlsczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5jb25zb2xlLkNvbmZpZ3VyYXRvckNvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlLkNvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGNsYXNzIEVxdWlub3hVdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRDb25maWdBcmVhVVJMKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbHRlciA9IGNvbnRleHQuY3JlYXRlRmlsdGVyKExvY2F0aW9uLkNPTkZJR1VSQVRJT05fRklMVEVSKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbm90IGhhcHBlbgotCQl9Ci0JCVNlcnZpY2VUcmFja2VyIGNvbmZpZ0xvY2F0aW9uVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBmaWx0ZXIsIG51bGwpOwotCQljb25maWdMb2NhdGlvblRyYWNrZXIub3BlbigpOwotCQl0cnkgewotCQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSAoTG9jYXRpb24pIGNvbmZpZ0xvY2F0aW9uVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCQlpZiAoY29uZmlnTG9jYXRpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJVVJMIGJhc2VVUkwgPSBjb25maWdMb2NhdGlvbi5nZXRVUkwoKTsKLQkJCWlmIChiYXNlVVJMICE9IG51bGwpCi0JCQkJcmV0dXJuIGJhc2VVUkw7Ci0KLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJY29uZmlnTG9jYXRpb25UcmFja2VyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0ZXJDb25zb2xlQ29tbWFuZHMoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb21tYW5kUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgQ29uZmlndXJhdG9yQ29tbWFuZFByb3ZpZGVyKGNvbnRleHQpLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzZmNjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzIHsKLQkvKioKLQkgKiBJZiBCdW5kbGVDb250ZXh0I2dldFByb3BlcnR5KFBST1BfS0VZX0VYQ0xVU0lWRV9JTlNUQUxMQVRJT04pIGVxdWFscyAidHJ1ZSIgaWdub3JpbmcgY2FzZSwgCi0JICogQ29uZmlndXJhdG9yLmFwcGx5Q29uZmlndXJhdGlvbih1cmwpIHdpbGwgdW5pbnN0YWxsIHRoZSBpbnN0YWxsZWQgYnVuZGxlcyB3aGljaCBhcmUgbm90IAotCSAqIGxpc3RlZCBpbiB0aGUgc2ltcGxlY29uZmlndXJhdG9yIGNvbmZpZyBmaWxlIGFmdGVyIGluc3RhbGwgYnVuZGxlcyBsaXN0ZWQuCi0JICogT3RoZXJ3aXNlLCBpdCBuZXZlciB1bmluc3RhbGwgYW55IGJ1bmRsZXMuIAotCSAqIAotCSAqIERlZmF1bHQ6IGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9LRVlfRVhDTFVTSVZFX0lOU1RBTExBVElPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5leGNsdXNpdmVJbnN0YWxsYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJZiBCdW5kbGVDb250ZXh0I2dldFByb3BlcnR5KFBST1BfS0VZX1VTRV9SRUZFUkVOQ0UpIGRvZXMgbm90IGVxdWFsICJmYWxzZSIgaWdub3JpbmcgY2FzZSwgCi0JICogd2hlbiBhIFNpbXBsZUNvbmZpZ3VyYXRvciBpbnN0YWxscyBhIGJ1bmRsZSwgInJlZmVyZW5jZToiIGlzIGFkZGVkIHRvIGl0cyBidW5kbGUgbG9jYXRpb24gaW4gb3JkZXIgdG8gYXZvaWQKLQkgKiBjYWNoaW5nIGl0cyBidW5kbGUgamFyLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZCBub3RoaW5nIHRvIGFueSBidW5kbGUgbG9jYXRpb24uCi0JICogCSAKLQkgKiBEZWZhdWx0OiB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci51c2VSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCdW5kbGVDb250ZXh0I2dldFByb3BlcnR5KFBST1BfS0VZX0NPTkZJR1VSTCkgaXMgdXNlZCBmb3IgU2ltcGxlQ29uZmlndXJhdG9yIHRvIGRvIGxpZmUgY3ljbGUgY29udHJvbCBvZiBidW5kbGVzLgotCSAqIFRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgcmV0dXJuZWQgdXJsIGlzIHJlYWQgYnkgU2ltcGxlQ29uZmlndXJhdG9yIGFuZCBkbyBsaWZlIGN5Y2xlIGNvbnRyb2wgYWNjb3JkaW5nIHRvIGl0LgotCSAqIElmIGltcHJvcGVyIHZhbHVlIG9yIG51bGwgaXMgcmV0dXJuZWQsIFNpbXBsZUNvbmZpZ3VyYXRvciBkb2Vzbid0IGRvIGl0LgotCSAqIAotCSAqIERlZmF1bHQ6IG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9DT05GSUdVUkwgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuY29uZmlnVXJsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0xJU1QgPSAiYnVuZGxlcy5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRPUl9GT0xERVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09ORklHVVJBVE9SX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfQkFTRVVSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5iYXNlVXJsIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzZTEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlYWRDb25maWd1cmF0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxpc3QgYnVuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKLQotCQkJU3RyaW5nIGxpbmU7Ci0JCQl0cnkgewotCQkJCVVSTCBiYXNlVXJsID0gbmV3IFVSTCh1cmwsICIuLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKChsaW5lID0gci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGludWU7Ci0JCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsvLyBzeW1ib2xpY05hbWUsdmVyc2lvbixsb2NhdGlvbixzdGFydGxldmVsLGV4cGVjdGVkU3RhdGUKLQkJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vIChleHBlY3RlZFN0YXRlIGlzIGFuIGludGVnZXIpLgotCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QQVJBTUVURVJfQkFTRVVSTCArICI9IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGJhc2VVcmxTdCA9IGxpbmUuc3Vic3RyaW5nKChTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuUEFSQU1FVEVSX0JBU0VVUkwgKyAiPSIpLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKCFiYXNlVXJsU3QuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJhc2VVcmxTdCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2VVcmwgPSBuZXcgVVJMKHVybCwgYmFzZVVybFN0KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsICIsIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoIiwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3ltYm9saWNOYW1lID0gbnVsbDsKLQkJCQkJZWxzZQotCQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0KLQkJCQkJU3RyaW5nIHZlcnNpb24gPSB0b2submV4dFRva2VuKCk7Ci0JCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiLCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl2ZXJzaW9uID0gbnVsbDsKLQkJCQkJZWxzZQotCQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0KLQkJCQkJU3RyaW5nIHVybFN0ID0gdG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAodXJsU3QuZXF1YWxzKCIsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsICYmIHZlcnNpb24gIT0gbnVsbCkKLQkJCQkJCQl1cmxTdCA9IHN5bWJvbGljTmFtZSArICJfIiArIHZlcnNpb24gKyAiLmphciI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZWxzZQotCQkJCQkJCXVybFN0ID0gbnVsbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBVUkwodXJsU3QpOwotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJdXJsU3QgPSBVdGlscy5nZXRVcmxJbkZ1bGwodXJsU3QsIGJhc2VVcmwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCX0KLQotCQkJCQlpbnQgc2wgPSBJbnRlZ2VyLnBhcnNlSW50KHRvay5uZXh0VG9rZW4oKS50cmltKCkpOwotCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQkJCQkJYm9vbGVhbiBtYXJrZWRBc1N0YXJ0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJLy8gVVJMIHVybEJ1bmRsZSA9IG51bGw7Ci0JCQkJCS8vIHRyeSB7Ci0JCQkJCS8vIHVybEJ1bmRsZSA9IG5ldyBVUkwodXJsU3QpOwotCQkJCQkvLyB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyB1cmxCdW5kbGUgPSBVdGlscy5nZXRGdWxsVXJsKHVybFN0LCBiYXNlVXJsKTsKLQkJCQkJLy8gfQotCi0JCQkJCUJ1bmRsZUluZm8gYkluZm8gPSBuZXcgQnVuZGxlSW5mbyhzeW1ib2xpY05hbWUsIHZlcnNpb24sIHVybFN0LCBzbCwgbWFya2VkQXNTdGFydGVkKTsKLQkJCQkJYnVuZGxlcy5hZGQoYkluZm8pOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyBUT0RPIGxvZyBzb21ldGhpbmcKLQkJCS8vIGJ1bmRsZUluZm9zID0gTlVMTF9CVU5ETEVJTkZPUzsKLQkJfQotCQlyZXR1cm4gYnVuZGxlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJTdHJlYW1zKElucHV0U3RyZWFtIHNvdXJjZSwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzb3VyY2UgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb3VyY2UpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSAtMTsKLQkJCQlpZiAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5yZWFkKGJ1ZmZlcikpID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU3RhdGVSZXNvbHZlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TdGF0ZVJlc29sdmVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxYjVmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TdGF0ZVJlc29sdmVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgU3RhdGVSZXNvbHZlclV0aWxzIHsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlW10gZ2V0QWRkaXRpb25hbFJlZnJlc2goQ29sbGVjdGlvbiBjdXJyZW50UmVzb2x2ZWQsIEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWYgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQnVuZGxlWzBdOwotCQlQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW4gPSAoUGxhdGZvcm1BZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZik7Ci0JCWlmIChwbGF0Zm9ybUFkbWluID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZVswXTsKLQkJdHJ5IHsKLQkJCVN0YXRlIHN0YXRlID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZShmYWxzZSk7Ci0JCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCQlIYXNoU2V0IHJlc3VsdHMgPSBuZXcgSGFzaFNldChidW5kbGVzLmxlbmd0aCk7Ci0JCQlnZXRBZGRpdGlvblJlZnJlc2goYnVuZGxlcywgc3RhdGUsIGN1cnJlbnRSZXNvbHZlZCwgcmVzdWx0cywgY29udGV4dCk7Ci0JCQlyZXR1cm4gKEJ1bmRsZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IEJ1bmRsZVtyZXN1bHRzLnNpemUoKV0pOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWRkaXRpb25SZWZyZXNoKEJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlRGVzY3JpcHRpb25zLCBTdGF0ZSBzdGF0ZSwgQ29sbGVjdGlvbiBjdXJyZW50UmVzb2x2ZWQsIFNldCByZXN1bHRzLCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJYnVuZGxlczogZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVEZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZShidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0QnVuZGxlSWQoKSk7Ci0JCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQkJY29udGludWUgYnVuZGxlczsKLQkJCS8vIGxvb2sgZm9yIGEgZnJhZ21lbnQgd2hpY2ggYWRkcyBhIGNvbmZsaWN0ZWQgY29uc3RyYWludCB0byBhbiBhbHJlYWR5IHJlc29sdmVkIGhvc3QKLQkJCWlmICghYnVuZGxlRGVzY3JpcHRpb25zW2ldLmlzUmVzb2x2ZWQoKSAmJiBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0SG9zdCgpICE9IG51bGwpIHsKLQkJCQlSZXNvbHZlckVycm9yW10gZXJyb3JzID0gc3RhdGUuZ2V0UmVzb2x2ZXJFcnJvcnMoYnVuZGxlRGVzY3JpcHRpb25zW2ldKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVycm9ycy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoKGVycm9yc1tqXS5nZXRUeXBlKCkgJiBSZXNvbHZlckVycm9yLkZSQUdNRU5UX0NPTkZMSUNUKSAhPSAwKSB7Ci0JCQkJCQlCdW5kbGVEZXNjcmlwdGlvbltdIHBvc3NpYmxlSG9zdHMgPSBzdGF0ZS5nZXRCdW5kbGVzKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRIb3N0KCkuZ2V0TmFtZSgpKTsKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcG9zc2libGVIb3N0cy5sZW5ndGg7IGsrKykgewotCQkJCQkJCUJ1bmRsZSBob3N0QnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUocG9zc2libGVIb3N0c1trXS5nZXRCdW5kbGVJZCgpKTsKLQkJCQkJCQlpZiAoaG9zdEJ1bmRsZSAhPSBudWxsICYmIGN1cnJlbnRSZXNvbHZlZC5jb250YWlucyhob3N0QnVuZGxlKSAmJiBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0SG9zdCgpLmlzU2F0aXNmaWVkQnkocG9zc2libGVIb3N0c1trXSkpCi0JCQkJCQkJCXJlc3VsdHMuYWRkKGhvc3RCdW5kbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNvbnRpbnVlIGJ1bmRsZXM7Ci0JCQl9Ci0JCQlpZiAoIWN1cnJlbnRSZXNvbHZlZC5jb250YWlucyhidW5kbGUpIHx8ICFidW5kbGVEZXNjcmlwdGlvbnNbaV0uaXNSZXNvbHZlZCgpKQotCQkJCWNvbnRpbnVlIGJ1bmRsZXM7Ci0JCQkvLyBsb29rIGZvciBvcHRpb25hbCBpbXBvcnRzIHdoaWNoIGFyZSB1bnJlc29sdmVkIGJ1dCBhcmUgcmVzb2x2YWJsZQotCQkJSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb25bXSBpbXBvcnRzID0gYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldEltcG9ydFBhY2thZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGltcG9ydHMubGVuZ3RoOyBqKyspCi0JCQkJaWYgKEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uLlJFU09MVVRJT05fT1BUSU9OQUwuZXF1YWxzKGltcG9ydHNbal0uZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSkpICYmICFpbXBvcnRzW2pdLmlzUmVzb2x2ZWQoKSAmJiBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmlzUmVzb2x2YWJsZShpbXBvcnRzW2pdKSkgewotCQkJCQlyZXN1bHRzLmFkZChidW5kbGUpOwotCQkJCQljb250aW51ZSBidW5kbGVzOwotCQkJCX0KLQkJCS8vIGxvb2sgZm9yIG9wdGlvbmFsIHJlcXVpcmVzIHdoaWNoIGFyZSB1bnJlc29sdmVkIGJ1dCBhcmUgcmVzb2x2YWJsZQotCQkJQnVuZGxlU3BlY2lmaWNhdGlvbltdIHJlcXVpcmVzID0gYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldFJlcXVpcmVkQnVuZGxlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXF1aXJlcy5sZW5ndGg7IGorKykKLQkJCQlpZiAocmVxdWlyZXNbal0uaXNPcHRpb25hbCgpICYmICFyZXF1aXJlc1tqXS5pc1Jlc29sdmVkKCkgJiYgc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5pc1Jlc29sdmFibGUocmVxdWlyZXNbal0pKSB7Ci0JCQkJCXJlc3VsdHMuYWRkKGJ1bmRsZSk7Ci0JCQkJCWNvbnRpbnVlIGJ1bmRsZXM7Ci0JCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDBlZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IuQWN0aXZhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIAotICogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscyBwYWNrYWdlIG9mCi0gKiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIHBsdWdpbiBvbiBNYXJjaCAzIDIwMDcuCi0gKiAKLSAqIFRoZSByZWFzb24gd2h5IGl0IHdhcyBjb3BpZWQgaXMgdG8gbWFrZSBzaW1wbGVjb25maWd1cmF0b3IgZGVwZW5kZW50IG9uIAotICogYW55IGJ1bmRsZXMob3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmspLgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFV0aWxzIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFUSF9TRVAgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgVVJMIGNoZWNrRnVsbFVybChVUkwgdXJsLCBTdHJpbmcgdXJsTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlpZiAodXJsID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiIGlzIG51bGwiKTsKLQkJaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lbmRzV2l0aCgiZmlsZSIpKQotCQkJcmV0dXJuIHVybDsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiKCIgKyB1cmwgKyAiKSBkb2VzIG5vdCBoYXZlIGFic29sdXRlIHBhdGgiKTsKLQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChQQVRIX1NFUCkpCi0JCQlyZXR1cm4gdXJsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFVybCgiZmlsZSIsIG51bGwsIFBBVEhfU0VQICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVybE5hbWUgKyAiKCIgKyAiZmlsZToiICsgUEFUSF9TRVAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIikgaXMgbm90IGZ1bGx5IHF1YWxsaWZpZWQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJaWYgKCFmaWxlLmRlbGV0ZSgpKQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbCB0byBkZWxldGUgRmlsZSgiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIpIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJZGVsZXRlRGlyKGNoaWxkcmVuW2ldKTsKLQkJfQotCQlpZiAoIWZpbGUuZGVsZXRlKCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWwgdG8gZGVsZXRlIERpcigiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIpIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUluZm9bXSBnZXRCdW5kbGVJbmZvc0Zyb21MaXN0KExpc3QgbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVJbmZvWzBdOwotCQlCdW5kbGVJbmZvW10gcmV0ID0gbmV3IEJ1bmRsZUluZm9bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpY3Rpb25hcnkgZ2V0T1NHaU1hbmlmZXN0KFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiZmlsZToiKSAmJiAhbG9jYXRpb24uZW5kc1dpdGgoIi5qYXIiKSkKLQkJCXJldHVybiBiYXNpY0xvYWRNYW5pZmVzdChuZXcgRmlsZShsb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSkpKTsKLQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoImphcjoiICsgbG9jYXRpb24gKyAiIS8iKTsKLQkJCUphclVSTENvbm5lY3Rpb24gamFyQ29ubmVjdGlvbiA9IChKYXJVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gamFyQ29ubmVjdGlvbi5nZXRNYW5pZmVzdCgpOwotCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJCUhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZSA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQotCQkJCVN0cmluZyBrZXkgPSBpdGUubmV4dCgpLnRvU3RyaW5nKCk7Ci0JCQkJLy8gV2hpbGUgdGFibGUgY29udGFpbnMgbm9uIE9TR2lNYW5pZmVzdCwgaXQgZG9lc24ndCBtYXR0ZXIuCi0JCQkJdGFibGUucHV0KGtleSwgYXR0cmlidXRlcy5nZXRWYWx1ZShrZXkpKTsKLQkJCX0KLQkJCXJldHVybiB0YWJsZTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQlpZiAoQWN0aXZhdG9yLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJsb2NhdGlvbj0iICsgbG9jYXRpb24pOwotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoQWN0aXZhdG9yLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJsb2NhdGlvbj0iICsgbG9jYXRpb24pOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy9SZXR1cm4gYSBkaWN0aW9uYXJ5IHJlcHJlc2VudGluZyBhIG1hbmlmZXN0LiBUaGUgZGF0YSBtYXkgcmVzdWx0IGZyb20gcGx1Z2luLnhtbCBjb252ZXJzaW9uICAKLQlwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5IGJhc2ljTG9hZE1hbmlmZXN0KEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJSW5wdXRTdHJlYW0gbWFuaWZlc3RTdHJlYW0gPSBudWxsOwotCQlaaXBGaWxlIGphckZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGZpbGVFeHRlbnRpb24gPSBidW5kbGVMb2NhdGlvbi5nZXROYW1lKCk7Ci0JCQlmaWxlRXh0ZW50aW9uID0gZmlsZUV4dGVudGlvbi5zdWJzdHJpbmcoZmlsZUV4dGVudGlvbi5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShmaWxlRXh0ZW50aW9uKSAmJiBidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JCQkJWmlwRW50cnkgbWFuaWZlc3RFbnRyeSA9IGphckZpbGUuZ2V0RW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKLQkJCQlpZiAobWFuaWZlc3RFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCW1hbmlmZXN0U3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShtYW5pZmVzdEVudHJ5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1hbmlmZXN0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgSmFyRmlsZS5NQU5JRkVTVF9OQU1FKSkpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JCURpY3Rpb25hcnkgbWFuaWZlc3QgPSBudWxsOwotCi0JCS8vSXQgaXMgbm90IGEgbWFuaWZlc3QsIGJ1dCBhIHBsdWdpbiBvciBhIGZyYWdtZW50Ci0KLQkJaWYgKG1hbmlmZXN0U3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3QgbSA9IG5ldyBNYW5pZmVzdChtYW5pZmVzdFN0cmVhbSk7Ci0JCQkJbWFuaWZlc3QgPSBtYW5pZmVzdFRvUHJvcGVydGllcyhtLmdldE1haW5BdHRyaWJ1dGVzKCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCW1hbmlmZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJCWphckZpbGUuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBtYW5pZmVzdFRvUHJvcGVydGllcyhBdHRyaWJ1dGVzIGQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZXMuTmFtZSBrZXkgPSAoQXR0cmlidXRlcy5OYW1lKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdC5wdXQoa2V5LnRvU3RyaW5nKCksIGQuZ2V0KGtleSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0VXJsKFN0cmluZyBwcm90b2NvbCwgU3RyaW5nIGhvc3QsIFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsvLyB0aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlmaWxlID0gVXRpbHMucmVwbGFjZUFsbChmaWxlLCBGaWxlLnNlcGFyYXRvciwgIi8iKTsKLQkJcmV0dXJuIG5ldyBVUkwocHJvdG9jb2wsIGhvc3QsIGZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVybEluRnVsbChTdHJpbmcgcGF0aCwgVVJMIGZyb20pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJVXRpbHMuY2hlY2tGdWxsVXJsKGZyb20sICJmcm9tIik7Ci0JCXBhdGggPSBVdGlscy5yZXBsYWNlQWxsKHBhdGgsIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCQlTdHJpbmcgZnJvbVN0ID0gVXRpbHMucmVtb3ZlTGFzdENoKGZyb20udG9FeHRlcm5hbEZvcm0oKSwgJy8nKTsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0ID0gZnJvbS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gbmV3IFVSTChmcm9tU3Quc3Vic3RyaW5nKDAsIGZyb21TdC5sYXN0SW5kZXhPZihmaWxlU3QpIC0gMSkgKyBwYXRoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVSTChmcm9tU3QgKyAiLyIgKyBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMYXN0Q2goU3RyaW5nIHRhcmdldCwgY2hhciBjaCkgewotCQl3aGlsZSAodGFyZ2V0LmNoYXJBdCh0YXJnZXQubGVuZ3RoKCkgLSAxKSA9PSBjaCkgewotCQkJdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cmluZygwLCB0YXJnZXQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBbGwoU3RyaW5nIHN0LCBTdHJpbmcgb2xkU3QsIFN0cmluZyBuZXdTdCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQkJd2hpbGUgKChpbmRleCA9IHN0LmluZGV4T2Yob2xkU3QpKSAhPSAtMSkgewotCQkJc3QgPSBzdC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3U3QgKyBzdC5zdWJzdHJpbmcoaW5kZXggKyBvbGRTdC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nIG1zZyA9ICIiOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQltc2cgPSAiKCIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKSI7Ci0JCX0gZWxzZSBpZiAob2JqID09IG51bGwpCi0JCQltc2cgPSAiWyIgKyBtZXRob2QgKyAiXSIgKyBtZXNzYWdlOwotCQllbHNlCi0JCQltc2cgPSAiWyIgKyBtZXRob2QgKyAiXSgiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIikiOwotCQltc2cgKz0gbWVzc2FnZTsKLQotLy8JCWlmIChMb2dTZXJ2aWNlIGxvZ1NlcnZpY2UgPSBBY3RpdmF0b3IuZ2V0TG9nU2VydmljZSgpOwotLy8JCWlmIChsb2dTZXJ2aWNlICE9IG51bGwpIHsKLS8vCQkJbG9nU2VydmljZS5sb2cobGV2ZWwsIG1zZywgZSk7Ci0vLwkJfSBlbHNlIHsKLQkJU3RyaW5nIGxldmVsU3QgPSBudWxsOwotCQlpZiAobGV2ZWwgPT0gMSkKLQkJCWxldmVsU3QgPSAiREVCVUciOwotCQllbHNlIGlmIChsZXZlbCA9PSAyKQotCQkJbGV2ZWxTdCA9ICJJTkZPIjsKLQkJZWxzZSBpZiAobGV2ZWwgPT0gMykKLQkJCWxldmVsU3QgPSAiV0FSTklORyI7Ci0JCWVsc2UgaWYgKGxldmVsID09IDQpIHsKLQkJCWxldmVsU3QgPSAiRVJST1IiOwotLy8JCQkJdXNlTG9nID0gdHJ1ZTsKLQkJfQotLy8JCQlpZiAodXNlTG9nKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiWyIgKyBsZXZlbFN0ICsgIl0iICsgbXNnKTsKLQkJaWYgKGUgIT0gbnVsbCkKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzgzMTUxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9IT1cgVE8gUlVOLnR4dCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL0hPVyBUTyBSVU4udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGIwMjZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL0hPVyBUTyBSVU4udHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3hfUHJvdmlzaW9uaW5nX0dldHRpbmdfU3RhcnRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL1Byb3Zpc2lvbmluZyBiYXNlLnRhcmdldCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL1Byb3Zpc2lvbmluZyBiYXNlLnRhcmdldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMDFhYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9Qcm92aXNpb25pbmcgYmFzZS50YXJnZXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4yIj8+Ci0KLTx0YXJnZXQgbmFtZT0iUHJvdmlzaW9uaW5nIGJhc2UiPgotCi0gICA8bG9jYXRpb24gcGF0aD0iZDpcdGFyZ2V0c1xwcm92aXNpb25pbmctYmFzZSIvPgotCi0gICA8Y29udGVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIi8+Ci0gICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5qdW5pdCIvPgotICAgICAgPC9wbHVnaW5zPgotICAgICAgPGZlYXR1cmVzPgotICAgICAgPC9mZWF0dXJlcz4KLSAgICAgIDxleHRyYUxvY2F0aW9ucz4KLSAgICAgICAgIDxsb2NhdGlvbiBwYXRoPSJEOlx0YXJnZXRzXGVxdWlub3hcZWNsaXBzZSIvPgotICAgICAgPC9leHRyYUxvY2F0aW9ucz4KLSAgIDwvY29udGVudD4KLQotPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZWFlZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhlNzhlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNmJmOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJFcXVpbm94IFByb3Zpc2lvbmluZyBBZ2VudCBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGoucGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbXBhdGliaWxpdHkuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbXBhdGliaWxpdHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZDk0YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb21wYXRpYmlsaXR5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbXBhdGliaWxpdHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbXBhdGliaWxpdHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29tcGF0aWJpbGl0eS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGU3OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29tcGF0aWJpbGl0eS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29tcGF0aWJpbGl0eS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29tcGF0aWJpbGl0eS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM4MjdhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbXBhdGliaWxpdHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29tcGF0aWJpbGl0eS5mZWF0dXJlIgotICAgICAgbGFiZWw9InAyIENvbXBhdGliaWxpdHkgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGVzY3JpcHRpb24iPgotICAgICAgW0VudGVyIEZlYXR1cmUgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jb3B5cmlnaHQiPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGljZW5zZSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNmNWUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGU3OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Y4ZDU2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVxdWlub3ggUHJvdmlzaW9uaW5nIERpcmVjdG9yIEFwcGxpY2F0aW9uIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5zYXQ0ai5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLnBiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYyMTQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQxZWQxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbAotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1jdXN0b21CdWlsZENhbGxiYWNrcy5pbmhlcml0YWxsPXRydWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0Y2MxOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSB0aGUgZGlyZWN0b3J5IHBsdWdpbnMgd2lsbCBiZSBjb2xsZWN0ZWQgdG8gLS0+Ci0JPCEtLSAgZmVhdHVyZS5kaXJlY3RvcnkgLSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHJlc3VsdGluZyBmZWF0dXJlICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSB0aGUgZGlyZWN0b3J5IHBsdWdpbnMgd2lsbCBiZSBjb2xsZWN0ZWQgdG8gLS0+Ci0JPCEtLSAgZmVhdHVyZS5kaXJlY3RvcnkgLSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHJlc3VsdGluZyBmZWF0dXJlICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8IS0tIGxvYWQgdGhlIHByb3BlcnRpZXMgZmlsZSB0byBnZXQgdGhlIGJ1bmRsZSB2ZXJzaW9ucyAtLT4KLQkJPHByb3BlcnR5IGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L2ZpbmFsUGx1Z2luc1ZlcnNpb25zLnByb3BlcnRpZXMiLz4KLQkJPCEtLSB6aXAgdXAgdGhlIHNpbXBsZS5jb25maWd1cmF0b3IgaW50byB0aGUgZ2VuZXJhdG9yIGJ1bmRsZSAtLT4KLQkJPHppcCAKLQkJCWJhc2VkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yXyR7b3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3J9IgotCQkJZGVzdGZpbGU9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yXyR7b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3J9L29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciI+Ci0JCTwvemlwPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDFiNzg1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iRXF1aW5veCBQcm92aXNpb25pbmcgR2VuZXJhdG9yIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5zYXQ0ai5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLnBiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZy5mZWF0dXJlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3RpbmcuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMDBjOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3RpbmcuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3RpbmcuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhlNzhlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3RpbmcuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZjUxOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3RpbmcuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJFcXVpbm94IFByb3Zpc2lvbmluZyBTZWxmLWhvc3RpbmcgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGVzY3JpcHRpb24iPgotICAgICAgW0VudGVyIEZlYXR1cmUgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jb3B5cmlnaHQiPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGljZW5zZSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGoucGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwNjkwYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGU3OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNlZDFmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJFcXVpbm94IFByb3Zpc2lvbmluZyBVc2VyIFVJIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGoucGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5zZGsvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMDY5MGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLnNkay9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTdhMTcxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxsaWNlbnNlLmh0bWwsZXBsLXYxMC5odG1sCi1zcmMuaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLnNkay9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLnNkay9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5zZGsvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5zZGsvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDAyNzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLnNkayIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy40Ii8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Iuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Iuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLnNkay9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjZjA2My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzYjRlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTAxY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RXF1aW5veCBQcm92aXNpb25pbmcgUGxhdGZvcm0KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBQcm92aXNpb25pbmcgUGxhdGZvcm0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmYTRlNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjQiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGouY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5zYXQ0ai5wYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4NDE3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NzBlNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFAyIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249Q29tbW9uIE9TLWluZGVwZW5kZW50IEFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvcHJvamVjdFNldC1leHRzc2gucHNmIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvcHJvamVjdFNldC1leHRzc2gucHNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg4NzBjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQtZXh0c3NoLnBzZgorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPHBzZiB2ZXJzaW9uPSIyLjAiPgotPHByb3ZpZGVyIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLmN2c25hdHVyZSI+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZixvcmcuZWNsaXBzZS5lY2YiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksb3JnLmVjbGlwc2UuZWNmL3BsdWdpbnMvb3JnLmVjbGlwc2UuZWNmLmNvcmUuaWRlbnRpdHksb3JnLmVjbGlwc2UuZWNmLmNvcmUuaWRlbnRpdHkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksb3JnLmVjbGlwc2UuZWNmL3BsdWdpbnMvb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nLG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbixvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scyxvcmcuZWNsaXBzZS5vcmJpdC9vcmcuYXBhY2hlLnhlcmNlcyxvcmcuYXBhY2hlLnhlcmNlcyx2Ml84XzAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5hcGFjaGUueG1sLnJlc29sdmVyLG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLHYxXzFfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZixpZS53b21iYXQuamJkaWZmIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QsaWUud29tYmF0LmpiZGlmZi50ZXN0Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLnNhdDRqLmNvcmUsb3JnLnNhdDRqLmNvcmVfdjIuMC4wLHYyXzBfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLnNhdDRqLnBiLG9yZy5zYXQ0ai5wYl92Mi4wLjAsdjJfMF8wIi8+Ci08L3Byb3ZpZGVyPgotPC9wc2Y+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9wcm9qZWN0U2V0LnBzZiBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQucHNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE5YmVhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQucHNmCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08cHNmIHZlcnNpb249IjIuMCI+Ci08cHJvdmlkZXIgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlIj4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZixvcmcuZWNsaXBzZS5lY2YiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5jb3JlLmlkZW50aXR5LG9yZy5lY2xpcHNlLmVjZi5jb3JlLmlkZW50aXR5Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSxvcmcuZWNsaXBzZS5lY2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3Rpbmcsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Asb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYsaWUud29tYmF0LmpiZGlmZiIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdCxpZS53b21iYXQuamJkaWZmLnRlc3QiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5hcGFjaGUueGVyY2VzLG9yZy5hcGFjaGUueGVyY2VzLHYyXzhfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5hcGFjaGUueG1sLnJlc29sdmVyLG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLHYxXzFfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5zYXQ0ai5jb3JlLG9yZy5zYXQ0ai5jb3JlX3YyLjAuMCx2Ml8wXzAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scyxvcmcuZWNsaXBzZS5vcmJpdC9vcmcuc2F0NGoucGIsb3JnLnNhdDRqLnBiX3YyLjAuMCx2Ml8wXzAiLz4KLTwvcHJvdmlkZXI+Ci08L3BzZj4K